Fixed #6917 (False positive uninitvar - unused array declaration and ternary expression)
This commit is contained in:
parent
d7d11332cd
commit
6ddd0a953f
|
@ -220,18 +220,20 @@ static bool isVariableUsed(const Token *tok, const Variable& var)
|
||||||
return false;
|
return false;
|
||||||
if (tok->isConstOp())
|
if (tok->isConstOp())
|
||||||
return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var);
|
return isVariableUsed(tok->astOperand1(),var) || isVariableUsed(tok->astOperand2(),var);
|
||||||
if (var.isArray()) {
|
if (tok->varId() != var.declarationId())
|
||||||
const Token *parent = tok->astParent();
|
return false;
|
||||||
while (Token::Match(parent, "[?:]"))
|
if (!var.isArray())
|
||||||
parent = parent->astParent();
|
return true;
|
||||||
// no dereference, then array is not "used"
|
|
||||||
if (!Token::Match(parent, "*|["))
|
const Token *parent = tok->astParent();
|
||||||
return false;
|
while (Token::Match(parent, "[?:]"))
|
||||||
const Token *parent2 = parent->astParent();
|
parent = parent->astParent();
|
||||||
// TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays
|
// no dereference, then array is not "used"
|
||||||
return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent);
|
if (!Token::Match(parent, "*|["))
|
||||||
}
|
return false;
|
||||||
return (tok->varId() == var.declarationId());
|
const Token *parent2 = parent->astParent();
|
||||||
|
// TODO: handle function calls. There is a TODO assertion in TestUninitVar::uninitvar_arrays
|
||||||
|
return !parent2 || parent2->isConstOp() || (parent2->str() == "=" && parent2->astOperand2() == parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar)
|
bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var, bool * const possibleInit, bool * const noreturn, Alloc* const alloc, const std::string &membervar)
|
||||||
|
|
|
@ -1281,6 +1281,12 @@ private:
|
||||||
"}");
|
"}");
|
||||||
TODO_ASSERT_EQUALS("error", "", errout.str());
|
TODO_ASSERT_EQUALS("error", "", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void f(int x) {\n"
|
||||||
|
" int a[2];\n"
|
||||||
|
" y *= (x ? 1 : 2);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
// passing array to library functions
|
// passing array to library functions
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue