Skip to content

Commit 9ddcc58

Browse files
authored
Fix #13345: FP unusedStructMember when member is only used in offsetof() (#7041)
1 parent f53d280 commit 9ddcc58

File tree

2 files changed

+17
-0
lines changed

2 files changed

+17
-0
lines changed

lib/checkunusedvar.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,6 +1549,14 @@ void CheckUnusedVar::checkStructMemberUsage()
15491549
use = true;
15501550
break;
15511551
}
1552+
// Member referenced in offsetof
1553+
if (Token::Match(tok, ("offsetof ( struct| " + scope.className + " , %name%").c_str())) {
1554+
tok = tok->astSibling()->astOperand2();
1555+
if (tok->str() == var.name()) {
1556+
use = true;
1557+
break;
1558+
}
1559+
}
15521560
if (tok->variable() != &var)
15531561
continue;
15541562
if (tok != var.nameToken()) {

test/testunusedvar.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class TestUnusedVar : public TestFixture {
7070
TEST_CASE(structmember23);
7171
TEST_CASE(structmember24); // #10847
7272
TEST_CASE(structmember25);
73+
TEST_CASE(structmember26); // #13345
7374
TEST_CASE(structmember_macro);
7475
TEST_CASE(classmember);
7576

@@ -1962,6 +1963,14 @@ class TestUnusedVar : public TestFixture {
19621963
errout_str());
19631964
}
19641965

1966+
void structmember26() { // #13345
1967+
checkStructMemberUsage("struct foobar {\n"
1968+
" char unused;\n"
1969+
"};\n"
1970+
"size_t offset_unused = offsetof(struct foobar, unused);\n");
1971+
ASSERT_EQUALS("", errout_str());
1972+
}
1973+
19651974
void structmember_macro() {
19661975
checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n"
19671976
"S(unused);\n");

0 commit comments

Comments
 (0)