From e19ef6ac62dcf82ae7523ab88447349cbed6e734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 27 Jun 2020 14:15:53 +0200 Subject: [PATCH] Bug hunting; Improved uninit checking for function calls with constant parameter --- lib/bughuntingchecks.cpp | 18 +++++++++++++++--- test/testbughuntingchecks.cpp | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/bughuntingchecks.cpp b/lib/bughuntingchecks.cpp index 4f4e18904..8c8cb0b8e 100644 --- a/lib/bughuntingchecks.cpp +++ b/lib/bughuntingchecks.cpp @@ -173,8 +173,17 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine: } } - if (!value.isUninit() && uninitStructMember.empty()) - return; + bool uninitData = false; + if (!value.isUninit() && uninitStructMember.empty()) { + if (Token::Match(tok->astParent(), "[(,]")) { + if (const auto* arrayValue = dynamic_cast(&value)) { + uninitData = arrayValue->data.size() >= 1 && arrayValue->data[0].value->isUninit(); + } + } + + if (!uninitData) + return; + } // lhs in assignment if (tok->astParent()->str() == "=" && tok == tok->astParent()->astOperand1()) @@ -239,8 +248,11 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine: const Variable *argvar = parent->astOperand1()->function()->getArgumentVar(count); if (argvar && argvar->isReference() && !argvar->isConst()) return; + if (uninitData && argvar && !argvar->isConst()) + return; } - } + } else if (uninitData) + return; } // Avoid FP for array declaration diff --git a/test/testbughuntingchecks.cpp b/test/testbughuntingchecks.cpp index 537f214c2..60e716bf1 100644 --- a/test/testbughuntingchecks.cpp +++ b/test/testbughuntingchecks.cpp @@ -69,7 +69,7 @@ private: check("char foo(const char id[]);\n" "void bar() { char data[10]; foo(data); }"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Cannot determine that 'data' is initialized\n", errout.str()); check("char foo(char id[]);\n" "void bar() { char data[10]; foo(data); }");