http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46443
Summary: -O2 flag generates incorrect code Product: gcc Version: 4.1.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassig...@gcc.gnu.org ReportedBy: mul...@vki.com Created attachment 22379 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22379 Comment and uncomment the printf statement for different behavior with -O2 I'm attaching a small file bug.c. If you compile with gcc -c -O2 bug.c gcc -o bug.x bug.o then the executable bug.x has problems. This can be verified simply by running valgrind on the executable. It complains about uninitialized variables. I you uncomment the printf statement from bug.c then the problem goes away. I have a workaround in my real code by replacing the pointer variable "ua" by a non-pointer variable "ua" and using memcpy(&ua,&a,sizeof(double)) to initialize ua. So even though gcc is generating incorrect code I don't think this is critical as there's a workaround for it. -Arthur PS: Here is the valgrind output for when the printf statement is not there ==7128== Memcheck, a memory error detector ==7128== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==7128== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info ==7128== Command: bug.x ==7128== ==7128== Use of uninitialised value of size 8 ==7128== at 0x373B8419BD: _itoa_word (in /lib64/libc-2.5.so) ==7128== by 0x373B844E5A: vfprintf (in /lib64/libc-2.5.so) ==7128== by 0x373B84D3F9: printf (in /lib64/libc-2.5.so) ==7128== by 0x4005FE: main (in /home/vki/muller/Gnubuild/src/base/exam/bug.x) ==7128== ==7128== Conditional jump or move depends on uninitialised value(s) ==7128== at 0x373B8419C7: _itoa_word (in /lib64/libc-2.5.so) ==7128== by 0x373B844E5A: vfprintf (in /lib64/libc-2.5.so) ==7128== by 0x373B84D3F9: printf (in /lib64/libc-2.5.so) ==7128== by 0x4005FE: main (in /home/vki/muller/Gnubuild/src/base/exam/bug.x) ==7128== ==7128== Conditional jump or move depends on uninitialised value(s) ==7128== at 0x373B844ED4: vfprintf (in /lib64/libc-2.5.so) ==7128== by 0x373B84D3F9: printf (in /lib64/libc-2.5.so) ==7128== by 0x4005FE: main (in /home/vki/muller/Gnubuild/src/base/exam/bug.x) ==7128== ==7128== Conditional jump or move depends on uninitialised value(s) ==7128== at 0x373B84563F: vfprintf (in /lib64/libc-2.5.so) ==7128== by 0x373B84D3F9: printf (in /lib64/libc-2.5.so) ==7128== by 0x4005FE: main (in /home/vki/muller/Gnubuild/src/base/exam/bug.x) ==7128== ==7128== Conditional jump or move depends on uninitialised value(s) ==7128== at 0x373B843B60: vfprintf (in /lib64/libc-2.5.so) ==7128== by 0x373B84D3F9: printf (in /lib64/libc-2.5.so) ==7128== by 0x4005FE: main (in /home/vki/muller/Gnubuild/src/base/exam/bug.x) ==7128== return value = 2