https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104746
Bug ID: 104746
Summary: [12 Regression] False positive for -Wformat-overflow=2
since r12-7033-g3c9f762ad02f398c
Product: gcc
Version: 12.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: marxin at gcc dot gnu.org
CC: msebor at gcc dot gnu.org
Target Milestone: ---
I see the following regression reduced from nfs-utils:
$ cat 1.i
unsigned long systemd_escape___trans_tmp_2;
char *systemd_escape_p;
int systemd_escape_len;
char generate_target_pipefs_path;
char *main_path;
char *systemd_escape2()
{
}
char *systemd_escape(char, char *suffix) {
char *result;
systemd_escape_p++;
systemd_escape_len++;
systemd_escape___trans_tmp_2 = __builtin_strlen(suffix);
result =__builtin_malloc(systemd_escape_len + systemd_escape___trans_tmp_2 +
1);
__builtin_sprintf(systemd_escape_p, suffix);
return result;
}
void main()
{
char *pipefs_unit = systemd_escape(generate_target_pipefs_path, ".mount");
char *dirname = systemd_escape2();
unsigned long len = __builtin_strlen(pipefs_unit) + __builtin_strlen(dirname)
+ 1;
main_path = __builtin_malloc(len);
__builtin_sprintf(main_path, "%s/%s", pipefs_unit, dirname);
}
$ gcc -Werror=format-overflow=2 1.i -flto -O2
XXX
1.i: In function ‘main’:
1.i:29:32: error: ‘%s’ directive output between 0 and 2147483653 bytes may
exceed minimum required size of 4095 [-Werror=format-overflow=]
29 | __builtin_sprintf(main_path, "%s/%s", pipefs_unit, dirname);
| ^
1.i:29:32: note: assuming directive output of 1 byte
1.i:29:32: note: assuming directive output of 1 byte
lto1: some warnings being treated as errors
lto-wrapper: fatal error: gcc returned 1 exit status
compilation terminated.
/tmp/binutils/bin/ld: error: lto-wrapper failed
collect2: error: ld returned 1 exit status
Note it's fine w/o LTO:
$ gcc -Werror=format-overflow=2 1.i -O2