From b19113426f05c65d2693b793cf55d83df030376a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 17 Apr 2010 11:16:05 +0200 Subject: [PATCH] Unused struct member: Fixed false positives --- lib/checkother.cpp | 6 ++++++ test/testunusedvar.cpp | 43 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 5575a5bc6..7d35b47bd 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -995,6 +995,12 @@ void CheckOther::checkStructMemberUsage() if (Token::Match(tok, "struct|union %type% {")) { + structname.clear(); + if (Token::simpleMatch(tok->previous(), "extern")) + continue; + if ((!tok->previous() || Token::simpleMatch(tok->previous(), ";")) && Token::Match(tok->tokAt(2)->link(), ("} ; " + tok->strAt(1) + " %var% ;").c_str())) + continue; + structname = tok->strAt(1); // Bail out if struct/union contain any functions diff --git a/test/testunusedvar.cpp b/test/testunusedvar.cpp index 6927ded00..a4b48c87f 100644 --- a/test/testunusedvar.cpp +++ b/test/testunusedvar.cpp @@ -60,6 +60,7 @@ private: TEST_CASE(structmember6); TEST_CASE(structmember7); TEST_CASE(structmember8); + TEST_CASE(structmember_extern); // No false positives for extern structs TEST_CASE(localvar1); TEST_CASE(localvar2); @@ -247,6 +248,48 @@ private: ASSERT_EQUALS("", errout.str()); } + void structmember_extern() + { + // extern struct => no false positive + check("extern struct AB\n" + "{\n" + " int a;\n" + " int b;\n" + "} ab;\n" + "\n" + "void foo()\n" + "{\n" + " ab.b = 0;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + // global linkage => no false positive + check("struct AB\n" + "{\n" + " int a;\n" + " int b;\n" + "} ab;\n" + "\n" + "void foo()\n" + "{\n" + " ab.b = 0;\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); + + // static linkage => error message + check("static struct AB\n" + "{\n" + " int a;\n" + " int b;\n" + "} ab;\n" + "\n" + "void foo()\n" + "{\n" + " ab.b = 0;\n" + "}\n"); + ASSERT_EQUALS("[test.cpp:3]: (style) struct or union member 'AB::a' is never used\n", errout.str()); + } +