Skip to content

Commit fd26bad

Browse files
committed
AssignIf: Improved handling of function calls
1 parent f420de2 commit fd26bad

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

lib/checkassignif.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,22 @@ bool CheckAssignIf::assignIfParseScope(const Token * const assignTok,
9999
}
100100
return true;
101101
}
102-
if (Token::Match(tok2, "[(,] &| %varid% [,)]", varid))
103-
// TODO: don't bailout if variable is passed by value
104-
return true;
102+
if (Token::Match(tok2, "[(,] &| %varid% [,)]", varid)) {
103+
unsigned int argumentNumber = 0;
104+
const Token *ftok;
105+
for (ftok = tok2; ftok && ftok->str() != "("; ftok = ftok->previous()) {
106+
if (ftok->str() == ")")
107+
ftok = ftok->link();
108+
else if (ftok->str() == ",")
109+
argumentNumber++;
110+
}
111+
ftok = ftok ? ftok->previous() : NULL;
112+
if (!(ftok && ftok->function()))
113+
return true;
114+
const Variable *par = ftok->function()->getArgumentVar(argumentNumber);
115+
if (par == NULL || par->isReference() || par->isPointer())
116+
return true;
117+
}
105118
if (tok2->str() == "}")
106119
return false;
107120
if (Token::Match(tok2, "break|continue|return"))

test/testassignif.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ class TestAssignIf : public TestFixture {
169169
check("void do_something(int);\n"
170170
"void f(int x) {\n"
171171
" int y = x & 7;\n"
172-
" do_something(y);\n" // passing variable by value => error
172+
" do_something(y);\n"
173173
" if (y==8);\n"
174174
"}");
175-
TODO_ASSERT_EQUALS("error", "", errout.str());
175+
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout.str());
176176

177177
check("void f(int x) {\n"
178178
" extern int y; y = x & 7;\n"

0 commit comments

Comments
 (0)