On Tue, 2009-12-15 at 11:24 +0100, Andi Kleen wrote: > John Regehr <reg...@cs.utah.edu> writes: > > >> I would only be worried for cases where no warning is issued *and* > >> unitialized accesses are eliminated. > > > > Yeah, it would be excellent if GCC maintained the invariant that for > > all uses of uninitialized storage, either the compiler or else > > valgrind will issue a warning. > > My understanding was that valgrind's detection of uninitialized > local variables is not 100% reliable because it cannot track > all updates of the frames (it's difficult to distingush stack > reuse from uninitialized stack)
I am not a valgrind expert so, take the following with a grain of salt but I think that the above statement is wrong: valgrind reliably detects use of uninitialized variables if you define 'use' as meaning 'affects control flow of your program' in valgrind. i.e., try this: [mlac...@diese ~]$ cat > test.c int f(void) { int x; return x; } int main (int argc, char *argv[]) { if (f()) { printf ("something\n"); } return 0; } ^C [mlac...@diese ~]$ gcc ./test.c ./test.c: In function ‘main’: ./test.c:10: warning: incompatible implicit declaration of built-in function ‘printf’ [mlac...@diese ~]$ valgrind ./a.out ==18933== Memcheck, a memory error detector. ==18933== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al. ==18933== Using LibVEX rev 1804, a library for dynamic binary translation. ==18933== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP. ==18933== Using valgrind-3.3.0, a dynamic binary instrumentation framework. ==18933== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al. ==18933== For more details, rerun with: -v ==18933== ==18933== Conditional jump or move depends on uninitialised value(s) ==18933== at 0x80483D7: main (in /home/mlacage/a.out) something ==18933== ==18933== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1) ==18933== malloc/free: in use at exit: 0 bytes in 0 blocks. ==18933== malloc/free: 0 allocs, 0 frees, 0 bytes allocated. ==18933== For counts of detected errors, rerun with: -v ==18933== All heap blocks were freed -- no leaks are possible. [mlac...@diese ~]$