From 8ce4e7800cebb164245d875cff25ef8759e11496 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sun, 24 Dec 2023 12:57:24 +0100 Subject: [PATCH] Fix #12289 FN (regression): memory leak not shown when strcpy is used --- lib/checkleakautovar.cpp | 2 +- test/testleakautovar.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 0602bb1f541..86f1ab8164b 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -841,7 +841,7 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t if (rhs->varId() == tok->varId()) { // simple assignment varInfo.erase(tok->varId()); - } else if (rhs->str() == "(" && !mSettings->library.returnValue(rhs->astOperand1()).empty()) { + } else if (rhs->astParent() && rhs->str() == "(" && !mSettings->library.returnValue(rhs->astOperand1()).empty()) { // #9298, assignment through return value of a function const std::string &returnValue = mSettings->library.returnValue(rhs->astOperand1()); if (startsWith(returnValue, "arg")) { diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index d5cd3874daf..ad2212ff298 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -2999,6 +2999,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { TEST_CASE(returnedValue); // #9298 TEST_CASE(deallocuse2); TEST_CASE(fclose_false_positive); // #9575 + TEST_CASE(strcpy_false_negative); } void returnedValue() { // #9298 @@ -3037,6 +3038,13 @@ class TestLeakAutoVarStrcpy : public TestFixture { ASSERT_EQUALS("", errout.str()); } + void strcpy_false_negative() { // #12289 + check("void f() {\n" + " char* buf = new char[12];\n" + " strcpy(buf, \"123\");\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: buf\n", errout.str()); + } }; REGISTER_TEST(TestLeakAutoVarStrcpy)