Awesome! On Jun 16, 2012, at 4:34 PM, Richard Smith <[email protected]> wrote:
> Author: rsmith > Date: Sat Jun 16 18:34:14 2012 > New Revision: 158611 > > URL: http://llvm.org/viewvc/llvm-project?rev=158611&view=rev > Log: > -Wuninitialized bugfix: when entering the scope of a variable with no > initializer, it is uninitialized, even if we may be coming from somewhere > where > it was initialized. > > Modified: > cfe/trunk/lib/Analysis/UninitializedValues.cpp > cfe/trunk/test/Sema/uninit-variables.c > > Modified: cfe/trunk/lib/Analysis/UninitializedValues.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/UninitializedValues.cpp?rev=158611&r1=158610&r2=158611&view=diff > ============================================================================== > --- cfe/trunk/lib/Analysis/UninitializedValues.cpp (original) > +++ cfe/trunk/lib/Analysis/UninitializedValues.cpp Sat Jun 16 18:34:14 2012 > @@ -625,6 +625,18 @@ > // the use of the uninitialized value (which visiting the > // initializer). > vals[vd] = Initialized; > + } else { > + // No initializer: the variable is now uninitialized. This matters > + // for cases like: > + // while (...) { > + // int n; > + // use(n); > + // n = 0; > + // } > + // FIXME: Mark the variable as uninitialized whenever its scope is > + // left, since its scope could be re-entered by a jump over the > + // declaration. > + vals[vd] = Uninitialized; > } > } > } > > Modified: cfe/trunk/test/Sema/uninit-variables.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/uninit-variables.c?rev=158611&r1=158610&r2=158611&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/uninit-variables.c (original) > +++ cfe/trunk/test/Sema/uninit-variables.c Sat Jun 16 18:34:14 2012 > @@ -437,3 +437,28 @@ > int c; // expected-note {{initialize the variable 'c' to silence this > warning}} > ASSIGN(int, c, d); // expected-warning {{variable 'c' is uninitialized > when used here}} > } > + > +void uninit_in_loop() { > + int produce(void); > + void consume(int); > + for (int n = 0; n < 100; ++n) { > + int k; // expected-note {{initialize}} > + consume(k); // expected-warning {{variable 'k' is uninitialized}} > + k = produce(); > + } > +} > + > +void uninit_in_loop_goto() { > + int produce(void); > + void consume(int); > + for (int n = 0; n < 100; ++n) { > + goto skip_decl; > + int k; // expected-note {{initialize}} > +skip_decl: > + // FIXME: This should produce the 'is uninitialized' diagnostic, but we > + // don't have enough information in the CFG to easily tell that the > + // variable's scope has been left and re-entered. > + consume(k); // expected-warning {{variable 'k' may be uninitialized}} > + k = produce(); > + } > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
