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) e.g. int f1() { int x; return x; } int f2() { int x; return x; } int main(void) { f1(); f2(); return 0; } compiled without optimization so that the variables stay around still gives no warning in valgrind: ==22573== Memcheck, a memory error detector ==22573== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==22573== Using Valgrind-3.5.0 and LibVEX; rerun with -h for copyright info ==22573== Command: ./a.out ==22573== ==22573== ==22573== HEAP SUMMARY: ==22573== in use at exit: 0 bytes in 0 blocks ==22573== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==22573== ==22573== All heap blocks were freed -- no leaks are possible ==22573== ==22573== For counts of detected and suppressed errors, rerun with: -v ==22573== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 5) On the other hand the compiler tends to warn too much for uninitialized variables, typically because it cannot handle something like that: void f(int flag) { int local; if (flag) ... initialize local .... ... if (flag) ... use local .... } -Andi -- a...@linux.intel.com -- Speaking for myself only.