ValueFlow: Dont try to evaluate '/=0;'

This commit is contained in:
Daniel Marjamäki 2017-08-23 17:52:28 +02:00
parent 7fba6ecef1
commit f10634c021
2 changed files with 23 additions and 6 deletions

View File

@ -1684,17 +1684,24 @@ static bool valueFlowForward(Token * const startToken,
// Erase values that are not int values.. // Erase values that are not int values..
for (it = values.begin(); it != values.end();) { for (it = values.begin(); it != values.end();) {
if (it->isIntValue()) { if (it->isIntValue()) {
bool ub = false;
if (assign == "+=") if (assign == "+=")
it->intvalue += rhsValue.intvalue; it->intvalue += rhsValue.intvalue;
else if (assign == "-=") else if (assign == "-=")
it->intvalue -= rhsValue.intvalue; it->intvalue -= rhsValue.intvalue;
else if (assign == "*=") else if (assign == "*=")
it->intvalue *= rhsValue.intvalue; it->intvalue *= rhsValue.intvalue;
else if (assign == "/=") else if (assign == "/=") {
if (rhsValue.intvalue == 0)
ub = true;
else
it->intvalue /= rhsValue.intvalue; it->intvalue /= rhsValue.intvalue;
else if (assign == "%=") } else if (assign == "%=") {
if (rhsValue.intvalue == 0)
ub = true;
else
it->intvalue %= rhsValue.intvalue; it->intvalue %= rhsValue.intvalue;
else if (assign == "&=") } else if (assign == "&=")
it->intvalue &= rhsValue.intvalue; it->intvalue &= rhsValue.intvalue;
else if (assign == "|=") else if (assign == "|=")
it->intvalue |= rhsValue.intvalue; it->intvalue |= rhsValue.intvalue;
@ -1704,6 +1711,9 @@ static bool valueFlowForward(Token * const startToken,
values.clear(); values.clear();
break; break;
} }
if (ub)
it = values.erase(it);
else
++it; ++it;
} else if (it->isFloatValue()) { } else if (it->isFloatValue()) {
if (assign == "+=") if (assign == "+=")

View File

@ -1746,6 +1746,13 @@ private:
"}"; "}";
ASSERT_EQUALS(true, testValueOfX(code, 4U, 166)); ASSERT_EQUALS(true, testValueOfX(code, 4U, 166));
code = "void f() {\n"
" int x = 123;\n"
" x /= 0;\n" // don't crash when evaluating x/=0
" return x;\n"
"}";
ASSERT_EQUALS(false, testValueOfX(code, 4U, 123));
code = "void f() {\n" code = "void f() {\n"
" float x = 123.45;\n" " float x = 123.45;\n"
" x += 67;\n" " x += 67;\n"