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

            Bug ID: 79214
           Summary: -Wno-system-header defeats strncat buffer overflow
                    warnings
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: preprocessor
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

In the following program the -Wstringop-overflow= function detects the
incorrectly bounded call to __builtin_strncat in function f() but fails to
detect the same problem in the call to strncat in function g().  On this system
(Fedora 21) strncat is a macro defined in <string.h> to __builtin_strncat so
the code in both f() and g() is identical.  The problem is that because the
strncat macro is defined in a system header and the -Wno-system-headers option
is enabled by default the warning in the second instance is suppressed.

$ cat t.c && gcc -O2 -S -Wall -Wextra t.c
#include <string.h>

void foo (void*);

void f (const char *fname)
{
  char d[8];
  __builtin_strncpy (d, "/tmp/", sizeof d);
  __builtin_strncat (d, fname, sizeof d);

  foo (d);
}

void g (const char *fname)
{
  char d[8];
  strncpy (d, "/var/", sizeof d);
  strncat (d, fname, sizeof d);

  foo (d);
}

t.c: In function ‘f’:
t.c:9:3: warning: specified bound 8 equals the size of the destination
[-Wstringop-overflow=]
   __builtin_strncat (d, fname, sizeof d);
   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Reply via email to