From b23b3d21292a0290971a5d16abb2593659a03b48 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Sat, 13 Jul 2024 21:13:54 +0200 Subject: [PATCH] Fix #12935 FP unassignedVariable with static empty QString in function --- lib/checkunusedvar.cpp | 14 +++++++++++++- test/cfg/qt.cpp | 6 ++++++ test/testunusedvar.cpp | 10 ++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index d91d80f10d6..ae9e8c8f240 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1149,6 +1149,16 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const } } +static bool isReturnedByRef(const Variable* var, const Function* func) +{ + if (!func || !Function::returnsReference(func, true)) + return false; + const std::vector returns = Function::findReturns(func); + return std::any_of(returns.begin(), returns.end(), [var](const Token* tok) { + return tok->varId() == var->declarationId(); + }); +} + void CheckUnusedVar::checkFunctionVariableUsage() { if (!mSettings->severity.isEnabled(Severity::style) && !mSettings->checkLibrary && !mSettings->isPremiumEnabled("unusedVariable")) @@ -1364,7 +1374,9 @@ void CheckUnusedVar::checkFunctionVariableUsage() } // variable has been read but not written else if (!usage._write && !usage._allocateMemory && var && !var->isStlType() && !isEmptyType(var->type()) && - !(var->type() && var->type()->needInitialization == Type::NeedInitialization::False)) + !(var->type() && var->type()->needInitialization == Type::NeedInitialization::False) && + !(var->valueType() && var->valueType()->container) && + !(var->isStatic() && isReturnedByRef(var, scope->function))) unassignedVariableError(usage._var->nameToken(), varname); else if (!usage._var->isMaybeUnused() && !usage._modified && !usage._read && var) { const Token* vnt = var->nameToken(); diff --git a/test/cfg/qt.cpp b/test/cfg/qt.cpp index a78e5d67996..b6d0ba760f9 100644 --- a/test/cfg/qt.cpp +++ b/test/cfg/qt.cpp @@ -790,3 +790,9 @@ void constVariablePointer_QVector(QVector& qv, int* p) { qv.push_back(p); // #12661 } + +const QString& unassignedVariable_static_QString() // #12935 +{ + static QString qs; + return qs; +} diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 38cc4e681fe..d8efbd702d4 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -5887,6 +5887,16 @@ class TestUnusedVar : public TestFixture { " return k;\n" "}\n"); ASSERT_EQUALS("", errout_str()); + + functionVariableUsage("int& f() {\n" // #12935 + " static int i;\n" + " return i;\n" + "}\n" + "int* g() {\n" + " static int j;\n" + " return &j;\n" + "}\n"); + ASSERT_EQUALS("", errout_str()); } void localvarextern() {