https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93514
Bug ID: 93514 Summary: missing warning on a strlen with a negative or just past-the-end offset 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: --- Of the three calls with invalid arguments in the test case below only the last one is diagnosed. The negative offset isn't diagnosed because it points to ax2.i, so it's in bounds of ax2. The offset +3 isn't diagnosed because the pointer is valid (though just past the end) and the warning code in tree-vrp.c doesn't consider how it's being used. $ cat u.c && gcc -O2 -S -Wall -Wextra u.c struct Ax { char i, a[]; }; static struct Ax ax2 = { 2, { 2, 1, 0 } }; void sink (int); void f (void) { sink (__builtin_strlen (ax2.a - 1)); // { dg-warning "\\\[-Warray-bounds" } sink (__builtin_strlen (ax2.a)); sink (__builtin_strlen (ax2.a + 1)); sink (__builtin_strlen (ax2.a + 2)); sink (__builtin_strlen (ax2.a + 3)); // { dg-warning "\\\[-Warray-bounds" } sink (__builtin_strlen (ax2.a + 4)); // { dg-warning "\\\[-Warray-bounds" } } u.c: In function ‘f’: u.c:14:9: warning: array subscript 5 is outside array bounds of ‘struct Ax[1]’ [-Warray-bounds] 14 | sink (__builtin_strlen (ax2.a + 4)); // { dg-warning "\\\[-Warray-bounds" } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ u.c:3:18: note: while referencing ‘ax2’ 3 | static struct Ax ax2 = { 2, { 2, 1, 0 } }; | ^~~