-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:
parent
d0b767f849
commit
a8d4f229a6
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue