http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52186
Bug #: 52186 Summary: array out of bounds error when accessing last byte of a struct via char ptr Classification: Unclassified Product: gcc Version: 4.5.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: a...@aivor.com Created attachment 26624 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=26624 source code In some cases, casting a struct to an unsigned char and indexing the last byte causes an array out of bounds error. To illustrate: struct foobar foobar; unsigned char *k = (unsigned char*)foobar; if ( k[sizeof(struct foobar)-1] ) /* out of bounds? */ return; The above snippet is only to describe the problem. See the attached file "test.c" for an real example. When test.c is compiled with -O2 it gives the following error: test.c:21:11: error: array subscript is above array bounds Small changes to the code such as changing a struct member type from 'unsigned char' to 'char' avoid the error. Other changes that avoid the error are described in comments in test.c. The error is flagged with and without '-fno-strict-aliasing'. The file test.c is as simple as I could make it -- no external includes, etc. Attached files: test.c -- source code test.* -- files created by '-save-temps' log -- stdout and stderr of the compile command Compile command: gcc -v -save-temps -c test.c -Wall -Werror -O2 -fno-strict-aliasing