https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86827
Bug ID: 86827 Summary: -Warray-bounds produces negative indicies Product: gcc Version: 8.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: liuw at liuw dot name Target Milestone: --- Created attachment 44484 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44484&action=edit Test code The attached program fails to build with gcc 8.1 (Debian 8.1.0-12). $ gcc -m32 -march=i686 -std=gnu99 -Wall -O2 -Werror -c -o t.o t.c t.c: In function 'func': t.c:41:9: error: 'memcpy' offset [-204, -717] is out of the bounds [0, 216] of object 'ctrl' with type 'struct kdd_ctrl' [-Werror=array-bounds] memcpy(buf, ((uint8_t *)&ctrl.c32) + offset, len); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ t.c:27:21: note: 'ctrl' declared here struct kdd_ctrl ctrl; And to quote Martin in a thread to gcc-help: It looks like a bug in the implementation of the warning. The offset is determined not to be in the range [-205, -716] (pointer offsets are in ptrdiff_t) or (since the variable is unsigned) in [4294966580, 4294967091]. That means that it can be either in the range [0, 4294966579] or in [4294967092, UINT_MAX]. But the warning code seems to get this anti-range wrong and treats it as [-204, -717].