http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60165
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- How can the compiler know that fn2 never returns 0, without inlining (not in this case), some attribute (not provided, gcc right now has returns_nonnull attribute but that is only for pointers) or some interprocedural analysis)? Of course, if you want zero false positives, the uninitialized warnings could not exist, even if you do: int foo (void) { int c; return c; } you could say that warning here is a false positive, because you might actually never call that function. For -O2 we don't warn, because then the compiler does see an opaque call that might be initializing what the arguments points to, might not, but warning in that case would just mean too many false positives as I've said before. While for -O3, when it is inlined a few times, the compiler clearly sees code paths where the value is uninitialized, and has nothing that would hint such code paths are impossible. Of course, if fn2 is guaranteed to return non-NULL, why do you even write if (fn2 (a, 0)) *p1 = b; rather than just fn2 (a, 0); *p1 = b; ?