[Bug tree-optimization/83733] New: -Wformat-overflow false positive for %d on bounded integer when inlining

tim.vanholder at anubex dot com gcc-bugzilla@gcc.gnu.org
Mon Jan 8 09:25:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83733

            Bug ID: 83733
           Summary: -Wformat-overflow false positive for %d on bounded
                    integer when inlining
           Product: gcc
           Version: 7.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tim.vanholder at anubex dot com
  Target Milestone: ---

Given code similar to

struct foo {
  char buf[9];
};

void fun(struct foo* pfoo, int report) {
  if (report < 0 || report >= 32)
    return;
  ...
  sprintf (pfoo->buf, "CMPRT%02d", report);
}

There is no diagnostic when compiling without inlining active (which is
correct, given that report is constrained to [0,31], which does not overflow
%02d).

However, with optimizations enabled, I get errors like the following reported
for some (but not all) of fun()'s callers:

src.c: In function ‘caller_of_fun()’:
src.c:123:45: error: ‘%02d’ directive writing between 2 and 6 bytes into a
region of size 4 [-Werror=format-overflow=]
  sprintf (pfoo->buf, "CMPRT%02d", report);
                            ^~~~
src.c:123:45: note: directive argument in the range [-32768, 32767]
  sprintf (pfoo->buf, "CMPRT%02d", report);
                      ^~~~~~~~~~~
src.c:123:45: note: ‘sprintf’ output between 8 and 12 bytes into a destination
of size 9
  sprintf (pfoo->buf, "CMPRT%02d", report);
  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


More information about the Gcc-bugs mailing list