uninitialized variables; fix FP in for loop
This commit is contained in:
parent
404b82fc21
commit
809c70b9c3
|
@ -836,6 +836,26 @@ const Token* CheckUninitVar::checkLoopBodyRecursive(const Token *start, const Va
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// for loop; skip third expression until loop body has been analyzed..
|
||||
if (tok->str() == ";" && Token::simpleMatch(tok->astParent(), ";") && Token::simpleMatch(tok->astParent()->astParent(), "(")) {
|
||||
const Token *top = tok->astParent()->astParent();
|
||||
if (!Token::simpleMatch(top->previous(), "for (") || !Token::simpleMatch(top->link(), ") {"))
|
||||
continue;
|
||||
const Token *bodyStart = top->link()->next();
|
||||
const Token *errorToken = checkLoopBodyRecursive(bodyStart, var, alloc, membervar, bailout);
|
||||
if (errorToken)
|
||||
return errorToken;
|
||||
if (bailout)
|
||||
return nullptr;
|
||||
}
|
||||
// for loop; skip loop body if there is third expression
|
||||
if (Token::simpleMatch(tok, ") {") &&
|
||||
Token::simpleMatch(tok->link()->previous(), "for (") &&
|
||||
Token::simpleMatch(tok->link()->astOperand2(), ";") &&
|
||||
Token::simpleMatch(tok->link()->astOperand2()->astOperand2(), ";")) {
|
||||
tok = tok->linkAt(1);
|
||||
}
|
||||
|
||||
if (tok->str() == "{") {
|
||||
const Token *errorToken1 = checkLoopBodyRecursive(tok, var, alloc, membervar, bailout);
|
||||
if (Token::simpleMatch(tok->link(), "} else {")) {
|
||||
|
|
|
@ -1283,6 +1283,25 @@ private:
|
|||
" }\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: learn\n", errout.str());
|
||||
|
||||
checkUninitVar("void foo() {\n"
|
||||
" Entry *entry, *nextEntry;\n"
|
||||
" for(int i = 0; i < 10; i++) {\n"
|
||||
" for(entry = buckets[i]; entry != NULL; entry = nextEntry) {\n" // <- nextEntry is not uninitialized
|
||||
" nextEntry = entry->next;\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void foo() {\n"
|
||||
" Entry *entry, *nextEntry;\n"
|
||||
" for(int i = 0; i < 10; i++) {\n"
|
||||
" for(entry = buckets[i]; entry != NULL; entry = nextEntry) {\n"
|
||||
" }\n"
|
||||
" }\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: nextEntry\n", errout.str());
|
||||
}
|
||||
|
||||
// switch..
|
||||
|
|
Loading…
Reference in New Issue