-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.

llvm-svn: 158611
This commit is contained in:
Richard Smith 2012-06-16 23:34:14 +00:00
parent d0b767f849
commit a8d4f229a6
2 changed files with 37 additions and 0 deletions

View File

@ -625,6 +625,18 @@ void TransferFunctions::VisitDeclStmt(DeclStmt *ds) {
// the use of the uninitialized value (which visiting the // the use of the uninitialized value (which visiting the
// initializer). // initializer).
vals[vd] = Initialized; 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;
} }
} }
} }

View File

@ -437,3 +437,28 @@ void test54() {
int c; // expected-note {{initialize the variable 'c' to silence this warning}} 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}} 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();
}
}