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

            Bug ID: 92380
           Summary: Bogus -Warray-bounds warning with structures
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sirl at gcc dot gnu.org
  Target Milestone: ---

Created attachment 47176
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47176&action=edit
testcase

This code:

typedef struct {
        char cs[256];
} inner_small_struct;

typedef struct {
        char cl[512];
} inner_large_struct;

typedef union {
        inner_large_struct large;
        inner_small_struct small;
} inner_union;

typedef struct {
        int y;
        inner_union inner;
} outer_struct;

typedef struct  {
        int x;
        char s[];
} flexarr_struct;

char *t1(outer_struct *p, char str[240])
{
        flexarr_struct *l = (flexarr_struct *) ((char *) p + sizeof(*p) -
(sizeof(inner_large_struct) - sizeof(inner_small_struct)));
        __builtin_strcpy(l->s, str);
        return l->s;
}

warns with trunk@277817 like that:

> gcc-trunk -c -O2 -W -Wall -Warray-bounds=1 testcase.c
testcase.c: In function 't1':
testcase.c:28:2: warning: '__builtin_strcpy' offset 264 from the object at 'p'
is out of the bounds of referenced subobject 's' with type 'char[0]' at offset
264 [\-Warray-bounds=\]
   28 |  __builtin_strcpy(l->s, str);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
testcase.c:22:7: note: subobject 's' declared here
   22 |  char s[];
      |       ^

Since gcc already knows about 'p' and the offset, it should also consider
sizeof(*p) when deciding to warn. Otherwise it's unfortunate that a flexible
array (compared to a size 1 array s[1]) suppresses UBSAN warnings, but
-Warray-bounds now warns.

Reply via email to