From b29e1970e263699e328160e007aa3a30aac979b6 Mon Sep 17 00:00:00 2001 From: chrchr Date: Wed, 16 Aug 2023 11:47:32 +0200 Subject: [PATCH] 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