[Bug middle-end/95619] New: apparently in-bounds subscript in -Warray-bounds message
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Jun 9 20:28:40 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95619
Bug ID: 95619
Summary: apparently in-bounds subscript in -Warray-bounds
message
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
When the type of the access is obscured by a typedef (or macro, or, in C++, by
a template parameter), -Warray-bounds warnings like the one below must be
confusing. The warnings don't make it clear how "array subscript 2" can be
"outside array bounds of ‘X[3]’ {aka ‘short int[3]’}".
Either the warning should also mention the type of the access, maybe in the
note, or perhaps better, the byte offset into the array (when the the types
aren't the same).
$ cat z.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout z.c
typedef short X;
typedef int Y;
void f (void*);
void g (void)
{
X a[3];
Y *p = (Y*)a;
p[2] = 1;
f (p);
}
z.c: In function ‘g’:
z.c:10:4: warning: array subscript 2 is outside array bounds of ‘X[3]’ {aka
‘short int[3]’} [-Warray-bounds]
10 | p[2] = 1;
| ~^~~
z.c:8:5: note: while referencing ‘a’
8 | X a[3];
| ^
;; Function g (g, funcdef_no=0, decl_uid=1935, cgraph_uid=1, symbol_order=0)
g ()
{
X a[3];
<bb 2> [local count: 1073741824]:
MEM[(Y *)&a + 8B] = 1;
f (&a);
a ={v} {CLOBBER};
return;
}
More information about the Gcc-bugs
mailing list