https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93977
Bug ID: 93977
Summary: missing -Wrestrict with sprintf with same format as
destination
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
-Wrestrict correctly detects the overlap in g() below but misses the trivial
overlap in h():
$ cat t.c && gcc -O2 -S -Wall t.c
void f (void*);
void g (void)
{
char a[] = "%s abc";
__builtin_sprintf (a, "%s abc", a); // -Wrestrict (good)
f (a);
}
void h (void)
{
char a[] = "%s abc";
__builtin_sprintf (a, a, a); // missing warning
f (a);
}
t.c: In function ‘g’:
t.c:6:29: warning: ‘ abc’ directive writing 4 bytes into a region of size 1
[-Wformat-overflow=]
6 | __builtin_sprintf (a, "%s abc", a); // -Wrestrict (good)
| ~^~~
t.c:6:3: note: ‘__builtin_sprintf’ output 11 bytes into a destination of size 7
6 | __builtin_sprintf (a, "%s abc", a); // -Wrestrict (good)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
t.c:6:3: warning: ‘__builtin_sprintf’ argument 3 overlaps destination object
‘a’ [-Wrestrict]
t.c:5:8: note: destination object referenced by ‘restrict’-qualified argument 1
was declared here
5 | char a[] = "%s abc";
| ^