Skip to content

Commit 7c93f51

Browse files
Consider pre{inc,dec}rements on assert checks (cppcheck-opensource#2605)
* Consider pre{inc,dec}rements on assert checks * Simplify code by using new AST APIs * Fix assert test with invalid syntax
1 parent 453a69d commit 7c93f51

2 files changed

Lines changed: 19 additions & 9 deletions

File tree

lib/checkassert.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,16 @@ void CheckAssert::assignmentInAssertError(const Token *tok, const std::string& v
120120
// checks if side effects happen on the variable prior to tmp
121121
void CheckAssert::checkVariableAssignment(const Token* assignTok, const Scope *assertionScope)
122122
{
123-
const Variable* prevVar = assignTok->previous()->variable();
124-
if (!prevVar)
123+
if (!assignTok->isAssignmentOp() && assignTok->tokType() != Token::eIncDecOp)
124+
return;
125+
126+
const Variable* var = assignTok->astOperand1()->variable();
127+
if (!var)
125128
return;
126129

127130
// Variable declared in inner scope in assert => don't warn
128-
if (assertionScope != prevVar->scope()) {
129-
const Scope *s = prevVar->scope();
131+
if (assertionScope != var->scope()) {
132+
const Scope *s = var->scope();
130133
while (s && s != assertionScope)
131134
s = s->nestedIn;
132135
if (s == assertionScope)
@@ -135,12 +138,12 @@ void CheckAssert::checkVariableAssignment(const Token* assignTok, const Scope *a
135138

136139
// assignment
137140
if (assignTok->isAssignmentOp() || assignTok->tokType() == Token::eIncDecOp) {
138-
if (prevVar->isConst())
141+
if (var->isConst()) {
139142
return;
140-
141-
assignmentInAssertError(assignTok, prevVar->name());
143+
}
144+
assignmentInAssertError(assignTok, var->name());
142145
}
143-
// TODO: function calls on prevVar
146+
// TODO: function calls on var
144147
}
145148

146149
bool CheckAssert::inSameScope(const Token* returnTok, const Token* assignTok)

test/testassert.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class TestAssert : public TestFixture {
183183
ASSERT_EQUALS("", errout.str());
184184

185185
check("void f(int a, int b) {\n"
186-
" assert(a == 2 && b = 1);\n"
186+
" assert(a == 2 && (b = 1));\n"
187187
" return a;\n"
188188
"}\n"
189189
);
@@ -220,6 +220,13 @@ class TestAssert : public TestFixture {
220220
"}\n");
221221
ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str());
222222

223+
check("void f() {\n"
224+
" int a = 0;\n"
225+
" assert(--a);\n"
226+
" return a;\n"
227+
"}\n");
228+
ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str());
229+
223230
check("void f() {\n"
224231
" assert(std::all_of(first, last, []() {\n"
225232
" auto tmp = x.someValue();\n"

0 commit comments

Comments
 (0)