With the attached two .i files, if I compile with: cc -g -std=gnu99 -O3 -fwhole-program -combine -Wall zigtest.i isaac.i -o zigtest
then I get: zigtest.c: In function main: isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:101: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:46: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:45: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:44: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:43: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:39: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:38: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:37: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:27: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:26: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:19: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:25: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:24: warning: dereferencing pointer ctx does break strict-aliasing rules isaac.c:36: warning: dereferencing pointer ctx does break strict-aliasing rules cc1: note: initialized from here cc1: warning: dereferencing pointer ctx does break strict-aliasing rules cc1: note: initialized from here And the resulting program has valgrind errors: $ valgrind --track-origins=yes ./zigtest ==8094== Memcheck, a memory error detector ==8094== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==8094== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info ==8094== Command: ./zigtest ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x400663: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x4006A9: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x4006E7: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x400723: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x4007A1: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x4007D6: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x400816: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x400851: main (isaac.c:27) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Use of uninitialised value of size 8 ==8094== at 0x4E6762B: _itoa_word (_itoa.c:195) ==8094== by 0x4E691B0: vfprintf (vfprintf.c:1600) ==8094== by 0x4E72559: printf (printf.c:35) ==8094== by 0x4008A7: main (zigtest.c:9) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== ==8094== Conditional jump or move depends on uninitialised value(s) ==8094== at 0x4E67635: _itoa_word (_itoa.c:195) ==8094== by 0x4E691B0: vfprintf (vfprintf.c:1600) ==8094== by 0x4E72559: printf (printf.c:35) ==8094== by 0x4008A7: main (zigtest.c:9) ==8094== Uninitialised value was created by a stack allocation ==8094== at 0x4004F0: main (zigtest.c:5) ==8094== 3468991596 ==8094== ==8094== HEAP SUMMARY: ==8094== in use at exit: 0 bytes in 0 blocks ==8094== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==8094== ==8094== All heap blocks were freed -- no leaks are possible ==8094== ==8094== For counts of detected and suppressed errors, rerun with: -v ==8094== ERROR SUMMARY: 276 errors from 10 contexts (suppressed: 4 from 4) Doing any of the following will make the warnings go away, make the valgrind errors go away, and change the printed answer: - Reduce -O3 to -O1 - Add -fno-strict-aliasing - Remove -fwhole-program -combine - Compile with the default -std=gnu89 instead of -std=gnu99 With any of those, the program gives the answer 1909923794. To the best of my knowledge, the program does not actually violate the strict aliasing rules. For reference, I've also attached the original .c files corresponding to the .i files. Version details: cc (Debian 4.4.3-5) 4.4.3 Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.3-5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu -- Summary: Bad code generation: introduces strict aliasing warnings and references to uninitialized memory Product: gcc Version: 4.4.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: josh at joshtriplett dot org GCC build triplet: x86_64-linux-gnu GCC host triplet: x86_64-linux-gnu GCC target triplet: x86_64-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43624