From cdaa1c30a60817df05ef0415c668c8d6a5b44d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 26 Nov 2024 11:43:40 +0100 Subject: [PATCH 1/4] fix #13345 --- lib/checkunusedvar.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index 755b77517c7..f24e10106d5 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1549,6 +1549,19 @@ void CheckUnusedVar::checkStructMemberUsage() use = true; break; } + // Member referenced in offsetof + if (Token::Match(tok, ("offsetof ( struct| " + scope.className + " , %name%").c_str())) { + tok = tok->astSibling(); + if (!tok) + continue; + tok = tok->astOperand2(); + if (!tok) + continue; + if (tok->str() == var.name()) { + use = true; + break; + } + } if (tok->variable() != &var) continue; if (tok != var.nameToken()) { From c12f7f7e45a0fe5dfb3a4b06b9be914764aaad08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 26 Nov 2024 11:48:09 +0100 Subject: [PATCH 2/4] add test --- test/testunusedvar.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 3d57b789c02..d14c791d748 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -70,6 +70,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember23); TEST_CASE(structmember24); // #10847 TEST_CASE(structmember25); + TEST_CASE(structmember26); // #13345 TEST_CASE(structmember_macro); TEST_CASE(classmember); @@ -1962,6 +1963,15 @@ class TestUnusedVar : public TestFixture { errout_str()); } + void structmember26() { // #13345 + checkStructMemberUsage("struct foobar {\n" + " char unused;\n" + "};\n" + "size_t offset_unused = offsetof(struct foobar, unused);\n"); + ASSERT_EQUALS("", errout_str()); + + } + void structmember_macro() { checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n" "S(unused);\n"); From 364fa6a2ea006a3d7e57ed7cb96699f869aabc66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 26 Nov 2024 11:57:22 +0100 Subject: [PATCH 3/4] remove redundant null checks --- lib/checkunusedvar.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index f24e10106d5..fd7fbfc8604 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1551,12 +1551,7 @@ void CheckUnusedVar::checkStructMemberUsage() } // Member referenced in offsetof if (Token::Match(tok, ("offsetof ( struct| " + scope.className + " , %name%").c_str())) { - tok = tok->astSibling(); - if (!tok) - continue; - tok = tok->astOperand2(); - if (!tok) - continue; + tok = tok->astSibling()->astOperand2(); if (tok->str() == var.name()) { use = true; break; From 3dab3dc63667279fd3d743c25c0f04e1d1c59000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 26 Nov 2024 11:57:56 +0100 Subject: [PATCH 4/4] remove newline in test --- test/testunusedvar.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index d14c791d748..88a6f0ed0e5 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -1969,7 +1969,6 @@ class TestUnusedVar : public TestFixture { "};\n" "size_t offset_unused = offsetof(struct foobar, unused);\n"); ASSERT_EQUALS("", errout_str()); - } void structmember_macro() {