Memory leaks : Handle assignments better - bug 2395524
This commit is contained in:
parent
f01cb905f7
commit
ea57f2b820
|
@ -391,6 +391,12 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list<const TOKEN *>
|
||||||
if (dealloctype!=No && dealloctype!=alloc)
|
if (dealloctype!=No && dealloctype!=alloc)
|
||||||
MismatchError(tok, callstack, varname);
|
MismatchError(tok, callstack, varname);
|
||||||
alloctype = alloc;
|
alloctype = alloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// assignment..
|
||||||
|
else
|
||||||
|
{
|
||||||
|
addtoken( "assign" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,9 +514,10 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list<const TOKEN *>
|
||||||
if ( tok->str() == "throw" )
|
if ( tok->str() == "throw" )
|
||||||
addtoken("throw");
|
addtoken("throw");
|
||||||
|
|
||||||
// Assignment..
|
// Assignment..
|
||||||
if ( TOKEN::Match(tok,"[)=] %var1% [;)]", varnames) )
|
if ( TOKEN::Match(tok,"[)=] %var1% [;)]", varnames) ||
|
||||||
addtoken("use");
|
TOKEN::Match(tok, "%var1% +=|-=", varnames) )
|
||||||
|
addtoken("use");
|
||||||
|
|
||||||
// Investigate function calls..
|
// Investigate function calls..
|
||||||
if ( TOKEN::Match(tok, "%var% (") )
|
if ( TOKEN::Match(tok, "%var% (") )
|
||||||
|
@ -971,45 +978,20 @@ void CheckMemoryLeakClass::CheckMemoryLeak_CheckScope( const TOKEN *Tok1, const
|
||||||
MemoryLeak(TOKEN::findmatch(tok, "loop alloc ;"), varname);
|
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(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);
|
MemoryLeak((TOKEN::findmatch(tok,"alloc ; alloc|assign|return ;"))->tokAt(2), 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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if ( ! TOKEN::findmatch(tok,"dealloc") &&
|
else if ( ! TOKEN::findmatch(tok,"dealloc") &&
|
||||||
|
|
|
@ -125,7 +125,9 @@ private:
|
||||||
TEST_CASE( sizeof1 );
|
TEST_CASE( sizeof1 );
|
||||||
|
|
||||||
TEST_CASE( realloc1 );
|
TEST_CASE( realloc1 );
|
||||||
TEST_CASE( realloc2 );
|
TEST_CASE( realloc2 );
|
||||||
|
|
||||||
|
TEST_CASE( assign );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -992,6 +994,36 @@ private:
|
||||||
ASSERT_EQUALS( std::string(""), errout.str() );
|
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() );
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue