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

Reply via email to