ValueFlow: Evaluate more calculations when operands have known values
This commit is contained in:
parent
3daabbcc3b
commit
5aa0b284dc
|
@ -378,10 +378,14 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value)
|
||||||
|
|
||||||
// Calculations..
|
// Calculations..
|
||||||
else if (parent->isArithmeticalOp() && parent->astOperand1() && parent->astOperand2()) {
|
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<ValueFlow::Value>::const_iterator value1, value2;
|
std::list<ValueFlow::Value>::const_iterator value1, value2;
|
||||||
for (value1 = parent->astOperand1()->values.begin(); value1 != parent->astOperand1()->values.end(); ++value1) {
|
for (value1 = parent->astOperand1()->values.begin(); value1 != parent->astOperand1()->values.end(); ++value1) {
|
||||||
for (value2 = parent->astOperand2()->values.begin(); value2 != parent->astOperand2()->values.end(); ++value2) {
|
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)) {
|
(value1->varId == value2->varId && value1->varvalue == value2->varvalue)) {
|
||||||
ValueFlow::Value result(0);
|
ValueFlow::Value result(0);
|
||||||
result.condition = value1->condition ? value1->condition : value2->condition;
|
result.condition = value1->condition ? value1->condition : value2->condition;
|
||||||
|
|
|
@ -218,12 +218,7 @@ private:
|
||||||
|
|
||||||
void valueFlowCalculations() {
|
void valueFlowCalculations() {
|
||||||
const char *code;
|
const char *code;
|
||||||
/*
|
|
||||||
code = "void f() {\n"
|
|
||||||
" x = 123+456;\n"
|
|
||||||
"}";
|
|
||||||
ASSERT_EQUALS(579, valueOfTok(code, "+").intvalue);
|
|
||||||
*/
|
|
||||||
code = "void f(int x) {\n"
|
code = "void f(int x) {\n"
|
||||||
" a = x+456;\n"
|
" a = x+456;\n"
|
||||||
" if (x==123) {}"
|
" if (x==123) {}"
|
||||||
|
@ -252,6 +247,14 @@ private:
|
||||||
ASSERT_EQUALS(4, values.front().intvalue);
|
ASSERT_EQUALS(4, values.front().intvalue);
|
||||||
ASSERT_EQUALS(16, values.back().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";
|
code = "x = y ? 2 : 3;\n";
|
||||||
values = tokenValues(code,"?");
|
values = tokenValues(code,"?");
|
||||||
|
|
Loading…
Reference in New Issue