From 4ca05932f0e349e3860ebc8a6f00c2e3cbdefa31 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sat, 16 Jul 2022 21:21:40 +0200 Subject: [PATCH 1/2] Fix #11108 FP unreadVariable with unique_ptr and unknown c'tor --- lib/checkunusedvar.cpp | 2 +- test/testunusedvar.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index da2587cd46d..630ad66d8be 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1199,7 +1199,7 @@ void CheckUnusedVar::checkFunctionVariableUsage() if (tok->str() == "=" && !(tok->valueType() && tok->valueType()->pointer) && isRaiiClass(tok->valueType(), mTokenizer->isCPP(), false)) continue; - const bool isPointer = tok->valueType() && tok->valueType()->pointer; + const bool isPointer = tok->valueType() && (tok->valueType()->pointer || tok->valueType()->type == ValueType::SMART_POINTER); if (tok->isName()) { if (isRaiiClass(tok->valueType(), mTokenizer->isCPP(), false)) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 8ff2097f159..eaacd4835ce 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -6012,6 +6012,11 @@ class TestUnusedVar : public TestFixture { " return *p;\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + functionVariableUsage("void f(std::unique_ptr p) {\n" // #11108 + " p = nullptr;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } // ticket #3104 - false positive when variable is read with "if (NOT var)" From 465f39946aaa58050659399c3d937e7e89077648 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sat, 16 Jul 2022 21:22:09 +0200 Subject: [PATCH 2/2] Fix test --- test/testunusedvar.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index eaacd4835ce..459a4a33e48 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -6013,7 +6013,8 @@ class TestUnusedVar : public TestFixture { "}\n"); ASSERT_EQUALS("", errout.str()); - functionVariableUsage("void f(std::unique_ptr p) {\n" // #11108 + functionVariableUsage("struct S { S(); };\n" // #11108 + "void f(std::unique_ptr p) {\n" " p = nullptr;\n" "}\n"); ASSERT_EQUALS("", errout.str());