Skip to content

Commit df3da38

Browse files
Fix #10682 Unused QString / #10686 unused std::array / #10005 unused variable with c++11 braced initializer not detected (cppcheck-opensource#3684)
1 parent 4ef20f8 commit df3da38

4 files changed

Lines changed: 26 additions & 3 deletions

File tree

gui/projectfile.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,6 @@ bool ProjectFile::write(const QString &filename)
10351035
for (const QString &tag: tags) {
10361036
xmlWriter.writeStartElement(CppcheckXml::TagWarningsElementName);
10371037
xmlWriter.writeAttribute(CppcheckXml::TagAttributeName, tag);
1038-
QStringList warnings;
10391038
for (const auto& wt: mWarningTags) {
10401039
if (wt.second == tag) {
10411040
xmlWriter.writeStartElement(CppcheckXml::WarningElementName);

lib/checkunusedvar.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
709709
else if (mTokenizer->isC() ||
710710
i->typeEndToken()->isStandardType() ||
711711
isRecordTypeWithoutSideEffects(i->type()) ||
712+
mSettings->library.detectContainer(i->typeStartToken(), /*iterator*/ false) ||
712713
(i->isStlType() &&
713714
!Token::Match(i->typeStartToken()->tokAt(2), "lock_guard|unique_lock|shared_ptr|unique_ptr|auto_ptr|shared_lock")))
714715
type = Variables::standard;
@@ -728,7 +729,8 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
728729
break;
729730
}
730731
}
731-
if (i->isArray() && i->isClass()) // Array of class/struct members. Initialized by ctor.
732+
if (i->isArray() && i->isClass() && // Array of class/struct members. Initialized by ctor except for std::array
733+
!(i->isStlType() && i->valueType() && i->valueType()->containerTypeToken && i->valueType()->containerTypeToken->isStandardType()))
732734
variables.write(i->declarationId(), i->nameToken());
733735
if (i->isArray() && Token::Match(i->nameToken(), "%name% [ %var% ]")) // Array index variable read.
734736
variables.read(i->nameToken()->tokAt(2)->varId(), i->nameToken());
@@ -1176,7 +1178,7 @@ void CheckUnusedVar::checkFunctionVariableUsage()
11761178
}
11771179
// not assignment/initialization/increment => continue
11781180
const bool isAssignment = tok->isAssignmentOp() && tok->astOperand1();
1179-
const bool isInitialization = (Token::Match(tok, "%var% (") && tok->variable() && tok->variable()->nameToken() == tok);
1181+
const bool isInitialization = (Token::Match(tok, "%var% (|{") && tok->variable() && tok->variable()->nameToken() == tok);
11801182
const bool isIncrementOrDecrement = (tok->tokType() == Token::Type::eIncDecOp);
11811183
if (!isAssignment && !isInitialization && !isIncrementOrDecrement)
11821184
continue;

test/cfg/qt.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ QString::iterator QString3()
4949
return it;
5050
}
5151

52+
void QString4()
53+
{
54+
// cppcheck-suppress unusedVariable
55+
QString qs;
56+
}
57+
5258
void QByteArray1(QByteArray byteArrayArg)
5359
{
5460
for (int i = 0; i <= byteArrayArg.size(); ++i) {
@@ -136,6 +142,7 @@ QList<int>::iterator QList3()
136142

137143
void QLinkedList1()
138144
{
145+
// cppcheck-suppress unreadVariable
139146
QLinkedList<QString> qstringLinkedList1{"one", "two"};
140147

141148
QLinkedList<QString> qstringLinkedList2 = {"one", "two"};

test/testunusedvar.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5230,6 +5230,16 @@ class TestUnusedVar : public TestFixture {
52305230
" return s;\n"
52315231
"}");
52325232
ASSERT_EQUALS("", errout.str());
5233+
5234+
functionVariableUsage("void f() {\n"
5235+
" std::string s(\"foo\");\n"
5236+
"}");
5237+
ASSERT_EQUALS("[test.cpp:2]: (style) Variable 's' is assigned a value that is never used.\n", errout.str());
5238+
5239+
functionVariableUsage("void f() {\n"
5240+
" std::string s{ \"foo\" };\n"
5241+
"}");
5242+
ASSERT_EQUALS("[test.cpp:2]: (style) Variable 's' is assigned a value that is never used.\n", errout.str());
52335243
}
52345244

52355245
void localvarstring2() { // ticket #2929
@@ -5627,6 +5637,11 @@ class TestUnusedVar : public TestFixture {
56275637
" std::array<int, ArraySize> X; X.dostuff();\n"
56285638
"}");
56295639
ASSERT_EQUALS("", errout.str());
5640+
5641+
functionVariableUsage("void f() {\n" // #10686
5642+
" std::array<int, 1> a;\n"
5643+
"}\n");
5644+
ASSERT_EQUALS("[test.cpp:2]: (style) Unused variable: a\n", errout.str());
56305645
}
56315646

56325647
void localvarFuncPtr() {

0 commit comments

Comments
 (0)