From b29e1970e263699e328160e007aa3a30aac979b6 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 16 Aug 2023 11:47:32 +0200 Subject: [PATCH 1/2] Fix #11872 FN unusedVariable with multidimensional array --- lib/checkunusedvar.cpp | 16 +++++++++------- test/testunusedvar.cpp | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 68366756fe8..ebf57b053e6 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -704,7 +704,7 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const else if (i->isArray() && i->nameToken()->previous()->str() == "&") type = Variables::referenceArray; else if (i->isArray()) - type = (i->dimensions().size() == 1U) ? Variables::array : Variables::pointerArray; + type = Variables::array; else if (i->isReference() && !(i->valueType() && i->valueType()->type == ValueType::UNKNOWN_TYPE && Token::simpleMatch(i->typeStartToken(), "auto"))) type = Variables::reference; else if (i->nameToken()->previous()->str() == "*" && i->nameToken()->strAt(-2) == "*") @@ -1069,13 +1069,15 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const } else if (Token::Match(tok, "[(,] & %var% [,)]")) { variables.eraseAll(tok->tokAt(2)->varId()); } else if (Token::Match(tok, "[(,] (") && - Token::Match(tok->next()->link(), ") %var% [,)]")) { + Token::Match(tok->next()->link(), ") %var% [,)[]")) { variables.use(tok->next()->link()->next()->varId(), tok); // use = read + write - } else if (Token::Match(tok, "[(,] *| %var% =")) { - tok = tok->next(); - if (tok->str() == "*") - tok = tok->next(); - variables.use(tok->varId(), tok); + } else if (Token::Match(tok, "[(,] *| *| %var%")) { + const Token* vartok = tok->next(); + while (vartok->str() == "*") + vartok = vartok->next(); + if (!(vartok->variable() && vartok == vartok->variable()->nameToken()) && + !(tok->str() == "(" && !Token::Match(tok->previous(), "%name%"))) + variables.use(vartok->varId(), vartok); } // function diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 94904a6d684..839ea34e6fa 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -6041,6 +6041,23 @@ class TestUnusedVar : public TestFixture { " dostuff(*p);\n" "}"); ASSERT_EQUALS("", errout.str()); + + functionVariableUsage("int foo() {\n" + " int p[5];\n" + " dostuff(*p);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + functionVariableUsage("int foo() {\n" + " int p[5][5][5];\n" + " dostuff(**p);\n" + "}"); + ASSERT_EQUALS("", errout.str()); + + functionVariableUsage("void f() {\n" // #11872 + " char v[1][2];\n" + "}"); + ASSERT_EQUALS("[test.cpp:2]: (style) Unused variable: v\n", errout.str()); } void localvarstring1() { // ticket #1597 From 6e75ed52c40c21ac289790e2b1270f86a3408334 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 16 Aug 2023 12:13:41 +0200 Subject: [PATCH 2/2] Fix failing test --- test/cfg/std.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/cfg/std.c b/test/cfg/std.c index 5f5a2c5096c..4393a17398c 100644 --- a/test/cfg/std.c +++ b/test/cfg/std.c @@ -4181,7 +4181,6 @@ void uninitvar_tolower(int character) // cppcheck-suppress uninitvar (void)tolower(c1); - // cppcheck-suppress unassignedVariable int c2; // cppcheck-suppress constVariablePointer int *pc=&c2; @@ -4203,7 +4202,6 @@ void uninitvar_toupper(int character) // cppcheck-suppress uninitvar (void)toupper(c1); - // cppcheck-suppress unassignedVariable int c2; // cppcheck-suppress constVariablePointer int *pc=&c2;