John Regehr <[email protected]> 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
--
[email protected] -- Speaking for myself only.