diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 6752e6216..fbd220739 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -766,12 +766,10 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti parent->astOperand1() && parent->astOperand2()) { - // Dont compare impossible values - if (parent->isComparisonOp() && value.isImpossible()) - return; + const bool noninvertible = parent->isComparisonOp() || Token::Match(parent, "%|/|&|%or%"); // Skip operators with impossible values that are not invertible - if (Token::Match(parent, "%|/|&|%or%") && value.isImpossible()) + if (noninvertible && value.isImpossible()) return; // 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()) { + if (noninvertible && value1.isImpossible()) + continue; if (!value1.isIntValue() && !value1.isFloatValue() && !value1.isTokValue()) continue; if (value1.isTokValue() && (!parent->isComparisonOp() || value1.tokvalue->tokType() != Token::eString)) continue; for (const ValueFlow::Value &value2 : parent->astOperand2()->values()) { + if (noninvertible && value2.isImpossible()) + continue; if (!value2.isIntValue() && !value2.isFloatValue() && !value2.isTokValue()) continue; if (value2.isTokValue() && (!parent->isComparisonOp() || value2.tokvalue->tokType() != Token::eString || value1.isTokValue())) diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 743c3fedf..beaa5a6ff 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -3312,6 +3312,15 @@ private: " }\n" "}\n"); 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() {