https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101525
Bug ID: 101525 Summary: "out of the bounds" warning for an Innocuous memset call with LTO Product: gcc Version: 11.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: Hi-Angel at yandex dot ru Target Milestone: --- Created attachment 51176 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51176&action=edit preprocessed file that triggers the warnings Given this memset call static bool append_space_for_newline (struct it *it, bool default_face_p) { […] memset (&it->position, 0, sizeof it->position); GCC complains: xdisp.c: In function ‘append_space_for_newline’: xdisp.c:21906:7: warning: ‘memset’ offset [2352, 2359] from the object at ‘it_122(D)’ is out of the bounds of referenced subobject ‘charpos’ with type ‘long int’ at offset 2344 [-Warray-bounds] 21906 | memset (&it->position, 0, sizeof it->position); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from composite.h:29, from xdisp.c:441: dispextern.h:214:13: note: subobject ‘charpos’ declared here 214 | ptrdiff_t charpos; | ^~~~~~~ I can't see any overflow on this line. Either way, further experiments show that removing the function content below the offending line makes warnings disappear. Since it's impossible to make overflow disappear by removing a code below the overflow, the warning disappearance suggests the warning is a GCC bug and should not be there. ---------------------------------------- I couldn't reduce it down to a minimal testcase because removing irrelevant code makes warning go away, so instead in steps-to-reproduce I use a preprocessed source. I had to compress it to be able to attach. The original is a `src/xdisp.c` file in Emacs project at commit `6ebe8b03d80`. # Steps to reproduce 1. Download `xdisp.preprocessed.c.zst` 2. Unpack with: zstd -d xdisp.preprocessed.c.zst 3. Compile with: gcc -c -Warray-bounds=2 -flto=2 -O3 -ffat-lto-objects xdisp.preprocessed.c ## Expected No warnings for `append_space_for_newline` function ## Actual There is a warning: xdisp.c: In function ‘append_space_for_newline’: xdisp.c:21906:7: warning: ‘memset’ offset [2352, 2359] from the object at ‘it_140(D)’ is out of the bounds of referenced subobject ‘charpos’ with type ‘long int’ at offset 2344 [-Warray-bounds] In file included from composite.h:29, from xdisp.c:441: dispextern.h:214:13: note: subobject ‘charpos’ declared here