diff --git a/CheckMemoryLeak.cpp b/CheckMemoryLeak.cpp index bc98aba75..035fc26db 100644 --- a/CheckMemoryLeak.cpp +++ b/CheckMemoryLeak.cpp @@ -52,7 +52,7 @@ static bool isclass( const std::string &typestr ) return false; std::ostringstream pattern; - pattern << "struct " << typestr << " [;{]"; + pattern << "struct " << typestr; if ( findmatch( tokens, pattern.str().c_str() ) ) return false; @@ -203,12 +203,12 @@ static void instoken(TOKEN *tok, const char str[]) static bool notvar(const TOKEN *tok, const char *varnames[]) { - return bool( Match(tok, "! %var1%", varnames) || + return bool( Match(tok, "! %var1% [;)&|]", varnames) || Match(tok, "unlikely ( ! %var1% )", varnames) || Match(tok, "unlikely ( %var1% == NULL )", varnames) || Match(tok, "%var1% == NULL", varnames) || - Match(tok, "NULL == %var1%", varnames) || - Match(tok, "%var1% == 0", varnames) ); + Match(tok, "NULL == %var1% [;)&|]", varnames) || + (!Match(tok,".") && Match(tok->next, "%var1% == 0", varnames)) ); } diff --git a/testmemleak.cpp b/testmemleak.cpp index b12df22c5..8f52271e3 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -82,7 +82,8 @@ private: TEST_CASE( switch1 ); TEST_CASE( switch2 ); - TEST_CASE( ret ); + TEST_CASE( ret1 ); + TEST_CASE( ret2 ); TEST_CASE( mismatch1 ); @@ -463,7 +464,7 @@ private: - void ret() + void ret1() { check( "char *f( char **str )\n" "{\n" @@ -475,6 +476,20 @@ private: } + void ret2() + { + check( "void foo()\n" + "{\n" + " struct ABC *abc = new ABC;\n" + " abc->a = new char[10];\n" + " if ( ! abc->a )\n" + " return;\n" + " delete [] abc->a;\n" + " delete abc;\n" + "}\n" ); + + ASSERT_EQUALS( std::string("[test.cpp:6]: Memory leak: abc\n"), errout.str() ); + }