From f7ddd7a35da032a6377292d86aad699734188a02 Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Tue, 24 Aug 2021 21:51:54 -0500 Subject: [PATCH] Fix 10430: FP knownConditionTrueFalse with bool from unsigned char (#3416) --- lib/valueflow.cpp | 13 +++++++------ test/testvalueflow.cpp | 10 ++++++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 1d663c494..13d9520cb 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4716,12 +4716,13 @@ static void valueFlowForwardAssign(Token* const tok, } if (tokenlist->isCPP() && vars.size() == 1 && Token::Match(vars.front()->typeStartToken(), "bool|_Bool")) { - std::list::iterator it; - for (it = values.begin(); it != values.end(); ++it) { - if (it->isIntValue()) - it->intvalue = (it->intvalue != 0); - if (it->isTokValue()) - it->intvalue = (it->tokvalue != nullptr); + for (ValueFlow::Value& value : values) { + if (value.isImpossible()) + continue; + if (value.isIntValue()) + value.intvalue = (value.intvalue != 0); + if (value.isTokValue()) + value.intvalue = (value.tokvalue != nullptr); } } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 2348d7ecd..3a9cb9eed 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -2434,6 +2434,16 @@ private: "}\n"; ASSERT_EQUALS(true, testValueOfX(code, 12U, 0)); ASSERT_EQUALS(false, testValueOfXKnown(code, 12U, 0)); + + code = "bool f(unsigned char uc) {\n" + " const bool x = uc;\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXImpossible(code, 3U, -1)); + ASSERT_EQUALS(false, testValueOfXKnown(code, 3U, 1)); + ASSERT_EQUALS(false, testValueOfXKnown(code, 3U, 0)); + ASSERT_EQUALS(false, testValueOfXImpossible(code, 3U, 0)); + ASSERT_EQUALS(false, testValueOfXImpossible(code, 3U, 1)); } void valueFlowAfterCondition() {