Memory leak: remove the dealloc in "if dealloc ;" if it's not followed

by an "else". This makes the checking stronger.
This commit is contained in:
Daniel Marjamäki 2008-11-08 07:19:19 +00:00
parent 459711ed00
commit 224b241f9a
2 changed files with 28 additions and 1 deletions

View File

@ -208,7 +208,7 @@ static bool notvar(const TOKEN *tok, const char *varnames[])
Match(tok, "unlikely ( %var1% == NULL )", varnames) || Match(tok, "unlikely ( %var1% == NULL )", varnames) ||
Match(tok, "%var1% == NULL", varnames) || Match(tok, "%var1% == NULL", varnames) ||
Match(tok, "NULL == %var1% [;)&|]", varnames) || Match(tok, "NULL == %var1% [;)&|]", varnames) ||
(!Match(tok,".") && Match(tok->next, "%var1% == 0", varnames)) ); Match(tok->next, "%var1% == 0", varnames) );
} }
@ -552,6 +552,13 @@ static void CheckMemoryLeak_CheckScope( const TOKEN *Tok1, const char varname[]
done = false; done = false;
} }
// Remove "if dealloc ;" if there is no else after it..
if (Match(tok2,"if dealloc ;") && !Match(gettok(tok2,3),"else"))
{
erase( tok2, gettok(tok2, 2) );
done = false;
}
// Replace "loop ;" with ";" // Replace "loop ;" with ";"
if ( Match(tok2->next, "loop ;") ) if ( Match(tok2->next, "loop ;") )
{ {

View File

@ -69,6 +69,10 @@ private:
TEST_CASE( ifelse3 ); TEST_CASE( ifelse3 );
TEST_CASE( ifelse4 ); TEST_CASE( ifelse4 );
TEST_CASE( ifelse5 ); TEST_CASE( ifelse5 );
TEST_CASE( ifelse6 );
TEST_CASE( ifelse7 );
TEST_CASE( ifelse8 );
TEST_CASE( ifelse9 );
TEST_CASE( forwhile1 ); TEST_CASE( forwhile1 );
TEST_CASE( forwhile2 ); TEST_CASE( forwhile2 );
@ -187,6 +191,8 @@ private:
void ifelse1() void ifelse1()
{ {
check( "void f()\n" check( "void f()\n"
@ -311,6 +317,20 @@ private:
} }
void ifelse9()
{
check( "static char *f()\n"
"{\n"
" char *s = new char[10];\n"
" if ( ghfgf )\n"
" {\n"
" delete [] s;\n"
" }\n"
"}\n" );
ASSERT_EQUALS( std::string("[test.cpp:8]: Memory leak: s\n"), errout.str() );
}