diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 359974564..d77ce27d5 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -378,10 +378,14 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value) // Calculations.. else if (parent->isArithmeticalOp() && parent->astOperand1() && parent->astOperand2()) { + const bool known = ((parent->astOperand1()->values.size() == 1U && + parent->astOperand1()->values.front().valueKind == ValueFlow::Value::ValueKind::Known) || + (parent->astOperand2()->values.size() == 1U && + parent->astOperand2()->values.front().valueKind == ValueFlow::Value::ValueKind::Known)); std::list::const_iterator value1, value2; for (value1 = parent->astOperand1()->values.begin(); value1 != parent->astOperand1()->values.end(); ++value1) { for (value2 = parent->astOperand2()->values.begin(); value2 != parent->astOperand2()->values.end(); ++value2) { - if (value1->varId == 0U || value2->varId == 0U || + if (known || value1->varId == 0U || value2->varId == 0U || (value1->varId == value2->varId && value1->varvalue == value2->varvalue)) { ValueFlow::Value result(0); result.condition = value1->condition ? value1->condition : value2->condition; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index ece65b843..99994cb88 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -218,12 +218,7 @@ private: void valueFlowCalculations() { const char *code; - /* - code = "void f() {\n" - " x = 123+456;\n" - "}"; - ASSERT_EQUALS(579, valueOfTok(code, "+").intvalue); - */ + code = "void f(int x) {\n" " a = x+456;\n" " if (x==123) {}" @@ -252,6 +247,14 @@ private: ASSERT_EQUALS(4, values.front().intvalue); ASSERT_EQUALS(16, values.back().intvalue); + // addition of different variables with known values + code = "int f(int x) {\n" + " int a = 1;\n" + " while (x!=3) { x+=a; }\n" + " return x/a;\n" + "}\n"; + ASSERT_EQUALS(3, valueOfTok(code, "/").intvalue); + // ? : code = "x = y ? 2 : 3;\n"; values = tokenValues(code,"?");