From 9896dce7f2982d224c1fd9190a4b4f98fab68453 Mon Sep 17 00:00:00 2001 From: Rikard Falkeborn Date: Sun, 23 Feb 2020 19:53:17 +0100 Subject: [PATCH] checkuninitvar: Fix FN with c++ casts (#2549) --- lib/checkuninitvar.cpp | 2 +- test/testuninitvar.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 5488304dd..f46cccd5a 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -713,7 +713,7 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var if (var.isPointer() && Token::simpleMatch(tok->next(), "=")) { const Token *rhs = tok->next()->astOperand2(); while (rhs && rhs->isCast()) - rhs = rhs->astOperand1(); + rhs = rhs->astOperand2() ? rhs->astOperand2() : rhs->astOperand1(); if (rhs && Token::Match(rhs->previous(), "%name% (") && mSettings->library.returnuninitdata.count(rhs->previous()->str()) > 0U) { *alloc = NO_CTOR_CALL; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 05f47cf77..bcab489b4 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -1478,6 +1478,14 @@ private: "}", "test.cpp", false); ASSERT_EQUALS("[test.cpp:4]: (error) Memory is allocated but not initialized: buffer\n", errout.str()); + checkUninitVar("void f(){\n" + " char *strMsg = \"This is a message\";\n" + " char *buffer=static_cast(malloc(128*sizeof(char)));\n" + " strcpy(strMsg,buffer);\n" + " free(buffer);\n" + "}", "test.cpp", false); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory is allocated but not initialized: buffer\n", errout.str()); + // #3845 checkUninitVar("int foo() {\n" " int a[1] = {5};\n"