https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110878
Bug ID: 110878 Summary: -Wstringop-overread incorrectly warns about arguments to functions with static array parameter declarations Product: gcc Version: 13.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: campbell+gcc-bugzilla at mumble dot net Target Milestone: --- Isolated from code passing a pointer into an array and the length of the array as separate arguments, where each function has the minimum length of the array encoded in its parameter declaration, and uses runtime conditionals to guarantee the minimum is met: // bar(p, n) may access p[0], p[1], ..., p[n-1], and requires n >= 128 void bar(unsigned char[static 128], unsigned); // foo(p, n) may access p[0], p[1], ..., p[n-1], and requires n >= 16 void foo(unsigned char p[static 16], unsigned n) { if (n % 128) n -= n % 128; if (n) bar(p, n); } <source>: In function 'foo': <source>:12:17: error: 'bar' accessing 128 bytes in a region of size 16 [-Werror=stringop-overflow=] 12 | bar(p, n); | ^~~~~~~~~ <source>:12:17: note: referencing argument 1 of type 'unsigned char[128]' <source>:2:6: note: in a call to function 'bar' 2 | void bar(unsigned char[static 128], unsigned n); | ^~~ cc1: all warnings being treated as errors Compiler returned: 1 Reproduced in GCC 10.5, 11.4, and 12.3. Not reproduced in any earlier versions of GCC. Using `if (n >= 128)' doesn't change anything, presumably because GCC doesn't know the connection between p and n.