https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95353
Martin Sebor <msebor at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Blocks| |88443 Assignee|unassigned at gcc dot gnu.org |msebor at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #5 from Martin Sebor <msebor at gcc dot gnu.org> --- The warning is due to a limitation of the compute_objsize() function. A small "supported" test case (one that doesn't depend on a trailing array of non-zero size being treated as a flexible array member) that I think reproduces the Binutils warning is below. In this case the function doesn't work hard enough to determine that the pointer points to a trailing array member and instead uses the the array's actual size. It needs to be improved or preferably rewritten as discussed in pr94335 comment 7. As suggested, using a flexible array member instead of the one-element (or zero-length) array avoids the warning. $ cat z.c && gcc -O2 -S -Wall -fdump-tree-strlen=/dev/stdout z.c struct S { char n, a[0]; }; void f (struct S *p) { char *q = p->a; q[1] = 1; // no warning } void g (struct S *p, int i) { char *q = p->a + i; q[1] = 1; // spurious -Wstringop-overflow } ;; Function f (f, funcdef_no=0, decl_uid=1933, cgraph_uid=1, symbol_order=0) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 ;; 2 succs { 1 } f (struct S * p) { <bb 2> [local count: 1073741824]: MEM[(char *)p_1(D) + 2B] = 1; return; } ;; Function g (g, funcdef_no=1, decl_uid=1938, cgraph_uid=2, symbol_order=1) ;; 1 loops found ;; ;; Loop 0 ;; header 0, latch 1 ;; depth 0, outer -1 ;; nodes: 0 1 2 ;; 2 succs { 1 } z.c: In function āgā: z.c:15:8: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 15 | q[1] = 1; // spurious -Wstringop-overflow | ~~~~~^~~ g (struct S * p, int i) { char * q; char[0:] * _1; sizetype _2; <bb 2> [local count: 1073741824]: _1 = &p_3(D)->a; <<< doesn't consider that a is a trailing array _2 = (sizetype) i_4(D); q_5 = _1 + _2; MEM[(char *)q_5 + 1B] = 1; <<< warning here return; } Referenced Bugs: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88443 [Bug 88443] [meta-bug] bogus/missing -Wstringop-overflow warnings