Suppressions: Allow symbol-based inline suppressions

This commit is contained in:
Daniel Marjamäki 2018-04-09 11:50:59 +02:00
parent 17b4721bd2
commit f677322c69
2 changed files with 43 additions and 9 deletions

View File

@ -70,8 +70,7 @@ Preprocessor::~Preprocessor()
static void inlineSuppressions(const simplecpp::TokenList &tokens, Settings &_settings) static void inlineSuppressions(const simplecpp::TokenList &tokens, Settings &_settings)
{ {
std::list<std::string> suppressionIDs; std::list<Suppressions::Suppression> inlineSuppressions;
for (const simplecpp::Token *tok = tokens.cfront(); tok; tok = tok->next) { for (const simplecpp::Token *tok = tokens.cfront(); tok; tok = tok->next) {
if (tok->comment) { if (tok->comment) {
std::istringstream iss(tok->str.substr(2)); std::istringstream iss(tok->str.substr(2));
@ -79,13 +78,23 @@ static void inlineSuppressions(const simplecpp::TokenList &tokens, Settings &_se
iss >> word; iss >> word;
if (word != "cppcheck-suppress") if (word != "cppcheck-suppress")
continue; continue;
iss >> word;
if (iss) Suppressions::Suppression s;
suppressionIDs.push_back(word); iss >> s.errorId;
if (!iss)
continue;
while (iss) {
iss >> word;
if (!iss)
break;
if (word.compare(0,11,"symbolName=")==0)
s.symbolName = word.substr(11);
}
inlineSuppressions.push_back(s);
continue; continue;
} }
if (suppressionIDs.empty()) if (inlineSuppressions.empty())
continue; continue;
// Relative filename // Relative filename
@ -98,12 +107,15 @@ static void inlineSuppressions(const simplecpp::TokenList &tokens, Settings &_se
} }
} }
} }
relativeFilename = Path::simplifyPath(relativeFilename);
// Add the suppressions. // Add the suppressions.
for (const std::string &errorId : suppressionIDs) { for (Suppressions::Suppression &suppr : inlineSuppressions) {
_settings.nomsg.addSuppression(Suppressions::Suppression(errorId, relativeFilename, tok->location.line)); suppr.fileName = relativeFilename;
suppr.lineNumber = tok->location.line;
_settings.nomsg.addSuppression(suppr);
} }
suppressionIDs.clear(); inlineSuppressions.clear();
} }
} }

View File

@ -47,6 +47,8 @@ private:
TEST_CASE(suppressionsMultiFile); TEST_CASE(suppressionsMultiFile);
TEST_CASE(suppressionsPathSeparator); TEST_CASE(suppressionsPathSeparator);
TEST_CASE(inlinesuppress_symbolname);
TEST_CASE(inlinesuppress_unusedFunction); // #4210 - unusedFunction TEST_CASE(inlinesuppress_unusedFunction); // #4210 - unusedFunction
TEST_CASE(globalsuppress_unusedFunction); // #4946 TEST_CASE(globalsuppress_unusedFunction); // #4946
TEST_CASE(suppressionWithRelativePaths); // #4733 TEST_CASE(suppressionWithRelativePaths); // #4733
@ -395,6 +397,26 @@ private:
ASSERT_EQUALS(true, s2.isSuppressed(errorMessage("abc", "include/1.h", 142))); ASSERT_EQUALS(true, s2.isSuppressed(errorMessage("abc", "include/1.h", 142)));
} }
void inlinesuppress_symbolname() {
Suppressions suppressions;
checkSuppression("void f() {\n"
" int a;\n"
" /* cppcheck-suppress uninitvar symbolName=a */\n"
" a++;\n"
"}\n",
"");
ASSERT_EQUALS("", errout.str());
checkSuppression("void f() {\n"
" int a,b;\n"
" /* cppcheck-suppress uninitvar symbolName=b */\n"
" a++; b++;\n"
"}\n",
"");
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str());
}
void inlinesuppress_unusedFunction() const { // #4210, #4946 - wrong report of "unmatchedSuppression" for "unusedFunction" void inlinesuppress_unusedFunction() const { // #4210, #4946 - wrong report of "unmatchedSuppression" for "unusedFunction"
Suppressions suppressions; Suppressions suppressions;
suppressions.addSuppression(Suppressions::Suppression("unusedFunction", "test.c", 3)); suppressions.addSuppression(Suppressions::Suppression("unusedFunction", "test.c", 3));