Memory leak: Handle conditions that are always true / false
This commit is contained in:
parent
2db69e6072
commit
e33985dbf0
|
@ -370,7 +370,7 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list<const TOKEN *>
|
||||||
dealloctype = dealloc;
|
dealloctype = dealloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if else switch
|
// if else switch
|
||||||
if ( Tokenizer::Match(tok, "if ( %var1% )", varnames) ||
|
if ( Tokenizer::Match(tok, "if ( %var1% )", varnames) ||
|
||||||
Tokenizer::Match(tok, "if ( %var1% != 0 )", varnames) ||
|
Tokenizer::Match(tok, "if ( %var1% != 0 )", varnames) ||
|
||||||
Tokenizer::Match(tok, "if ( 0 != %var1% )", varnames) )
|
Tokenizer::Match(tok, "if ( 0 != %var1% )", varnames) )
|
||||||
|
@ -381,7 +381,15 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, std::list<const TOKEN *>
|
||||||
else if ( Tokenizer::Match(tok, "if (") && notvar(Tokenizer::gettok(tok,2), varnames) )
|
else if ( Tokenizer::Match(tok, "if (") && notvar(Tokenizer::gettok(tok,2), varnames) )
|
||||||
{
|
{
|
||||||
addtoken("if(!var)");
|
addtoken("if(!var)");
|
||||||
}
|
}
|
||||||
|
else if ( Tokenizer::Match(tok, "if (") && _tokenizer->alwaysTrue(tok->next) )
|
||||||
|
{
|
||||||
|
addtoken("if(true)");
|
||||||
|
}
|
||||||
|
else if ( Tokenizer::Match(tok, "if (") && _tokenizer->alwaysTrue(tok->next) )
|
||||||
|
{
|
||||||
|
addtoken("if(false)");
|
||||||
|
}
|
||||||
else if ( Tokenizer::Match(tok, "if") )
|
else if ( Tokenizer::Match(tok, "if") )
|
||||||
{
|
{
|
||||||
// Check if the condition depends on var somehow..
|
// Check if the condition depends on var somehow..
|
||||||
|
@ -599,6 +607,8 @@ void CheckMemoryLeakClass::simplifycode(TOKEN *tok)
|
||||||
if ( Tokenizer::Match(tok2,"[;{}] if ;") ||
|
if ( Tokenizer::Match(tok2,"[;{}] if ;") ||
|
||||||
Tokenizer::Match(tok2,"[;{}] if(var) ;") ||
|
Tokenizer::Match(tok2,"[;{}] if(var) ;") ||
|
||||||
Tokenizer::Match(tok2,"[;{}] if(!var) ;") ||
|
Tokenizer::Match(tok2,"[;{}] if(!var) ;") ||
|
||||||
|
Tokenizer::Match(tok2,"[;{}] if(true) ;") ||
|
||||||
|
Tokenizer::Match(tok2,"[;{}] if(false) ;") ||
|
||||||
Tokenizer::Match(tok2,"[;{}] ifv ;") )
|
Tokenizer::Match(tok2,"[;{}] ifv ;") )
|
||||||
{
|
{
|
||||||
if ( ! Tokenizer::Match(Tokenizer::gettok(tok2,3), "else") )
|
if ( ! Tokenizer::Match(Tokenizer::gettok(tok2,3), "else") )
|
||||||
|
|
|
@ -84,7 +84,9 @@ private:
|
||||||
TEST_CASE( if2 );
|
TEST_CASE( if2 );
|
||||||
TEST_CASE( if3 );
|
TEST_CASE( if3 );
|
||||||
TEST_CASE( if4 );
|
TEST_CASE( if4 );
|
||||||
TEST_CASE( if5 );
|
TEST_CASE( if5 );
|
||||||
|
|
||||||
|
TEST_CASE( alwaysTrue );
|
||||||
|
|
||||||
TEST_CASE( forwhile1 );
|
TEST_CASE( forwhile1 );
|
||||||
TEST_CASE( forwhile2 );
|
TEST_CASE( forwhile2 );
|
||||||
|
@ -453,6 +455,26 @@ private:
|
||||||
ASSERT_EQUALS( std::string(""), err );
|
ASSERT_EQUALS( std::string(""), err );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void alwaysTrue()
|
||||||
|
{
|
||||||
|
check( "void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char *p = 0;\n"
|
||||||
|
" for (;;)\n"
|
||||||
|
" {\n"
|
||||||
|
" p = malloc(256);\n"
|
||||||
|
" if (1)\n"
|
||||||
|
" break;\n"
|
||||||
|
" }\n"
|
||||||
|
" free(p);\n"
|
||||||
|
"}\n" );
|
||||||
|
std::string err( errout.str() );
|
||||||
|
ASSERT_EQUALS( std::string(""), err );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue