From 8cf5c8fbf27a5a9b72e06ee93a98d3f73db02137 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Wed, 2 Feb 2022 19:28:16 +0100 Subject: [PATCH] Fix #10684 FP unusedStructMember with static object (#3681) --- lib/checkunusedvar.cpp | 13 +++++++++++++ test/testunusedvar.cpp | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 08a00e160..4f7135bee 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1426,6 +1426,19 @@ void CheckUnusedVar::checkStructMemberUsage() bailout = true; break; } + if (var && (var->typeStartToken()->str() == scope.className || var->typeEndToken()->str() == scope.className)) { + const std::string addressPattern("!!" + scope.className + " & " + var->name()); // cast from struct + const Token* addrTok = scope.bodyEnd; + do { + addrTok = Token::findmatch(addrTok, addressPattern.c_str()); + if ((addrTok && addrTok->str() == ")" && addrTok->link()->isCast()) || isCPPCast(addrTok)) { + bailout = true; + break; + } + if (addrTok) + addrTok = addrTok->next(); + } while (addrTok); + } } if (bailout) continue; diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 04bafb81b..248d2b721 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -66,6 +66,7 @@ private: TEST_CASE(structmember_sizeof); TEST_CASE(structmember16); // #10485 TEST_CASE(structmember17); // #10591 + TEST_CASE(structmember18); // #10684 TEST_CASE(localvar1); TEST_CASE(localvar2); @@ -1607,6 +1608,24 @@ private: TODO_ASSERT_EQUALS("", "[test.cpp:1]: (style) struct member 'T::i' is never used.\n", errout.str()); // due to removeMacroInClassDef() } + void structmember18() { // #10684 + checkStructMemberUsage("struct S { uint8_t padding[500]; };\n" + "static S s = { 0 };\n" + "uint8_t f() {\n" + " uint8_t* p = (uint8_t*)&s;\n" + " return p[10];\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + + checkStructMemberUsage("struct S { uint8_t padding[500]; };\n" + "uint8_t f(const S& s) {\n" + " std::cout << &s;\n" + " auto p = reinterpret_cast(&s);\n" + " return p[10];\n" + "};\n"); + ASSERT_EQUALS("", errout.str()); + } + void functionVariableUsage_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { // Clear the error buffer.. errout.str("");