diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 60ce8dc8a..0b5edd594 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -229,21 +229,21 @@ static bool isPointerReleased(const Token *startToken, const Token *endToken, no return false; } -static bool checkVariable(const Token *varTok, const bool isCpp) +static bool isLocalVarNoAutoDealloc(const Token *varTok, const bool isCpp) { // not a local variable nor argument? const Variable *var = varTok->variable(); - if (var && !var->isArgument() && (!var->isLocal() || var->isStatic())) + if (!var) + return true; + if (!var->isArgument() && (!var->isLocal() || var->isStatic())) return false; // Don't check reference variables - if (var && var->isReference()) + if (var->isReference()) return false; // non-pod variable if (isCpp) { - if (!var) - return false; // Possibly automatically deallocated memory if (isAutoDealloc(var) && Token::Match(varTok, "%var% = new")) return false; @@ -365,7 +365,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, leakIfAllocated(varTok, *varInfo); varInfo->erase(varTok->varId()); - if (!checkVariable(varTok, mTokenizer->isCPP())) + if (!isLocalVarNoAutoDealloc(varTok, mTokenizer->isCPP())) continue; // allocation? @@ -405,7 +405,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, for (const Token *innerTok = tok->tokAt(2); innerTok && innerTok != closingParenthesis; innerTok = innerTok->next()) { // TODO: replace with checkTokenInsideExpression() - if (!checkVariable(innerTok, mTokenizer->isCPP())) + if (!isLocalVarNoAutoDealloc(innerTok, mTokenizer->isCPP())) continue; if (Token::Match(innerTok, "%var% =") && innerTok->astParent() == innerTok->next()) { diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 610cd966d..dedde87e5 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -1767,19 +1767,27 @@ private: } void configuration3() { - check("void f() {\n" - " char *p = malloc(10);\n" - " if (set_data(p)) { }\n" - "}"); + const char * code = "void f() {\n" + " char *p = malloc(10);\n" + " if (set_data(p)) { }\n" + "}"; + check(code); ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n", errout.str()); + check(code, true); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function set_data() should have / configuration\n", errout.str()); - check("void f() {\n" - " char *p = malloc(10);\n" - " if (set_data(p)) { return; }\n" - "}"); + code = "void f() {\n" + " char *p = malloc(10);\n" + " if (set_data(p)) { return; }\n" + "}"; + check(code); ASSERT_EQUALS("[test.c:3]: (information) --check-library: Function set_data() should have / configuration\n" "[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n" , errout.str()); + check(code, true); + ASSERT_EQUALS("[test.cpp:3]: (information) --check-library: Function set_data() should have / configuration\n" + "[test.cpp:4]: (information) --check-library: Function set_data() should have / configuration\n" + , errout.str()); } void configuration4() {