From c1961cec1cbd4127b0c46d74425d7f0a9cf17bb4 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Sat, 21 Sep 2019 12:53:54 -0500 Subject: [PATCH] Fix issue 9362: FP: (style) Condition '(v&1)==0' is always false (#2200) --- lib/valueflow.cpp | 4 ++++ test/testcondition.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 09b31d1e4..893bafb25 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -770,6 +770,10 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti if (parent->isComparisonOp() && value.isImpossible()) return; + // Skip operators with impossible values that are not invertible + if (Token::Match(parent, "%|/|&|%or%") && value.isImpossible()) + return; + // known result when a operand is 0. if (Token::Match(parent, "[&*]") && value.isKnown() && value.isIntValue() && value.intvalue==0) { setTokenValue(parent, value, settings); diff --git a/test/testcondition.cpp b/test/testcondition.cpp index be3580b95..1a9ba624b 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -3294,6 +3294,16 @@ private: " else if (isdigit(c) != 0) {}\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + // #9362 + check("uint8_t g();\n" + "void f() {\n" + " const uint8_t v = g();\n" + " if((v != 0x00)) {\n" + " if( (v & 0x01) == 0x00) {}\n" + " }\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void alwaysTrueContainer() {