From f4712ef5bf3363831783b505ec92af1547ba57c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 10 Nov 2008 18:51:44 +0000 Subject: [PATCH] Memory leaks: Added tests and handling for 'throw' and linux lists --- CheckMemoryLeak.cpp | 18 ++++++++++++-- testmemleak.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/CheckMemoryLeak.cpp b/CheckMemoryLeak.cpp index 70f80ac99..a867c6c9f 100644 --- a/CheckMemoryLeak.cpp +++ b/CheckMemoryLeak.cpp @@ -1,4 +1,4 @@ -/* +/* * c++check - c/c++ syntax checking * Copyright (C) 2007 Daniel Marjamäki * @@ -420,7 +420,11 @@ static TOKEN *getcode(const TOKEN *tok, const char varname[]) // goto.. if ( Match(tok, "goto") ) - addtoken( "goto" ); + { + // Todo: Add handling of goto.. + deleteTokens(rethead); + return NULL; + } // Return.. if ( Match(tok, "return") ) @@ -431,6 +435,10 @@ static TOKEN *getcode(const TOKEN *tok, const char varname[]) addtoken("use"); } + // throw.. + if ( Match(tok, "throw") ) + addtoken("throw"); + // Assignment.. if ( Match(tok,"[)=] %var1% [;)]", varnames) ) addtoken("use"); @@ -735,6 +743,12 @@ static void simplifycode(TOKEN *tok) } } } + + if ( Match(tok2, "throw") ) + { + tok2->setstr( "return" ); + done = false; + } } } } diff --git a/testmemleak.cpp b/testmemleak.cpp index ce0d9b458..a15392326 100644 --- a/testmemleak.cpp +++ b/testmemleak.cpp @@ -1,4 +1,4 @@ -/* +/* * c++check - c/c++ syntax checking * Copyright (C) 2007 Daniel Marjamäki * @@ -106,8 +106,15 @@ private: TEST_CASE( class1 ); TEST_CASE( class2 ); + + TEST_CASE( throw1 ); + + TEST_CASE( linux_list_1 ); + TEST_CASE( linux_list_2 ); } + + void simple1() { 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() ); + } + };