https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81345
Bug ID: 81345 Summary: -Wall resets -Wstringop-overflow to 1 from the default 2 Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: driver Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- While debugging some new tests of mine I noticed that the warn_stringop_overflow variable corresponding to the -Wstringop-overflow option documented to default to 2 is actually set to 1 in the compiler when -Wall alone is used. That's wrong and it prevents the option from diagnosing a bunch of instances of buffer overflow such as those where the destination is a member array as in the test case below. The option does appear to be set to 2 in c-family/c.opt as shown below so something isn't working correctly there: Wstringop-overflow C ObjC C++ ObjC++ Warning Alias(Wstringop-overflow=, 2, 0) ... Wstringop-overflow= C ObjC C++ ObjC++ Joined RejectNegative UInteger Var(warn_stringop_overflow) Init(2) Warning LangEnabledBy(C ObjC C++ ObjC++, Wall) IntegerRange(0, 4) The script below shows that when GCC is invoked with no warning options, both instances of the warning are diagnosed as expected (that also implies that the default -Wstringop-overflow=2 is in effect). The same happens when -Wstringop-overflow is on the command line. But when -Wall is on the command line alone, only one warning is issued because -Wstringop-overflow has been reset to 1. $ (set -x && cat t.c && for w in '' -Wstringop-overflow '-Wall'; do /ssd/build/gcc-git/gcc/xgcc -B /ssd/build/gcc-git/gcc -O2 -S $w t.c; done)+ cat t.c char a[3]; void f (const char *s) { __builtin_strncpy (a, s, sizeof a + 1); } struct S { char a[3]; int i; }; void g (struct S *d, const char *s) { __builtin_strncpy (d->a, s, sizeof d->a + 1); } + for w in ''\'''\''' -Wstringop-overflow ''\''-Wall'\''' + /ssd/build/gcc-git/gcc/xgcc -B /ssd/build/gcc-git/gcc -O2 -S t.c t.c: In function ‘f’: t.c:5:3: warning: ‘__builtin_strncpy’ writing 4 bytes into a region of size 3 overflows the destination [-Wstringop-overflow=] __builtin_strncpy (a, s, sizeof a + 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ t.c: In function ‘g’: t.c:12:3: warning: ‘__builtin_strncpy’ writing 4 bytes into a region of size 3 overflows the destination [-Wstringop-overflow=] __builtin_strncpy (d->a, s, sizeof d->a + 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + for w in ''\'''\''' -Wstringop-overflow ''\''-Wall'\''' + /ssd/build/gcc-git/gcc/xgcc -B /ssd/build/gcc-git/gcc -O2 -S -Wstringop-overflow t.c t.c: In function ‘f’: t.c:5:3: warning: ‘__builtin_strncpy’ writing 4 bytes into a region of size 3 overflows the destination [-Wstringop-overflow=] __builtin_strncpy (a, s, sizeof a + 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ t.c: In function ‘g’: t.c:12:3: warning: ‘__builtin_strncpy’ writing 4 bytes into a region of size 3 overflows the destination [-Wstringop-overflow=] __builtin_strncpy (d->a, s, sizeof d->a + 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + for w in ''\'''\''' -Wstringop-overflow ''\''-Wall'\''' + /ssd/build/gcc-git/gcc/xgcc -B /ssd/build/gcc-git/gcc -O2 -S -Wall t.c t.c: In function ‘f’: t.c:5:3: warning: ‘__builtin_strncpy’ writing 4 bytes into a region of size 3 overflows the destination [-Wstringop-overflow=] __builtin_strncpy (a, s, sizeof a + 1); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~