valueflow: better handling of increment/decrement
This commit is contained in:
parent
18d6285ad2
commit
57d318b2e5
|
@ -184,7 +184,7 @@ static void valueFlowBeforeCondition(TokenList *tokenlist, ErrorLogger *errorLog
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// extra logic for unsigned variables 'i>=1' => possible value can also be 0
|
// extra logic for unsigned variables 'i>=1' => possible value can also be 0
|
||||||
const ValueFlow::Value val(tok, num);
|
ValueFlow::Value val(tok, num);
|
||||||
ValueFlow::Value val2;
|
ValueFlow::Value val2;
|
||||||
if (num==1U && Token::Match(tok,"<=|>=")) {
|
if (num==1U && Token::Match(tok,"<=|>=")) {
|
||||||
bool isunsigned = false;
|
bool isunsigned = false;
|
||||||
|
@ -214,6 +214,17 @@ static void valueFlowBeforeCondition(TokenList *tokenlist, ErrorLogger *errorLog
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// increment/decrement
|
||||||
|
if (Token::Match(tok2->previous(), "[;{}] %var% ++|-- ;"))
|
||||||
|
val.intvalue += (tok2->strAt(1)=="++") ? -1 : 1;
|
||||||
|
else if (Token::Match(tok2->tokAt(-2), "[;{}] ++|-- %var% ;"))
|
||||||
|
val.intvalue += (tok2->strAt(-1)=="++") ? -1 : 1;
|
||||||
|
else if (Token::Match(tok2->previous(), "++|-- %var%") || Token::Match(tok2, "%var% ++|--")) {
|
||||||
|
if (settings->debugwarnings)
|
||||||
|
bailout(tokenlist, errorLogger, tok2, "increment/decrement of " + tok2->str());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// bailout: variable is used in rhs in assignment to itself
|
// bailout: variable is used in rhs in assignment to itself
|
||||||
if (bailoutSelfAssignment(tok2)) {
|
if (bailoutSelfAssignment(tok2)) {
|
||||||
if (settings->debugwarnings)
|
if (settings->debugwarnings)
|
||||||
|
|
|
@ -109,7 +109,7 @@ private:
|
||||||
"}";
|
"}";
|
||||||
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
ASSERT_EQUALS(true, testValueOfX(code, 3U, 123));
|
||||||
|
|
||||||
// assignment
|
// assignment / increment
|
||||||
code = "void f(int x) {\n"
|
code = "void f(int x) {\n"
|
||||||
" x = 2 + x;\n"
|
" x = 2 + x;\n"
|
||||||
" if (x == 65);\n"
|
" if (x == 65);\n"
|
||||||
|
@ -122,6 +122,19 @@ private:
|
||||||
"}";
|
"}";
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 2U, 65));
|
ASSERT_EQUALS(false, testValueOfX(code, 2U, 65));
|
||||||
|
|
||||||
|
code = "void f(int x) {\n"
|
||||||
|
" a[x++] = 0;\n"
|
||||||
|
" if (x == 5);\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(false, testValueOfX(code, 2U, 5));
|
||||||
|
|
||||||
|
code = "void f(int x) {\n"
|
||||||
|
" a = x;\n"
|
||||||
|
" x++;\n"
|
||||||
|
" if (x == 4);\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(true, testValueOfX(code, 2U, 3));
|
||||||
|
|
||||||
// guarding by &&
|
// guarding by &&
|
||||||
code = "void f(int x) {\n"
|
code = "void f(int x) {\n"
|
||||||
" if (!x || \n" // <- x can be 0
|
" if (!x || \n" // <- x can be 0
|
||||||
|
|
Loading…
Reference in New Issue