From 068b1458c241e5ff9353d006b1d02966e84804ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 26 Jan 2009 18:15:44 +0000 Subject: [PATCH] memleak: class function usage (fixing #63) --- src/checkmemoryleak.cpp | 7 +++++-- test/testmemleak.cpp | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/checkmemoryleak.cpp b/src/checkmemoryleak.cpp index 5e5de6d32..d442135fc 100644 --- a/src/checkmemoryleak.cpp +++ b/src/checkmemoryleak.cpp @@ -609,7 +609,8 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list if (Token::Match(tok, "%var% (")) { // Inside class function.. if the var is passed as a parameter then - // just add a "use" + // just add a "::use" + // The "::use" means that a member function was probably called but it wasn't analyzed further if (classmember) { int parlevel = 1; @@ -625,7 +626,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list } if (tok2->str() == varnameStr) { - addtoken("use"); + addtoken("::use"); break; } } @@ -1172,6 +1173,8 @@ void CheckMemoryLeakClass::CheckMemoryLeak_CheckScope(const Token *Tok1, const c tok2->str("use"); else if (tok2->str() == "use_") tok2->str(";"); + else if (tok2->str() == "::use") // Some kind of member function usage. Not analyzed very well. + tok2->str("use"); else if (tok2->str() == "recursive") tok2->str("use"); else if (tok2->str() == "dealloc_") diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index bee4d97f6..1df9eac34 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -141,6 +141,7 @@ private: TEST_CASE(class5); TEST_CASE(class6); TEST_CASE(class7); + TEST_CASE(class8); TEST_CASE(throw1); TEST_CASE(throw2); @@ -1348,6 +1349,24 @@ private: ASSERT_EQUALS("", errout.str()); } + void class8() + { + check("class A\n" + "{\n" + "public:\n" + " void a();\n" + " void doNothing() { }\n" + "};\n" + "\n" + "void A::a()\n" + "{\n" + " int* c = new int(1);\n" + " delete c;\n" + " doNothing(c);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + } +