From 3db1745c9e9fa56edf229b89f7249f6f4c9df9b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 3 Dec 2024 11:44:06 +0100 Subject: [PATCH 1/2] add test --- test/testunusedvar.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 88a6f0ed0e5..74941464ea8 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -71,6 +71,7 @@ class TestUnusedVar : public TestFixture { TEST_CASE(structmember24); // #10847 TEST_CASE(structmember25); TEST_CASE(structmember26); // #13345 + TEST_CASE(structmember27); // #13367 TEST_CASE(structmember_macro); TEST_CASE(classmember); @@ -1971,6 +1972,17 @@ class TestUnusedVar : public TestFixture { ASSERT_EQUALS("", errout_str()); } + void structmember27() { // #13367 + checkStructMemberUsage("typedef struct pathNode_s {\n" + " struct pathNode_s* next;\n" + "} pathNode_t;\n" + "void f() {\n" + " x y;\n" + "}\n"); + ASSERT_EQUALS("", // don't crash + errout_str()); + } + void structmember_macro() { checkStructMemberUsageP("#define S(n) struct n { int a, b, c; };\n" "S(unused);\n"); From ccdcc02c075cc01949552505acf71bb87c1852e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Tue, 3 Dec 2024 11:44:13 +0100 Subject: [PATCH 2/2] fix #13367 --- lib/checkunusedvar.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checkunusedvar.cpp b/lib/checkunusedvar.cpp index fd7fbfc8604..3e175093a55 100644 --- a/lib/checkunusedvar.cpp +++ b/lib/checkunusedvar.cpp @@ -1551,7 +1551,7 @@ void CheckUnusedVar::checkStructMemberUsage() } // Member referenced in offsetof if (Token::Match(tok, ("offsetof ( struct| " + scope.className + " , %name%").c_str())) { - tok = tok->astSibling()->astOperand2(); + tok = Token::simpleMatch(tok->tokAt(2), "struct") ? tok->tokAt(5) : tok->tokAt(4); if (tok->str() == var.name()) { use = true; break;