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

            Bug ID: 89689
           Summary: [7/8 regression] false warning -Wstringop-overflow=
           Product: gcc
           Version: 8.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: chantry.xavier at gmail dot com
  Target Milestone: ---

Created attachment 45953
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=45953&action=edit
test case

I am testing gcc version 8.3.1 20190228

With "gcc -O" I get the following warning:
In function ‘a’,
    inlined from ‘o’ at result2.c:31:5:
result2.c:7:12: warning: ‘__builtin_memcpy’ writing 4 bytes into a region of
size 1 overflows the destination [-Wstringop-overflow=]
     return __builtin___memcpy_chk(c, d, n, __builtin_object_size(c, 0));
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

With "gcc -O -Wall" I get the following warning:
In function ‘a’,
    inlined from ‘o’ at result2.c:31:5:
result2.c:7:12: warning: ‘__builtin_memcpy’ forming offset [2, 4] is out of the
bounds [0, 1] of object ‘__sb_slop’ with type ‘const char[1]’ [-Warray-bounds]
     return __builtin___memcpy_chk(c, d, n, __builtin_object_size(c, 0));
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
result2.c: In function ‘o’:
result2.c:13:12: note: ‘__sb_slop’ declared here
 const char __sb_slop[1];
            ^~~~~~~~~

In both cases it looks buggy, because h.data points to "char buf[5]" and not to
"const char __sb_slop[1]".

According to my tests on godbolt.org, the first warning appeared on gcc 7, the
second warning appeared on gcc 8. There was no warning with gcc <= 6.

This test case does not make sense but it was derived from production code
using creduce.
I do not want to disable Wstringop-overflow or Warray-bounds entirely because
they look useful sometimes, and I did not find a workaround by modifying the
code. Fortunately the warning can be disabled locally using pragma directives.

Reply via email to