https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83701
Bug ID: 83701
Summary: missing -Wrestrict on strcat to an array depending on
offset
Product: gcc
Version: 8.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: ---
Calling strcat to append to the same string as the source always overlaps
exactly 1 byte: the terminating NUL. This is true regardless of the source and
destination offsets. The test case below shows that the -Wrestict warning
doesn't detect this problem with complete consistency.
$ cat b.c && gcc -O2 -S -Wall b.c
extern char* stpcpy (char*, const char*);
extern char* strcat (char*, const char*);
extern char* strcpy (char*, const char*);
void f1 (char *d)
{
strcpy (d, "01234");
strcat (d + 2, d + 1); // -Wrestrict (good)
}
void f2 (char *d)
{
strcpy (d, "12345");
strcat (d + 2, d + 1); // -Wrestrict (good)
}
extern char d[];
void f3 (void)
{
strcpy (d, "23456");
strcat (d + 2, d + 1); // missing -Wrestrict
}
void f4 (void)
{
strcpy (d, "34567");
strcat (d + 2, d + 1); // missing -Wrestrict
}
void f5 (void)
{
strcpy (d, "23456");
strcat (d + 1, d + 2); // -Wrestrict (good)
}
b.c: In function ‘f1’:
b.c:8:3: warning: ‘strcat’ accessing 5 bytes at offsets 2 and 1 overlaps 1 byte
at offset 5 [-Wrestrict]
strcat (d + 2, d + 1); // -Wrestrict (good)
^~~~~~~~~~~~~~~~~~~~~
b.c: In function ‘f2’:
b.c:14:3: warning: ‘strcat’ accessing 5 bytes at offsets 2 and 1 overlaps 1
byte at offset 5 [-Wrestrict]
strcat (d + 2, d + 1); // -Wrestrict (good)
^~~~~~~~~~~~~~~~~~~~~
b.c: In function ‘f5’:
b.c:35:3: warning: ‘strcat’ accessing 4 bytes at offsets 1 and 2 overlaps 1
byte at offset 5 [-Wrestrict]
strcat (d + 1, d + 2); // -Wrestrict (good)
^~~~~~~~~~~~~~~~~~~~~