From 09998d9e181f88a369a78fc078549722c9064f0b Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Sun, 30 Jan 2011 08:38:20 +0100 Subject: [PATCH] Memory leaks: less conservative checking of classes. ticket: #2517 --- lib/checkmemoryleak.cpp | 4 ++-- test/testmemleak.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 1b1dc891f..0ffab12c7 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -2727,8 +2727,8 @@ void CheckMemoryLeakInClass::check() // known class? else if (var->type()) { - // not derived and no constructor? - if (var->type()->derivedFrom.empty() && var->type()->numConstructors == 0) + // not derived? + if (var->type()->derivedFrom.empty()) { if (var->isPrivate()) checkPublicFunctions(scope, var->nameToken()); diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 4cebd567f..16a96b0c4 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -3165,6 +3165,7 @@ private: TEST_CASE(class18); TEST_CASE(class19); // ticket #2219 TEST_CASE(class20); + TEST_CASE(class21); // ticket #2517 TEST_CASE(staticvar); @@ -4018,6 +4019,45 @@ private: ASSERT_EQUALS("[test.cpp:7]: (error) Memory leak: Fred::str1\n", errout.str()); } + void class21() // ticket #2517 + { + check("struct B { };\n" + "struct C\n" + "{\n" + " B * b;\n" + " C(B * x) : b(x) { }\n" + "};\n" + "class A\n" + "{\n" + " B *b;\n" + " C *c;\n" + "public:\n" + " A() : b(new B()), c(new C(b)) { }\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: A::b\n" + "[test.cpp:10]: (error) Memory leak: A::c\n", errout.str()); + + check("struct B { };\n" + "struct C\n" + "{\n" + " B * b;\n" + " C(B * x) : b(x) { }\n" + "};\n" + "class A\n" + "{\n" + " B *b;\n" + " C *c;\n" + "public:\n" + " A()\n" + " {\n" + " b = new B();\n" + " c = new C(b);\n" + " }\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: A::b\n" + "[test.cpp:10]: (error) Memory leak: A::c\n", errout.str()); + } + void staticvar() { check("class A\n"