Skip to content

Commit 8cf5c8f

Browse files
Fix #10684 FP unusedStructMember with static object (#3681)
1 parent 9d36dd5 commit 8cf5c8f

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

lib/checkunusedvar.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,6 +1426,19 @@ void CheckUnusedVar::checkStructMemberUsage()
14261426
bailout = true;
14271427
break;
14281428
}
1429+
if (var && (var->typeStartToken()->str() == scope.className || var->typeEndToken()->str() == scope.className)) {
1430+
const std::string addressPattern("!!" + scope.className + " & " + var->name()); // cast from struct
1431+
const Token* addrTok = scope.bodyEnd;
1432+
do {
1433+
addrTok = Token::findmatch(addrTok, addressPattern.c_str());
1434+
if ((addrTok && addrTok->str() == ")" && addrTok->link()->isCast()) || isCPPCast(addrTok)) {
1435+
bailout = true;
1436+
break;
1437+
}
1438+
if (addrTok)
1439+
addrTok = addrTok->next();
1440+
} while (addrTok);
1441+
}
14291442
}
14301443
if (bailout)
14311444
continue;

test/testunusedvar.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class TestUnusedVar : public TestFixture {
6666
TEST_CASE(structmember_sizeof);
6767
TEST_CASE(structmember16); // #10485
6868
TEST_CASE(structmember17); // #10591
69+
TEST_CASE(structmember18); // #10684
6970

7071
TEST_CASE(localvar1);
7172
TEST_CASE(localvar2);
@@ -1607,6 +1608,24 @@ class TestUnusedVar : public TestFixture {
16071608
TODO_ASSERT_EQUALS("", "[test.cpp:1]: (style) struct member 'T::i' is never used.\n", errout.str()); // due to removeMacroInClassDef()
16081609
}
16091610

1611+
void structmember18() { // #10684
1612+
checkStructMemberUsage("struct S { uint8_t padding[500]; };\n"
1613+
"static S s = { 0 };\n"
1614+
"uint8_t f() {\n"
1615+
" uint8_t* p = (uint8_t*)&s;\n"
1616+
" return p[10];\n"
1617+
"};\n");
1618+
ASSERT_EQUALS("", errout.str());
1619+
1620+
checkStructMemberUsage("struct S { uint8_t padding[500]; };\n"
1621+
"uint8_t f(const S& s) {\n"
1622+
" std::cout << &s;\n"
1623+
" auto p = reinterpret_cast<const uint8_t*>(&s);\n"
1624+
" return p[10];\n"
1625+
"};\n");
1626+
ASSERT_EQUALS("", errout.str());
1627+
}
1628+
16101629
void functionVariableUsage_(const char* file, int line, const char code[], const char filename[] = "test.cpp") {
16111630
// Clear the error buffer..
16121631
errout.str("");

0 commit comments

Comments
 (0)