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

            Bug ID: 87034
           Summary: [9 Regression] missing -Wformat-overflow on a sprintf
                    %s with a wide string
           Product: gcc
           Version: 9.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: ---

GCC 8 diagnoses the buffer overflow in the test case below, albeit with a
message that isn't entirely accurate.  However, as a result of r263607 GCC 9 no
longer does.

$ cat f.c && gcc -O2 -S -Wall f.c
typedef __WCHAR_TYPE__ wchar_t;

extern int sprintf (char*, const char*, ...);

struct S
{
  char a[2];
  void (*pf)(void);
};

void test (struct S *p)
{
  const char *q = (char*)L"\x41424344\x45464748";

  sprintf (p->a, "%s", q);
}

f.c: In function ‘test’:
f.c:15:21: warning: ‘sprintf’ writing a terminating nul past the end of the
destination [-Wformat-overflow=]
   sprintf (p->a, "%s", q);
                     ^
f.c:15:3: note: ‘sprintf’ output 3 bytes into a destination of size 2
   sprintf (p->a, "%s", q);
   ^~~~~~~~~~~~~~~~~~~~~~~

Reply via email to