ValueFlow: Dont try to evaluate '/=0;'
This commit is contained in:
parent
7fba6ecef1
commit
f10634c021
|
@ -1684,17 +1684,24 @@ static bool valueFlowForward(Token * const startToken,
|
|||
// Erase values that are not int values..
|
||||
for (it = values.begin(); it != values.end();) {
|
||||
if (it->isIntValue()) {
|
||||
bool ub = false;
|
||||
if (assign == "+=")
|
||||
it->intvalue += rhsValue.intvalue;
|
||||
else if (assign == "-=")
|
||||
it->intvalue -= rhsValue.intvalue;
|
||||
else if (assign == "*=")
|
||||
it->intvalue *= rhsValue.intvalue;
|
||||
else if (assign == "/=")
|
||||
else if (assign == "/=") {
|
||||
if (rhsValue.intvalue == 0)
|
||||
ub = true;
|
||||
else
|
||||
it->intvalue /= rhsValue.intvalue;
|
||||
else if (assign == "%=")
|
||||
} else if (assign == "%=") {
|
||||
if (rhsValue.intvalue == 0)
|
||||
ub = true;
|
||||
else
|
||||
it->intvalue %= rhsValue.intvalue;
|
||||
else if (assign == "&=")
|
||||
} else if (assign == "&=")
|
||||
it->intvalue &= rhsValue.intvalue;
|
||||
else if (assign == "|=")
|
||||
it->intvalue |= rhsValue.intvalue;
|
||||
|
@ -1704,6 +1711,9 @@ static bool valueFlowForward(Token * const startToken,
|
|||
values.clear();
|
||||
break;
|
||||
}
|
||||
if (ub)
|
||||
it = values.erase(it);
|
||||
else
|
||||
++it;
|
||||
} else if (it->isFloatValue()) {
|
||||
if (assign == "+=")
|
||||
|
|
|
@ -1746,6 +1746,13 @@ private:
|
|||
"}";
|
||||
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"
|
||||
" float x = 123.45;\n"
|
||||
" x += 67;\n"
|
||||
|
|
Loading…
Reference in New Issue