diff --git a/CheckMemoryLeak.cpp b/CheckMemoryLeak.cpp index 3fa975c03..4415fb32d 100644 --- a/CheckMemoryLeak.cpp +++ b/CheckMemoryLeak.cpp @@ -391,6 +391,12 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list if (dealloctype!=No && dealloctype!=alloc) MismatchError(tok, callstack, varname); alloctype = alloc; + } + + // assignment.. + else + { + addtoken( "assign" ); } } @@ -508,9 +514,10 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list if ( tok->str() == "throw" ) addtoken("throw"); - // Assignment.. - if ( TOKEN::Match(tok,"[)=] %var1% [;)]", varnames) ) - addtoken("use"); + // Assignment.. + if ( TOKEN::Match(tok,"[)=] %var1% [;)]", varnames) || + TOKEN::Match(tok, "%var1% +=|-=", varnames) ) + addtoken("use"); // Investigate function calls.. if ( TOKEN::Match(tok, "%var% (") ) @@ -971,45 +978,20 @@ void CheckMemoryLeakClass::CheckMemoryLeak_CheckScope( const TOKEN *Tok1, const MemoryLeak(TOKEN::findmatch(tok, "loop alloc ;"), varname); } - else if ( TOKEN::findmatch(tok, "alloc ; if continue ;") ) + else if ( TOKEN::findmatch(tok, "alloc ; if break|continue|return ;") ) { // MemoryLeak(Tokenizer::gettok(TOKEN::findmatch(tok, "alloc ; if continue ;"), 3), varname); - MemoryLeak((TOKEN::findmatch(tok, "alloc ; if continue ;"))->tokAt(3), varname); + MemoryLeak((TOKEN::findmatch(tok, "alloc ; if break|continue|return ;"))->tokAt(3), varname); } - else if ( TOKEN::findmatch(tok, "alloc ; if break ;") ) + else if ( _settings._showAll && TOKEN::findmatch(tok, "alloc ; ifv break|continue|return ;") ) { - MemoryLeak((TOKEN::findmatch(tok, "alloc ; if break ;"))->tokAt(3), varname); + MemoryLeak((TOKEN::findmatch(tok, "alloc ; ifv break|continue|return ;"))->tokAt(3), varname); } - else if ( TOKEN::findmatch(tok, "alloc ; if return ;") ) + else if ( TOKEN::findmatch(tok, "alloc ; alloc|assign|return ;") ) { - MemoryLeak((TOKEN::findmatch(tok, "alloc ; if return ;"))->tokAt(3), varname); - } - - else if ( _settings._showAll && TOKEN::findmatch(tok, "alloc ; ifv continue ;") ) - { - MemoryLeak((TOKEN::findmatch(tok, "alloc ; ifv continue ;"))->tokAt(3), varname); - } - - else if ( _settings._showAll && TOKEN::findmatch(tok, "alloc ; ifv break ;") ) - { - MemoryLeak((TOKEN::findmatch(tok, "alloc ; ifv break ;"))->tokAt(3), varname); - } - - else if ( _settings._showAll && TOKEN::findmatch(tok, "alloc ; ifv return ;") ) - { - MemoryLeak((TOKEN::findmatch(tok, "alloc ; ifv return ;"))->tokAt(3), varname); - } - - else if ( TOKEN::findmatch(tok, "alloc ; return ;") ) - { - MemoryLeak((TOKEN::findmatch(tok,"alloc ; return ;"))->tokAt(2), varname); - } - - else if ( TOKEN::findmatch(tok, "alloc ; alloc") ) - { - MemoryLeak((TOKEN::findmatch(tok,"alloc ; alloc"))->tokAt(2), varname); + MemoryLeak((TOKEN::findmatch(tok,"alloc ; alloc|assign|return ;"))->tokAt(2), varname); } else if ( ! TOKEN::findmatch(tok,"dealloc") && diff --git a/testmemleak.cpp b/testmemleak.cpp index 8ac60fe30..b4f0e5a77 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -125,7 +125,9 @@ private: TEST_CASE( sizeof1 ); TEST_CASE( realloc1 ); - TEST_CASE( realloc2 ); + TEST_CASE( realloc2 ); + + TEST_CASE( assign ); } @@ -992,6 +994,36 @@ private: ASSERT_EQUALS( std::string(""), errout.str() ); } + + void assign() + { + check( "void foo()\n" + "{\n" + " char *a = (char *)malloc(10);\n" + " a = 0;\n" + " free(a);\n" + "}\n" ); + + ASSERT_EQUALS( std::string("[test.cpp:3]: Memory leak: a\n"), errout.str() ); + + check( "void foo()\n" + "{\n" + " char *a = (char *)malloc(10);\n" + " char *p = a;\n" + " free(p);\n" + "}\n" ); + + ASSERT_EQUALS( std::string(""), errout.str() ); + + check( "void foo()\n" + "{\n" + " char *a = (char *)malloc(10);\n" + " a += 10;\n" + " free(a - 10);\n" + "}\n" ); + + ASSERT_EQUALS( std::string(""), errout.str() ); + } };