From 0f9b2efa43b441655d061f385b2d3983fcbda9b5 Mon Sep 17 00:00:00 2001 From: Reijo Tomperi Date: Fri, 22 May 2009 23:36:03 +0300 Subject: [PATCH] Fix ticket #326 (Reported memory leak when pointer returned by assign to function's parameter) http://apps.sourceforge.net/trac/cppcheck/ticket/326 --- src/tokenize.cpp | 5 +++-- test/testmemleak.cpp | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 6c00c5690..5f9846bdb 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -2188,8 +2188,9 @@ bool Tokenizer::simplifyKnownVariables() break; } - else if (Token::Match(tok2, "%var% = %num% ;") || - Token::Match(tok2, "%var% = %bool% ;")) + else if (tok2->previous()->str() != "*" && + (Token::Match(tok2, "%var% = %num% ;") || + Token::Match(tok2, "%var% = %bool% ;"))) { unsigned int varid = tok2->varId(); if (varid == 0) diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 3e84dbc7a..f1b3e0f58 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -216,6 +216,7 @@ private: TEST_CASE(strndup_function); TEST_CASE(fcloseall_function); + TEST_CASE(pointer_to_pointer); } @@ -2188,6 +2189,16 @@ private: ASSERT_EQUALS(std::string(""), errout.str()); } + void pointer_to_pointer() + { + check("void f(char **data)\n" + "{\n" + " char *c = new char[12];\n" + " *c = 0;\n" + " *data = c;\n" + "}\n"); + ASSERT_EQUALS(std::string(""), errout.str()); + } }; REGISTER_TEST(TestMemleak)