Fixed #4652 (False positive: variable value tracking into loop body)

This commit is contained in:
Daniel Marjamäki 2013-05-29 16:16:12 +02:00
parent a861817a01
commit 065853a59a
2 changed files with 11 additions and 3 deletions

View File

@ -1327,11 +1327,10 @@ bool CheckUninitVar::checkScopeForVariable(const Scope* scope, const Token *tok,
const Token *tok2 = tok->next()->link()->next(); const Token *tok2 = tok->next()->link()->next();
if (tok2 && tok2->str() == "{") { if (tok2 && tok2->str() == "{") {
bool possibleinit = false; bool init = checkLoopBody(tok2, var, membervar, (number_of_if > 0) | suppressErrors);
bool init = checkLoopBody(tok2, var, membervar, suppressErrors);
// variable is initialized in the loop.. // variable is initialized in the loop..
if (possibleinit || init) if (init)
return true; return true;
// is variable used in for-head? // is variable used in for-head?

View File

@ -2618,6 +2618,15 @@ private:
" i++;\n" // <- no error if b(x) is always true when a(x) is false " i++;\n" // <- no error if b(x) is always true when a(x) is false
"}"); "}");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
checkUninitVar2("void f(int x) {\n"
" int i;\n"
" if (x) i = 0;\n"
" while (condition) {\n"
" if (x) i++;\n" // <- no error
" }\n"
"}");
ASSERT_EQUALS("", errout.str());
} }
void uninitvar2_structmembers() { // struct members void uninitvar2_structmembers() { // struct members