From fe56b0c42a6d17c32c3552b61d9647023a92b7ac Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Thu, 22 Jun 2023 16:01:21 +0200 Subject: [PATCH] LeakAutoVar: Handle C++ casts in function calls (#5181) --- lib/checkleakautovar.cpp | 2 ++ test/testleakautovar.cpp | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 99c819a4a..f7eb0f33c 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -934,6 +934,8 @@ void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpenin } // Skip casts + if (arg->isKeyword() && arg->astParent() && arg->astParent()->isCast()) + arg = arg->astParent(); while (arg && arg->isCast()) arg = arg->astOperand2() ? arg->astOperand2() : arg->astOperand1(); const Token * const argTypeStartTok = arg; diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 1ddcf20bf..7df909f8b 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -564,6 +564,13 @@ private: " g();\n" "}\n", /*cpp*/ true); ASSERT_EQUALS("", errout.str()); + + check("void g() {}\n" // #10517 + "void f() {\n" + " char* p = malloc(10);\n" + " g();\n" + "}\n"); + ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout.str()); } void isAutoDealloc() { @@ -2751,6 +2758,20 @@ private: " free_func((void *)(1), buf);\n" "}", settingsFunctionCall); ASSERT_EQUALS("[test.cpp:5]: (information) --check-library: Function free_func() should have / configuration\n", errout.str()); + + check("void g(void*);\n" + "void h(int, void*);\n" + "void f1() {\n" + " int* p = new int;\n" + " g(static_cast(p));\n" + "}\n" + "void f2() {\n" + " int* p = new int;\n" + " h(1, static_cast(p));\n" + "}\n", /*cpp*/ true); + ASSERT_EQUALS("[test.cpp:6]: (information) --check-library: Function g() should have / configuration\n" + "[test.cpp:10]: (information) --check-library: Function h() should have / configuration\n", + errout.str()); } void functionCallLeakIgnoreConfig() { // #7923