https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91830
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |msebor at gcc dot gnu.org Target Milestone|--- |10.0 Summary|Bogus -Warray-bounds |[10 Regression] Bogus |warning compiling binutils |-Warray-bounds on strcpy | |into a member of a | |subobject compiling | |binutils --- Comment #6 from Martin Sebor <msebor at gcc dot gnu.org> --- Reduced test case. The warning code uses the MEM_REF type, or struct A here, to validate the access to B::A::a at offset 4, without adjusting the offset by that of B::a (or rather, the offset of B::A::a from B). $ cat pr91830.c && gcc -O2 -S -Wall -fdump-tree-wrestrict=/dev/stdout pr91830.c struct A { char a[3]; int i; }; struct B { int j; struct A a; }; void g (struct B *p, const char *s) { struct A *q = &p->a; __builtin_strcpy (q->a, s); } ;; Function g (g, funcdef_no=0, decl_uid=1931, cgraph_uid=1, symbol_order=0) pr91830.c: In function ‘g’: pr91830.c:7:3: warning: ‘__builtin_strcpy’ offset 4 from the object at ‘p’ is out of the bounds of referenced subobject ‘a’ with type ‘char[3]’ at offset 0 [-Warray-bounds] 7 | __builtin_strcpy (q->a, s); | ^~~~~~~~~~~~~~~~~~~~~~~~~~ pr91830.c:1:17: note: subobject ‘a’ declared here 1 | struct A { char a[3]; int i; }; | ^ g (struct B * p, const char * s) { char[3] * _1; <bb 2> [local count: 1073741824]: _1 = &MEM[(struct A *)p_2(D) + 4B].a; __builtin_strcpy (_1, s_4(D)); return; }