Value Flow: Improved abstract interpretation of arithmetical expressions
This commit is contained in:
parent
77c871035b
commit
b6276058da
|
@ -663,6 +663,22 @@ static void execute(const Token *expr,
|
|||
}
|
||||
}
|
||||
|
||||
else if (expr->isArithmeticalOp() && expr->astOperand1() && expr->astOperand2()) {
|
||||
MathLib::bigint result1, result2;
|
||||
execute(expr->astOperand1(), programMemory, &result1, error);
|
||||
execute(expr->astOperand2(), programMemory, &result2, error);
|
||||
if (expr->str() == "+")
|
||||
*result = result1 + result2;
|
||||
else if (expr->str() == "-")
|
||||
*result = result1 - result2;
|
||||
else if (expr->str() == "*")
|
||||
*result = result1 * result2;
|
||||
else if (expr->str() == "/")
|
||||
*result = result1 / result2;
|
||||
else if (expr->str() == "%")
|
||||
*result = result1 % result2;
|
||||
}
|
||||
|
||||
else if (expr->str() == "&&") {
|
||||
execute(expr->astOperand1(), programMemory, result, error);
|
||||
if (*error || *result == 0)
|
||||
|
|
|
@ -830,7 +830,8 @@ private:
|
|||
" for (int i = 0; i < 4; i+=2)\n"
|
||||
" a[i] = 0;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: a\n", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: a\n"
|
||||
"[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout.str());
|
||||
|
||||
check("void f() {\n" // #4398
|
||||
" int a[2];\n"
|
||||
|
|
|
@ -626,6 +626,14 @@ private:
|
|||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 9));
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 10));
|
||||
|
||||
code = "void f() {\n"
|
||||
" for (int x = 0; x < 10; x = x + 2)\n"
|
||||
" a[x] = 0;\n"
|
||||
"}";
|
||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 0));
|
||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 8));
|
||||
ASSERT_EQUALS(false, testValueOfX(code, 3U, 10));
|
||||
|
||||
code = "void f() {\n"
|
||||
" for (int x = 0; x < 10; x++)\n"
|
||||
" x<4 ?\n"
|
||||
|
|
Loading…
Reference in New Issue