From bb154da394df312c42d2baa2d7c8d3d1829f5eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 28 Apr 2009 20:01:35 +0200 Subject: [PATCH] memory leaks: handling std::auto_ptr (#266) --- src/checkmemoryleak.cpp | 22 +++++++++++++++++++--- test/testmemleak.cpp | 14 ++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/checkmemoryleak.cpp b/src/checkmemoryleak.cpp index 734d27a72..b756b43eb 100644 --- a/src/checkmemoryleak.cpp +++ b/src/checkmemoryleak.cpp @@ -607,10 +607,26 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list if (tok->str() == "return") { addtoken("return"); - if (Token::simpleMatch(tok, std::string("return " + varnameStr).c_str()) || - Token::simpleMatch(tok, std::string("return & " + varnameStr).c_str())) + + // Returning a auto_ptr of this allocated variable.. + if (Token::simpleMatch(tok->next(), "std :: auto_ptr <")) + { + const Token *tok2 = tok->tokAt(5); + while (tok2 && tok2->str() != ">") + tok2 = tok2->next(); + if (Token::simpleMatch(tok2, ("> ( " + varnameStr + " )").c_str())) + { + addtoken("use"); + tok = tok2->tokAt(3); + } + } + + else if (Token::Match(tok, ("return &| " + varnameStr).c_str())) + { addtoken("use"); - if (Token::simpleMatch(tok->next(), "(")) + } + + else if (Token::simpleMatch(tok->next(), "(")) { for (const Token *tok2 = tok->tokAt(2); tok2; tok2 = tok2->next()) { diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index 79eaf5817..d71017b37 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -203,6 +203,8 @@ private: // VCL.. TEST_CASE(vcl1); TEST_CASE(vcl2); + + TEST_CASE(autoptr1); } @@ -2041,6 +2043,18 @@ private: "}\n", "TButton\n"); ASSERT_EQUALS("", errout.str()); } + + + void autoptr1() + { + check("std::auto_ptr foo()\n" + "{\n" + " int *i = new int;\n" + " return std::auto_ptr(i);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + } + }; REGISTER_TEST(TestMemleak)