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

Reply via email to