Skip to content

Commit

Permalink
Fix #12935 FP unassignedVariable with static empty QString in function
Browse files Browse the repository at this point in the history
  • Loading branch information
chrchr-github committed Jul 13, 2024
1 parent 7aa5e4a commit b23b3d2
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 1 deletion.
14 changes: 13 additions & 1 deletion lib/checkunusedvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<const Token*> 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"))
Expand Down Expand Up @@ -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();
Expand Down
6 changes: 6 additions & 0 deletions test/cfg/qt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -790,3 +790,9 @@ void constVariablePointer_QVector(QVector<int*>& qv, int* p)
{
qv.push_back(p); // #12661
}

const QString& unassignedVariable_static_QString() // #12935
{
static QString qs;
return qs;
}
10 changes: 10 additions & 0 deletions test/testunusedvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down

0 comments on commit b23b3d2

Please sign in to comment.