https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80523
Bug ID: 80523
Summary: -Wformat-overflow doesn't consider -fexec-charset
Product: gcc
Version: 7.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: ---
Similarly to -Wformat (bug 20110), the -Wformat-overflow and
-Wformat-truncation warnings don't handle execution character sets that differ
from the host character set. As a result the warnings don't work correctly
when -fexec-charset specifies such a character set. Likewise the sprintf
return value optimization doesn't behave correctly.
The test case below shows the problems: the warning that is issued for function
f indicates the wrong number of characters (and the directive is mangled in the
text of the warning) and function g returns the wrong value.
$ cat c.c && gcc -O2 -S -Wall -Wextra -Wpedantic -Wconversion
-fexec-charset=IBM1047 -fdump-tree-optimized=/dev/stdout c.c
char d[1];
void f (void)
{
__builtin_sprintf (d, "%-s\n", "foobar");
}
int g (void)
{
return __builtin_snprintf (0, 0, "%-s", "foobar");
}
c.c: In function ‘f’:
c.c:5:25: warning: spurious trailing ‘%’ in format [-Wformat=]
__builtin_sprintf (d, "%-s\n", "foobar");
^~~~~~~
c.c:5:25: warning: too many arguments for format [-Wformat-extra-args]
c.c: In function ‘g’:
c.c:10:36: warning: too many arguments for format [-Wformat-extra-args]
return __builtin_snprintf (0, 0, "%-s", "foobar");
^~~~~
c.c: In function ‘f’:
c.c:5:25: warning: ‘l`�’ directive writing 3 bytes into a region of size 1
[-Wformat-overflow=]
__builtin_sprintf (d, "%-s\n", "foobar");
^~~~~~~
;; Function f (f, funcdef_no=0, decl_uid=1794, cgraph_uid=0, symbol_order=1)
f ()
{
<bb 2> [100.00%]:
__builtin_sprintf (&d, "l`\xa2%", "\x86\x96\x96\x82\x81\x99"); [tail call]
return;
}
;; Function g (g, funcdef_no=1, decl_uid=1797, cgraph_uid=1, symbol_order=2)
g ()
{
<bb 2> [100.00%]:
return 3;
}