https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88991
Bug ID: 88991
Summary: missing warning on a strcpy and strlen from a
zero-length array
Product: gcc
Version: 9.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: ---
GCC diagnoses the undefined behavior in function f() in the test case below but
fails to diagnose the same bug in g() or h().
However, the warning issued for f() should be (also) for the call to strlen(s)
which is also undefined. Worse, in g() neither the call to strlen(s) nor
memcpy() is diagnosed.
$ cat t.c && gcc -O2 -S -Wall t.c
void f (char *d)
{
__builtin_memcpy (d, s, __builtin_strlen (s) + 1);
}
void g (char *d)
{
unsigned n = __builtin_strlen (s) + 1; // missing warning
__builtin_memcpy (d, s, n); // same here
}
void h (char *d)
{
__builtin_strcpy (d, s); // missing warning here too
}
t.c: In function ‘f’:
t.c:5:3: warning: ‘__builtin_memcpy’ forming offset [1, 9223372036854775805] is
out of the bounds [0, 0] of object ‘s’ with type ‘const char[]’
[-Warray-bounds]
5 | __builtin_memcpy (d, s, __builtin_strlen (s) + 1);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.c:1:12: note: ‘s’ declared here
1 | const char s[0] = { };
| ^