Bug 102151 - Spurious warning by -Warray-bounds when allocating with flexible array member
Summary: Spurious warning by -Warray-bounds when allocating with flexible array member
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: tree-optimization (show other bugs)
Version: 11.2.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: diagnostic
Depends on:
Blocks: Warray-bounds flexmembers
  Show dependency treegraph
 
Reported: 2021-09-01 01:42 UTC by Niibe Yutaka
Modified: 2021-11-17 01:32 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments
Test with smaller size and valid access to the structure with flexible array member (791 bytes, text/x-csrc)
2021-09-01 01:42 UTC, Niibe Yutaka
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Niibe Yutaka 2021-09-01 01:42:54 UTC
Created attachment 51392 [details]
Test with smaller size and valid access to the structure with flexible array member

When allocating memory with smaller size than sizeof(a_structure_with_flexible_member), for (valid) access to the structure, compiler emits spurious warning, in some optimization level.
Comment 1 Niibe Yutaka 2021-09-01 01:58:20 UTC
struct arg_and_data_s
{
  struct arg_and_data_s *next;
  unsigned int len;
  char arg[];
};

sizeof(struct arg_and_data_s) is 16 for x86_64.
offsetof (struct arg_and_data_s, arg) is 12.
Comment 2 Andrew Pinski 2021-09-01 02:48:16 UTC
I think the malloc needs to be at least the sizeof which is why it is complaining.
Comment 3 Martin Sebor 2021-09-01 15:02:17 UTC
As Andrew explained, the first operand in the -> expression needs to point to an object of the type whose member is being accessed or at least as big as one, and the warning is designed to point out when it's not (arguably, it could be phrased better).  The following is a small test case to illustrate the warning (see also pr101436 comment 2 for a similar C++ test case).

$ cat pr102151.c && gcc -O2 -S -Wall pr102151.c
struct S { char a, b; };

extern char c;

void f (void)
{
  struct S *p = &c;
  p->a = 0;
}
pr102151.c: In function ‘f’:
pr102151.c:7:17: warning: initialization of ‘struct S *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
    7 |   struct S *p = &c;
      |                 ^
pr102151.c:8:4: warning: array subscript ‘struct S[0]’ is partly outside array bounds of ‘char[1]’ [-Warray-bounds]
    8 |   p->a = 0;
      |    ^~
pr102151.c:3:13: note: while referencing ‘c’
    3 | extern char c;
      |             ^
Comment 4 Niibe Yutaka 2021-09-02 02:34:38 UTC
Thank you for the explanation.  I understand how (current version of) GCC warns.

From the viewpoint of use of structure with flexible array member, still, this could be considered as a bug of GCC, because the warning itself is irrelevant.

My point is that:

(1) In the test case, use of offsetof(struct arg_and_data_s, arg) is valid (I mean, no violation of language/feature).  In other words,

(2) Allocated space for an object of the structure may be smaller than sizeof().  There are such cases, for structure with flexible array member, because of structure alignment.

(3) It seems for me that by (current version of) GCC, the fact (2) is ignored.