[Bug middle-end/94647] [10 Regression] bogus -Warray-bounds on strncpy into a larger member array from a smaller array

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sat Apr 18 17:07:52 GMT 2020


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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |msebor at gcc dot gnu.org
   Last reconfirmed|                            |2020-04-18
             Status|UNCONFIRMED                 |NEW
          Component|other                       |middle-end
     Ever confirmed|0                           |1
            Summary|[10 Regression] wrong       |[10 Regression] bogus
                   |diagnostic with             |-Warray-bounds on strncpy
                   |-Werror=format-security     |into a larger member array
                   |                            |from a smaller array

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed with the slightly simplified test case below:

$ cat pr94647.c && gcc -O2 -S -Wall pr94647.c
char a[4], b[8];

void f (void)
{
  __builtin_strncpy (b, a, sizeof b);   // no warning
}

struct S
{ 
  char a[4], b[8];
};

void g (struct S *p)
{
  __builtin_strncpy (p->b, p->a, sizeof p->b);   // bogus -Warray-bounds
}

pr94647.c: In function ‘g’:
pr94647.c:15:3: warning: ‘__builtin_strncpy’ offset [4, 7] from the object at
‘p’ is out of the bounds of referenced subobject ‘a’ with type ‘char[4]’ at
offset 0 [-Warray-bounds]
   15 |   __builtin_strncpy (p->b, p->a, sizeof p->b);   // bogus
-Warray-bounds
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pr94647.c:10:8: note: subobject ‘a’ declared here
   10 |   char a[4], b[8];
      |        ^


The spurious warning was introduced by r275981:

Author: Martin Sebor <msebor@redhat.com>
Date:   Thu Sep 19 22:15:34 2019 +0000

    PR middle-end/91631 - buffer overflow into an array member of a declared
object not detected

    gcc/ChangeLog:

            PR middle-end/91631
            * builtins.c (component_size): Correct trailing array computation,
            rename to component_ref_size and move...
            (compute_objsize): Adjust.
            * gimple-ssa-warn-restrict.c (builtin_memref::refsize): New member.
            (builtin_access::strict): Do not consider mememmove.
            (builtin_access::write_off): New function.
            (builtin_memref::builtin_memref): Initialize refsize.
            (builtin_memref::set_base_and_offset): Adjust refoff and compute
            refsize.
            (builtin_memref::offset_out_of_bounds): Use ooboff input values.
            Handle refsize.
            (builtin_access::builtin_access): Intialize dstoff to destination
            refeence offset here instead of in maybe_diag_overlap.  Adjust
            referencess even to unrelated objects.  Adjust sizrange of bounded
            string functions to reflect bound.  For strcat, adjust destination
            sizrange by that of source.
            (builtin_access::strcat_overlap):  Adjust offsets and sizes
            to reflect the increase in destination sizrange above.
            (builtin_access::overlap): Do not set dstoff here but instead
            in builtin_access::builtin_access.
            (check_bounds_or_overlap): Use builtin_access::write_off.
            (maybe_diag_access_bounds): Add argument.  Add informational notes.
            (dump_builtin_memref, dump_builtin_access): New functions.
            * tree.c (component_ref_size): ...to here.
            * tree.h (component_ref_size): Declare.
            * tree-ssa-strlen (handle_builtin_strcat): Include the terminating
            nul in the size of the source string.

    gcc/testsuite/ChangeLog:

            PR middle-end/91631
            * /c-c++-common/Warray-bounds-3.c: Correct expected offsets.
            * /c-c++-common/Warray-bounds-4.c: Same.
            * gcc.dg/Warray-bounds-39.c: Remove xfails.
            * gcc.dg/Warray-bounds-45.c: New test.
            * gcc.dg/Warray-bounds-46.c: New test.

    From-SVN: r275981


More information about the Gcc-bugs mailing list