https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126833

            Bug ID: 126833
           Summary: false -Wanalyzer-undefined-behavior-ptrdiff on
                    linker-defined symbol pairs
           Product: gcc
           Version: 17.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: analyzer
          Assignee: dmalcolm at gcc dot gnu.org
          Reporter: dmalcolm at gcc dot gnu.org
            Blocks: 126830
  Target Milestone: ---

All -Wanalyzer-undefined-behavior-ptrdiff FPs in the August 2026 OpenScanHub
mass scan of Fedora 45 (PR 126830) involve extern array/symbol declarations
that are placed contiguously by the linker.  The subtraction is well-defined in
practice but the analyzer treats them as distinct C objects.

All 10 instances of this are from the kernel package (100% of
-Wanalyzer-undefined-behavior-ptrdiff FPs in the scan).


Three sub-patterns:
(A) __start_X / __stop_X section boundary pairs (linker auto-generated)
(B) Classic linker boundary symbols (_text/_end, _bss/_ebss)
(C) Assembly labels declared as functions, address-subtracted

$ cat t.c
typedef __SIZE_TYPE__ size_t;
extern void *memset(void *, int, size_t);

/* Sub-pattern A */
struct kernel_param { int x; };
extern struct kernel_param __start___param[];
extern struct kernel_param __stop___param[];

long count_params(void) {
    return __stop___param - __start___param; /* bogus ptrdiff warning */
}

/* Sub-pattern B */
extern char _bss[];
extern char _ebss[];

void clear_bss(void) {
    memset(_bss, 0, _ebss - _bss); /* bogus ptrdiff warning */
}

/* Sub-pattern C */
extern void trampoline_start(void);
extern void trampoline_end(void);

long trampoline_size(void) {
    return (char *)&trampoline_end - (char *)&trampoline_start; /* bogus */
}

$ gcc -fanalyzer -c t.c
t.c:10:12: warning: undefined behavior when subtracting pointers
[-Wanalyzer-undefined-behavior-ptrdiff]
t.c:18:23: warning: undefined behavior when subtracting pointers
[-Wanalyzer-undefined-behavior-ptrdiff]
t.c:25:12: warning: undefined behavior when subtracting pointers
[-Wanalyzer-undefined-behavior-ptrdiff]

Trunk: https://godbolt.org/z/zjcTYbKha

We can probably come up with some kind of heuristic to suppress these.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126830
[Bug 126830] Tracker bug for -fanalyzer false positives seen in August 2026
OpenScanHub mass scan

Reply via email to