From 951ca2c8b96e3c40b7781bf139798eda846da3b5 Mon Sep 17 00:00:00 2001 From: Rikard Falkeborn Date: Thu, 25 Feb 2021 10:55:34 +0100 Subject: [PATCH] Fix #10186 (FP memleak with cast and assignment) (#3148) --- lib/checkleakautovar.cpp | 3 +++ test/testleakautovar.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 093ef5302..6976eef68 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -764,6 +764,9 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t break; rhs = rhs->astParent(); } + while (rhs->isCast()) { + rhs = rhs->astOperand1(); + } if (rhs->varId() == tok->varId()) { // simple assignment varInfo->erase(tok->varId()); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 231019268..181876c19 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -80,6 +80,7 @@ private: TEST_CASE(assign18); TEST_CASE(assign19); TEST_CASE(assign20); // #9187 + TEST_CASE(assign21); // #10186 TEST_CASE(isAutoDealloc); @@ -421,6 +422,20 @@ private: ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); } + void assign21() { // #10186 + check("void f(int **x) {\n" + " void *p = malloc(10);\n" + " *x = p;\n" + "}", true); + ASSERT_EQUALS("", errout.str()); + + check("void f(struct str *d) {\n" + " void *p = malloc(10);\n" + " d->a = p;\n" + "}", true); + ASSERT_EQUALS("", errout.str()); + } + void isAutoDealloc() { check("void f() {\n" " char *p = new char[100];"