https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92942
Bug ID: 92942 Summary: missing -Wstringop-overflow for allocations with a negative lower bound size Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- In LP64, only the buffer overflow in f() below is diagnosed. The one in g() is not because n is determined to be in the anti-range ~[4, 18446744071562067967], i.e., the size of the object is considered to be between [0, 4] and [INT_MAX, SIZE_MAX]. (In ILP32 both calls are diagnosed). The warning should try to determine the type of the argument to malloc() and if it's signed, assume it's not negative. $ cat a.c && gcc -D_FORTIFY_SOURCE=2 -O2 -S -Wall a.c #include <stdlib.h> #include <string.h> void* f (unsigned n) { if (3 < n) n = 3; void *p = malloc (n); strcpy (p, "12345"); // buffer overflow detected return p; } void* g (int n) { if (3 < n) n = 3; void *p = malloc (n); strcpy (p, "12345"); // buffer overflow not detected return p; } In file included from /usr/include/string.h:494, from a.c:2: In function ‘strcpy’, inlined from ‘f’ at a.c:10:3: /usr/include/bits/string_fortified.h:90:10: warning: ‘__builtin_memcpy’ writing 6 bytes into a region of size between 0 and 3 [-Wstringop-overflow=] 90 | return __builtin___strcpy_chk (__dest, __src, __bos (__dest)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ a.c: In function ‘f’: a.c:9:13: note: at offset 0 to an object with size at most 3 allocated by ‘malloc’ here 9 | void *p = malloc (n); | ^~~~~~~~~~