Uninitialized variables; Fixed false positive in range for loop
This commit is contained in:
parent
fcdc0088c7
commit
ca5fab8219
|
@ -1138,12 +1138,17 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// LHS in range for loop:
|
// range for loop
|
||||||
if (Token::simpleMatch(valueExpr->astParent(), ":") &&
|
if (Token::simpleMatch(valueExpr->astParent(), ":") &&
|
||||||
astIsLhs(valueExpr) &&
|
|
||||||
valueExpr->astParent()->astParent() &&
|
valueExpr->astParent()->astParent() &&
|
||||||
Token::simpleMatch(valueExpr->astParent()->astParent()->previous(), "for ("))
|
Token::simpleMatch(valueExpr->astParent()->astParent()->previous(), "for (")) {
|
||||||
return nullptr;
|
if (astIsLhs(valueExpr))
|
||||||
|
return nullptr;
|
||||||
|
// Taking value by reference?
|
||||||
|
const Token *lhs = valueExpr->astParent()->astOperand1();
|
||||||
|
if (lhs && lhs->variable() && lhs->variable()->nameToken() == lhs && lhs->variable()->isReference())
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Stream read/write
|
// Stream read/write
|
||||||
// FIXME this code is a hack!!
|
// FIXME this code is a hack!!
|
||||||
|
|
|
@ -4164,6 +4164,12 @@ private:
|
||||||
" for (item: itemList) {}\n"
|
" for (item: itemList) {}\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void f() {\n"
|
||||||
|
" int buf[10];\n"
|
||||||
|
" for (int &i: buf) { i = 0; }\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void uninitvar_static() { // #8734
|
void uninitvar_static() { // #8734
|
||||||
|
|
Loading…
Reference in New Issue