diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 4f91524de..cdc1d6ed8 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -932,11 +932,11 @@ void CheckLeakAutoVar::ret(const Token *tok, const VarInfo &varInfo) for (const Token *tok2 = tok; tok2; tok2 = tok2->next()) { if (tok2->str() == ";") break; - if (Token::Match(tok2, "return|(|, %varid% [);,]", varid)) { + if (Token::Match(tok2, "return|(|{|, %varid% [});,]", varid)) { used = true; break; } - if (Token::Match(tok2, "return|(|, & %varid% . %name% [);,]", varid)) { + if (Token::Match(tok2, "return|(|{|, & %varid% . %name% [});,]", varid)) { used = true; break; } diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index dedde87e5..64c3f323a 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -142,6 +142,7 @@ private: TEST_CASE(return3); TEST_CASE(return4); TEST_CASE(return5); + TEST_CASE(return6); // #8282 return {p, p} // General tests: variable type, allocation type, etc TEST_CASE(test1); @@ -1658,6 +1659,14 @@ private: ASSERT_EQUALS("", errout.str()); } + void return6() { // #8282 + check("std::pair f(size_t n) {\n" + " char* p = (char* )malloc(n);\n" + " return {p, p};\n" + "}", true); + ASSERT_EQUALS("", errout.str()); + } + void test1() { // 3809 check("void f(double*&p) {\n" " p = malloc(0x100);\n"