Fixed #9649 (False positive: uninitialized struct member)
This commit is contained in:
parent
c04a73f6d8
commit
4779cb124e
|
@ -435,20 +435,18 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var
|
|||
const Token *condition = tok->next()->astOperand2();
|
||||
const Token *lhs = condition->astOperand1();
|
||||
const Token *rhs = condition->astOperand2();
|
||||
const Token *vartok = rhs && rhs->isNumber() ? lhs : rhs;
|
||||
const Token *numtok = rhs && rhs->isNumber() ? rhs : lhs;
|
||||
const Token *vartok = (lhs && lhs->hasKnownIntValue()) ? rhs : lhs;
|
||||
const Token *numtok = (lhs == vartok) ? rhs : lhs;
|
||||
while (Token::simpleMatch(vartok, "."))
|
||||
vartok = vartok->astOperand2();
|
||||
if (vartok && vartok->varId() && numtok) {
|
||||
if (vartok && vartok->varId() && numtok && numtok->hasKnownIntValue()) {
|
||||
const std::map<int,VariableValue>::const_iterator it = variableValue.find(vartok->varId());
|
||||
if (it != variableValue.end() && it->second != MathLib::toLongNumber(numtok->str()))
|
||||
if (it != variableValue.end() && it->second != numtok->getKnownIntValue())
|
||||
return true; // this scope is not fully analysed => return true
|
||||
else {
|
||||
condVarId = vartok->varId();
|
||||
condVarValue = VariableValue(MathLib::toLongNumber(numtok->str()));
|
||||
if (condition->str() == "!=")
|
||||
condVarValue = !condVarValue;
|
||||
}
|
||||
condVarId = vartok->varId();
|
||||
condVarValue = VariableValue(numtok->getKnownIntValue());
|
||||
if (condition->str() == "!=")
|
||||
condVarValue = !condVarValue;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2523,6 +2523,19 @@ private:
|
|||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("enum t_err { ERR_NONE, ERR_BAD_ARGS };\n" // #9649
|
||||
"struct box_t { int value; };\n"
|
||||
"int init_box(box_t *p, int v);\n"
|
||||
"\n"
|
||||
"void foo(int ret) {\n"
|
||||
" box_t box2;\n"
|
||||
" if (ret == ERR_NONE)\n"
|
||||
" ret = init_box(&box2, 20);\n"
|
||||
" if (ret == ERR_NONE)\n"
|
||||
" z = x + box2.value;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void f(int x) {\n"
|
||||
" int value;\n"
|
||||
" if (x == 32)\n"
|
||||
|
|
Loading…
Reference in New Issue