From d11e93f47530314c2aa14a9487d3f6f7d37fabab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 16 Nov 2008 05:57:41 +0000 Subject: [PATCH] Memory leak: Added test case that failed. And fixed it. --- CheckMemoryLeak.cpp | 49 +++++++++++++------------- testmemleak.cpp | 84 ++++++++++++++++++++++++++------------------- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/CheckMemoryLeak.cpp b/CheckMemoryLeak.cpp index 634db20ab..d91d3b1b8 100644 --- a/CheckMemoryLeak.cpp +++ b/CheckMemoryLeak.cpp @@ -40,16 +40,16 @@ #endif //--------------------------------------------------------------------------- - -CheckMemoryLeakClass::CheckMemoryLeakClass( Tokenizer *tokenizer ) -{ - _tokenizer = tokenizer; -} - -CheckMemoryLeakClass::~CheckMemoryLeakClass() -{ - -} + +CheckMemoryLeakClass::CheckMemoryLeakClass( Tokenizer *tokenizer ) +{ + _tokenizer = tokenizer; +} + +CheckMemoryLeakClass::~CheckMemoryLeakClass() +{ + +} bool CheckMemoryLeakClass::isclass( const std::string &typestr ) { @@ -276,9 +276,8 @@ bool CheckMemoryLeakClass::notvar(const TOKEN *tok, const char *varnames[]) return bool( Match(tok, "! %var1% [;)&|]", varnames) || Match(tok, "! ( %var1% )", varnames) || Match(tok, "unlikely ( ! %var1% )", varnames) || - Match(tok, "unlikely ( %var1% == NULL )", varnames) || - Match(tok, "%var1% == NULL", varnames) || - Match(tok, "NULL == %var1% [;)&|]", varnames) || + Match(tok, "unlikely ( %var1% == 0 )", varnames) || + Match(tok, "0 == %var1% [;)&|]", varnames) || Match(tok, "%var1% == 0", varnames) ); } @@ -461,19 +460,19 @@ TOKEN *CheckMemoryLeakClass::getcode(const TOKEN *tok, const char typestr[], con // Linux lists.. if ( Match( tok, "[=(,] & %var1% [.[]", varnames ) ) - { - // Linux list -> the first member of the struct - std::string pattern("struct " + std::string(typestr) + " {"); - const TOKEN *tok2 = findmatch(tokens, pattern.c_str()); - if ( ! tok2 ) + { + // Linux list -> the first member of the struct + std::string pattern("struct " + std::string(typestr) + " {"); + const TOKEN *tok2 = findmatch(tokens, pattern.c_str()); + if ( ! tok2 ) { - addtoken("use"); - } - else - { - tok2 = findmatch(tok2, "%var% [;,]"); - if ( !tok2 || Match(tok2, Tokenizer::getstr(tok, 4)) ) - addtoken("use"); + addtoken("use"); + } + else + { + tok2 = findmatch(tok2, "%var% [;,]"); + if ( !tok2 || Match(tok2, Tokenizer::getstr(tok, 4)) ) + addtoken("use"); } } } diff --git a/testmemleak.cpp b/testmemleak.cpp index 2e57ee4a7..ee7bb083b 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -39,8 +39,8 @@ private: void check( const char code[] ) { // Tokenize.. - Tokenizer tokenizer; - tokenizer.getFiles()->push_back( "test.cpp" ); + Tokenizer tokenizer; + tokenizer.getFiles()->push_back( "test.cpp" ); std::istringstream istr(code); tokenizer.TokenizeCode( istr ); tokenizer.SimplifyTokenList(); @@ -49,9 +49,9 @@ private: errout.str(""); // Check for memory leaks.. - ShowAll = false; - Settings settings; - settings._checkCodingStyle = true; + ShowAll = false; + Settings settings; + settings._checkCodingStyle = true; tokenizer.settings( settings ); tokenizer.FillFunctionList(0); CheckMemoryLeakClass checkMemoryLeak( &tokenizer ); @@ -85,6 +85,7 @@ private: TEST_CASE( ifelse9 ); TEST_CASE( if1 ); + TEST_CASE( if2 ); TEST_CASE( forwhile1 ); TEST_CASE( forwhile2 ); @@ -116,8 +117,8 @@ private: TEST_CASE( throw1 ); TEST_CASE( linux_list_1 ); - TEST_CASE( linux_list_2 ); - + TEST_CASE( linux_list_2 ); + TEST_CASE( sizeof1 ); } @@ -399,6 +400,19 @@ private: ASSERT_EQUALS( std::string("[test.cpp:6]: Memory leak: p\n"), errout.str() ); } + void if2() + { + check( "void f()\n" + "{\n" + " struct smp_alt_module *smp;\n" + " smp = kzalloc(sizeof(*smp), GFP_KERNEL);\n" + " if (NULL == smp)\n" + " return;\n" + " kfree( smp );\n" + "}\n" ); + ASSERT_EQUALS( std::string(""), errout.str() ); + } + @@ -860,34 +874,34 @@ private: ASSERT_EQUALS( std::string("[test.cpp:10]: Memory leak: ab\n"), errout.str() ); } - - - - void sizeof1() - { - check( "void f()\n" - "{\n" - " struct s_t s1;\n" - " struct s_t cont *p = &s1;\n" - " struct s_t *s2;\n" - "\n" - " memset(p, 0, sizeof(*p));\n" - "\n" - " s2 = (struct s_t *) malloc(sizeof(*s2));\n" - "\n" - " if (s2->value != 0)\n" - " return;\n" - "\n" - " free(s2);\n" - "\n" - " return;\n" - "}\n" ); - - std::string err( errout.str() ); - - ASSERT_EQUALS( std::string("[test.cpp:12]: Memory leak: s2\n"), err ); - } - + + + + void sizeof1() + { + check( "void f()\n" + "{\n" + " struct s_t s1;\n" + " struct s_t cont *p = &s1;\n" + " struct s_t *s2;\n" + "\n" + " memset(p, 0, sizeof(*p));\n" + "\n" + " s2 = (struct s_t *) malloc(sizeof(*s2));\n" + "\n" + " if (s2->value != 0)\n" + " return;\n" + "\n" + " free(s2);\n" + "\n" + " return;\n" + "}\n" ); + + std::string err( errout.str() ); + + ASSERT_EQUALS( std::string("[test.cpp:12]: Memory leak: s2\n"), err ); + } + }; REGISTER_TEST( TestMemleak )