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

            Bug ID: 79496
           Summary: call to snprintf eliminated with -Wformat-truncation=2
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

As pointed out in bug 79448 comment 3, using -Wformat-truncation=2 results in
eliminating calls to snprintf with a non-constant size argument the lower bound
of whose range is zero.  The following small test case demonstrates the
problem.

$ cat u.c && gcc -O2 -S -Wformat-truncation=2
-fdump-tree-printf-return-value=/dev/stdout u.c
void f (void*);

int g (char *d, unsigned n)
{
  if (4 < n)
    n = 4;
  return __builtin_snprintf (d, n, "%i", 123);
}

;; Function g (g, funcdef_no=0, decl_uid=1798, cgraph_uid=0, symbol_order=0)

u.c:7: __builtin_snprintf: objsize = 9223372036854775807, fmtstr = "%i"
  Directive 1 at offset 0: "%i"
    Result: 3, 3, 3, 3 (3, 3, 3, 3)
  Directive 2 at offset 2: "", length = 1
  Substituting 3 for statement.

g (char * d, unsigned int n)
{
  long unsigned int _1;
  int _7;

  <bb 2> [100.00%]:
  n_8 = MIN_EXPR <n_3(D), 4>;
  _1 = (long unsigned int) n_8;
  _7 = 3;
  return _7;

}

Reply via email to