diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 5a804189a..7967b5586 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -240,7 +240,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken, if (tok->varId() > 0) { const std::map::iterator var = alloctype.find(tok->varId()); if (var != alloctype.end()) { - if (var->second == "dealloc" && !Token::Match(tok->previous(), "[;{},] %var% =")) { + if (var->second == "dealloc" && !Token::Match(tok->previous(), "[;{},=] %var% =")) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo->erase(tok->varId()); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index afeec8a3c..4a427787a 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -50,6 +50,7 @@ private: TEST_CASE(deallocuse3); TEST_CASE(deallocuse4); TEST_CASE(deallocuse5); // #4018: FP. free(p), p = 0; + TEST_CASE(deallocuse6); // #4034: FP. x = p = f(); TEST_CASE(doublefree1); TEST_CASE(doublefree2); @@ -264,6 +265,14 @@ private: ASSERT_EQUALS("", errout.str()); } + void deallocuse6() { // #4034 + check("void f(char *p) {\n" + " free(p);\n" + " x = p = foo();\n" // <- p is not dereferenced + "}"); + ASSERT_EQUALS("", errout.str()); + } + void doublefree1() { // #3895 check("void f(char *p) {\n" " if (x)\n"