ValueFlow: Handle compound assignments in execute()
This commit is contained in:
parent
d0b2dd0b93
commit
11e32ff445
|
@ -3766,12 +3766,39 @@ static void execute(const Token *expr,
|
|||
*result = result1 != result2;
|
||||
}
|
||||
|
||||
else if (expr->str() == "=") {
|
||||
else if (expr->isAssignmentOp()) {
|
||||
execute(expr->astOperand2(), programMemory, result, error);
|
||||
if (!*error && expr->astOperand1() && expr->astOperand1()->varId())
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), *result);
|
||||
else
|
||||
if (!expr->astOperand1() || !expr->astOperand1()->varId())
|
||||
*error = true;
|
||||
if (*error)
|
||||
return;
|
||||
|
||||
if (expr->str() == "=") {
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), *result);
|
||||
return;
|
||||
}
|
||||
|
||||
long long intValue;
|
||||
if (!programMemory->getIntValue(expr->astOperand1()->varId(), &intValue)) {
|
||||
*error = true;
|
||||
return;
|
||||
}
|
||||
if (expr->str() == "+=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue + *result);
|
||||
else if (expr->str() == "-=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue - *result);
|
||||
else if (expr->str() == "*=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue * *result);
|
||||
else if (expr->str() == "/=" && *result != 0)
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue / *result);
|
||||
else if (expr->str() == "%=" && *result != 0)
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue % *result);
|
||||
else if (expr->str() == "&=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue & *result);
|
||||
else if (expr->str() == "|=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue | *result);
|
||||
else if (expr->str() == "^=")
|
||||
programMemory->setIntValue(expr->astOperand1()->varId(), intValue ^ *result);
|
||||
}
|
||||
|
||||
else if (Token::Match(expr, "++|--")) {
|
||||
|
|
|
@ -2558,6 +2558,13 @@ private:
|
|||
"}";
|
||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 9));
|
||||
|
||||
code = "void f() {\n"
|
||||
" for (int x = 0; x < 5; x += 2)\n"
|
||||
" a[x] = 0;\n"
|
||||
"}";
|
||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 0));
|
||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 4));
|
||||
|
||||
code = "void f() {\n"
|
||||
" for (int x = 0; x < 10; x = x + 2)\n"
|
||||
" a[x] = 0;\n"
|
||||
|
|
Loading…
Reference in New Issue