parent
029056b0b4
commit
c3002f1230
|
@ -1437,7 +1437,7 @@ void CheckUnusedVar::checkStructMemberUsage()
|
||||||
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
||||||
|
|
||||||
for (const Scope &scope : symbolDatabase->scopeList) {
|
for (const Scope &scope : symbolDatabase->scopeList) {
|
||||||
if (scope.type != Scope::eStruct && scope.type != Scope::eUnion)
|
if (scope.type != Scope::eStruct && scope.type != Scope::eClass && scope.type != Scope::eUnion)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (scope.bodyStart->fileIndex() != 0 || scope.className.empty())
|
if (scope.bodyStart->fileIndex() != 0 || scope.className.empty())
|
||||||
|
@ -1521,16 +1521,21 @@ void CheckUnusedVar::checkStructMemberUsage()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!use)
|
if (!use) {
|
||||||
unusedStructMemberError(var.nameToken(), scope.className, var.name(), scope.type == Scope::eUnion);
|
std::string prefix = "struct";
|
||||||
|
if (scope.type == Scope::ScopeType::eClass)
|
||||||
|
prefix = "class";
|
||||||
|
else if (scope.type == Scope::ScopeType::eUnion)
|
||||||
|
prefix = "union";
|
||||||
|
unusedStructMemberError(var.nameToken(), scope.className, var.name(), prefix);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckUnusedVar::unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname, bool isUnion)
|
void CheckUnusedVar::unusedStructMemberError(const Token* tok, const std::string& structname, const std::string& varname, const std::string& prefix)
|
||||||
{
|
{
|
||||||
const std::string prefix = isUnion ? "union member " : "struct member ";
|
reportError(tok, Severity::style, "unusedStructMember", "$symbol:" + structname + "::" + varname + '\n' + prefix + " member '$symbol' is never used.", CWE563, Certainty::normal);
|
||||||
reportError(tok, Severity::style, "unusedStructMember", "$symbol:" + structname + "::" + varname + '\n' + prefix + "'$symbol' is never used.", CWE563, Certainty::normal);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckUnusedVar::isRecordTypeWithoutSideEffects(const Type* type)
|
bool CheckUnusedVar::isRecordTypeWithoutSideEffects(const Type* type)
|
||||||
|
|
|
@ -77,7 +77,7 @@ private:
|
||||||
std::list<const Function*> checkedFuncs);
|
std::list<const Function*> checkedFuncs);
|
||||||
|
|
||||||
// Error messages..
|
// Error messages..
|
||||||
void unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname, bool isUnion = false);
|
void unusedStructMemberError(const Token *tok, const std::string &structname, const std::string &varname, const std::string& prefix = "struct");
|
||||||
void unusedVariableError(const Token *tok, const std::string &varname);
|
void unusedVariableError(const Token *tok, const std::string &varname);
|
||||||
void allocatedButUnusedVariableError(const Token *tok, const std::string &varname);
|
void allocatedButUnusedVariableError(const Token *tok, const std::string &varname);
|
||||||
void unreadVariableError(const Token *tok, const std::string &varname, bool modified);
|
void unreadVariableError(const Token *tok, const std::string &varname, bool modified);
|
||||||
|
|
|
@ -75,6 +75,7 @@ private:
|
||||||
TEST_CASE(structmember21); // #4759
|
TEST_CASE(structmember21); // #4759
|
||||||
TEST_CASE(structmember22); // #11016
|
TEST_CASE(structmember22); // #11016
|
||||||
TEST_CASE(structmember23);
|
TEST_CASE(structmember23);
|
||||||
|
TEST_CASE(classmember);
|
||||||
|
|
||||||
TEST_CASE(localvar1);
|
TEST_CASE(localvar1);
|
||||||
TEST_CASE(localvar2);
|
TEST_CASE(localvar2);
|
||||||
|
@ -1870,6 +1871,13 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void classmember() {
|
||||||
|
checkStructMemberUsage("class C {\n"
|
||||||
|
" int i{};\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (style) class member 'C::i' is never used.\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void functionVariableUsage_(const char* file, int line, const char code[], const char filename[] = "test.cpp") {
|
void functionVariableUsage_(const char* file, int line, const char code[], const char filename[] = "test.cpp") {
|
||||||
// Clear the error buffer..
|
// Clear the error buffer..
|
||||||
errout.str("");
|
errout.str("");
|
||||||
|
|
Loading…
Reference in New Issue