Fix issue 9367: FP knownConditionTrueFalse (#2209)

This commit is contained in:
Paul Fultz II 2019-09-24 01:15:03 -05:00 committed by amai2012
parent c1ff3419a6
commit 0df4876059
2 changed files with 15 additions and 4 deletions

View File

@ -766,12 +766,10 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti
parent->astOperand1() && parent->astOperand1() &&
parent->astOperand2()) { parent->astOperand2()) {
// Dont compare impossible values const bool noninvertible = parent->isComparisonOp() || Token::Match(parent, "%|/|&|%or%");
if (parent->isComparisonOp() && value.isImpossible())
return;
// Skip operators with impossible values that are not invertible // Skip operators with impossible values that are not invertible
if (Token::Match(parent, "%|/|&|%or%") && value.isImpossible()) if (noninvertible && value.isImpossible())
return; return;
// known result when a operand is 0. // known result when a operand is 0.
@ -793,11 +791,15 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti
} }
for (const ValueFlow::Value &value1 : parent->astOperand1()->values()) { for (const ValueFlow::Value &value1 : parent->astOperand1()->values()) {
if (noninvertible && value1.isImpossible())
continue;
if (!value1.isIntValue() && !value1.isFloatValue() && !value1.isTokValue()) if (!value1.isIntValue() && !value1.isFloatValue() && !value1.isTokValue())
continue; continue;
if (value1.isTokValue() && (!parent->isComparisonOp() || value1.tokvalue->tokType() != Token::eString)) if (value1.isTokValue() && (!parent->isComparisonOp() || value1.tokvalue->tokType() != Token::eString))
continue; continue;
for (const ValueFlow::Value &value2 : parent->astOperand2()->values()) { for (const ValueFlow::Value &value2 : parent->astOperand2()->values()) {
if (noninvertible && value2.isImpossible())
continue;
if (!value2.isIntValue() && !value2.isFloatValue() && !value2.isTokValue()) if (!value2.isIntValue() && !value2.isFloatValue() && !value2.isTokValue())
continue; continue;
if (value2.isTokValue() && (!parent->isComparisonOp() || value2.tokvalue->tokType() != Token::eString || value1.isTokValue())) if (value2.isTokValue() && (!parent->isComparisonOp() || value2.tokvalue->tokType() != Token::eString || value1.isTokValue()))

View File

@ -3312,6 +3312,15 @@ private:
" }\n" " }\n"
"}\n"); "}\n");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// #9367
check("void f(long x) {\n"
" if (x <= 0L)\n"
" return;\n"
" if (x % 360L == 0)\n"
" return;\n"
"}\n");
ASSERT_EQUALS("", errout.str());
} }
void alwaysTrueContainer() { void alwaysTrueContainer() {