Fixed #6826 (False positive: ValueFlow conditional value used in condition)
This commit is contained in:
parent
a4a866ab07
commit
7ccd30362c
|
@ -354,6 +354,7 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value)
|
|||
}
|
||||
|
||||
ValueFlow::Value v(value);
|
||||
v.conditional = true;
|
||||
|
||||
if (!variables.empty())
|
||||
v.varId = *(variables.begin());
|
||||
|
@ -897,6 +898,7 @@ static bool valueFlowForward(Token * const startToken,
|
|||
if (tok3->varId() == varid) {
|
||||
for (std::list<ValueFlow::Value>::const_iterator it = values.begin(); it != values.end(); ++it)
|
||||
setTokenValue(tok3, *it);
|
||||
} else if (Token::Match(tok3, "%oror%|&&|?")) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1143,9 +1145,20 @@ static bool valueFlowForward(Token * const startToken,
|
|||
}
|
||||
|
||||
{
|
||||
// Is variable usage protected by && || ?:
|
||||
const Token *tok3 = tok2;
|
||||
const Token *parent = tok3->astParent();
|
||||
while (parent && !Token::Match(parent, "%oror%|&&|:")) {
|
||||
tok3 = parent;
|
||||
parent = parent->astParent();
|
||||
}
|
||||
const bool conditional = parent && (parent->str() == ":" || parent->astOperand2() == tok3);
|
||||
|
||||
std::list<ValueFlow::Value>::const_iterator it;
|
||||
for (it = values.begin(); it != values.end(); ++it)
|
||||
setTokenValue(tok2, *it);
|
||||
for (it = values.begin(); it != values.end(); ++it) {
|
||||
if (!conditional || !it->conditional)
|
||||
setTokenValue(tok2, *it);
|
||||
}
|
||||
}
|
||||
|
||||
// increment/decrement
|
||||
|
|
|
@ -913,6 +913,12 @@ private:
|
|||
"}";
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 8U, 0));
|
||||
|
||||
code = "void f(int a) {\n" // #6826
|
||||
" int x = a ? a : 87;\n"
|
||||
" if (a && x) {}\n"
|
||||
"}";
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 87));
|
||||
|
||||
// pointer/reference to x
|
||||
code = "int f(void) {\n"
|
||||
" int x = 2;\n"
|
||||
|
|
Loading…
Reference in New Issue