From 63811b2993543dd6940ab349857c03c3c2395c75 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sun, 20 Aug 2023 11:08:17 +0200 Subject: [PATCH] Fix #11872 FN unusedVariable with multidimensional array (#5334) --- lib/checkunusedvar.cpp | 16 +++++++++------- test/cfg/std.c | 2 -- test/testunusedvar.cpp | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 68366756f..ebf57b053 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/cfg/std.c b/test/cfg/std.c index 5f5a2c509..4393a1739 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; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 94904a6d6..839ea34e6 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -6041,6 +6041,23 @@ private: " 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