Memory leaks: Added tests and handling for 'throw' and linux lists
This commit is contained in:
parent
61db3a7f11
commit
f4712ef5bf
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* c++check - c/c++ syntax checking
|
* c++check - c/c++ syntax checking
|
||||||
* Copyright (C) 2007 Daniel Marjamäki
|
* Copyright (C) 2007 Daniel Marjamäki
|
||||||
*
|
*
|
||||||
|
@ -420,7 +420,11 @@ static TOKEN *getcode(const TOKEN *tok, const char varname[])
|
||||||
|
|
||||||
// goto..
|
// goto..
|
||||||
if ( Match(tok, "goto") )
|
if ( Match(tok, "goto") )
|
||||||
addtoken( "goto" );
|
{
|
||||||
|
// Todo: Add handling of goto..
|
||||||
|
deleteTokens(rethead);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Return..
|
// Return..
|
||||||
if ( Match(tok, "return") )
|
if ( Match(tok, "return") )
|
||||||
|
@ -431,6 +435,10 @@ static TOKEN *getcode(const TOKEN *tok, const char varname[])
|
||||||
addtoken("use");
|
addtoken("use");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// throw..
|
||||||
|
if ( Match(tok, "throw") )
|
||||||
|
addtoken("throw");
|
||||||
|
|
||||||
// Assignment..
|
// Assignment..
|
||||||
if ( Match(tok,"[)=] %var1% [;)]", varnames) )
|
if ( Match(tok,"[)=] %var1% [;)]", varnames) )
|
||||||
addtoken("use");
|
addtoken("use");
|
||||||
|
@ -735,6 +743,12 @@ static void simplifycode(TOKEN *tok)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( Match(tok2, "throw") )
|
||||||
|
{
|
||||||
|
tok2->setstr( "return" );
|
||||||
|
done = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* c++check - c/c++ syntax checking
|
* c++check - c/c++ syntax checking
|
||||||
* Copyright (C) 2007 Daniel Marjamäki
|
* Copyright (C) 2007 Daniel Marjamäki
|
||||||
*
|
*
|
||||||
|
@ -106,8 +106,15 @@ private:
|
||||||
|
|
||||||
TEST_CASE( class1 );
|
TEST_CASE( class1 );
|
||||||
TEST_CASE( class2 );
|
TEST_CASE( class2 );
|
||||||
|
|
||||||
|
TEST_CASE( throw1 );
|
||||||
|
|
||||||
|
TEST_CASE( linux_list_1 );
|
||||||
|
TEST_CASE( linux_list_2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void simple1()
|
void simple1()
|
||||||
{
|
{
|
||||||
check( "void f()\n"
|
check( "void f()\n"
|
||||||
|
@ -762,6 +769,55 @@ private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void throw1()
|
||||||
|
{
|
||||||
|
check( "void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" char *str = new char[10];\n"
|
||||||
|
" if ( ! abc )\n"
|
||||||
|
" throw 123;\n"
|
||||||
|
" delete [] str;\n"
|
||||||
|
"}\n" );
|
||||||
|
|
||||||
|
ASSERT_EQUALS( std::string("[test.cpp:5]: Memory leak: str\n"), errout.str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void linux_list_1()
|
||||||
|
{
|
||||||
|
check( "struct AB\n"
|
||||||
|
"{\n"
|
||||||
|
" int a;\n"
|
||||||
|
" int b;\n"
|
||||||
|
"};\n"
|
||||||
|
"void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" struct AB *ab = new AB;\n"
|
||||||
|
" func(&ab->a);\n"
|
||||||
|
"}\n" );
|
||||||
|
|
||||||
|
ASSERT_EQUALS( std::string(""), errout.str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void linux_list_2()
|
||||||
|
{
|
||||||
|
check( "struct AB\n"
|
||||||
|
"{\n"
|
||||||
|
" int a;\n"
|
||||||
|
" int b;\n"
|
||||||
|
"};\n"
|
||||||
|
"void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" struct AB *ab = new AB;\n"
|
||||||
|
" func(&ab->b);\n"
|
||||||
|
"}\n" );
|
||||||
|
|
||||||
|
ASSERT_EQUALS( std::string("[test.cpp:10]: Memory leak: ab\n"), errout.str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue