diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 14b9b47eb..6b02301af 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -1046,10 +1046,10 @@ void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpenin changeAllocStatus(varInfo, sp_allocation, vtok, vtok); } else { const Token* const nextArg = funcArg->nextArgument(); - do { + while (arg && ((nextArg && arg != nextArg) || (!nextArg && arg != tokOpeningPar->link()))) { checkTokenInsideExpression(arg, varInfo, /*inFuncCall*/ isLeakIgnore); arg = arg->next(); - } while ((nextArg && arg != nextArg) || (!nextArg && arg != tokOpeningPar->link())); + } } // TODO: check each token in argument expression (could contain multiple variables) argNr++; diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 280c42834..e2ef3b585 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -981,6 +981,11 @@ private: ASSERT_EQUALS("[test.c:4]: (error) Dereferencing 'p' after it is deallocated / released\n" "[test.c:7] -> [test.c:8]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout.str()); + + check("void f() {\n" + " FOREACH(callables, ());\n" + "}\n"); + ASSERT_EQUALS("[test.c:2]: (information) --check-library: Function FOREACH() should have configuration\n", errout.str()); // don't crash } void doublefree1() { // #3895