diff --git a/lib/suppressions.cpp b/lib/suppressions.cpp index c6e0b7f9ecd..208236ce68d 100644 --- a/lib/suppressions.cpp +++ b/lib/suppressions.cpp @@ -207,6 +207,30 @@ std::vector SuppressionList::parseMultiSuppressCom suppressions.push_back(std::move(s)); } + std::string::size_type extraPos = comment.find(';', end_position); + std::size_t delimSize = 1; + + if (extraPos == std::string::npos) { + extraPos = comment.find("//", end_position); + delimSize = 2; + } + + if (extraPos == std::string::npos) + return suppressions; + + std::string extraComment = comment.substr(extraPos + delimSize); + + if (extraComment.size() >= 2 && extraComment.compare(extraComment.size() - 2, 2, "*/") == 0) + extraComment.erase(extraComment.size() - 2, 2); + + extraComment = trim(extraComment); + + for (auto it = extraComment.begin(); it != extraComment.end();) + it = *it & 0x80 ? extraComment.erase(it) : it + 1; + + for (auto &suppression : suppressions) + suppression.extraComment = extraComment; + return suppressions; } diff --git a/test/testsuppressions.cpp b/test/testsuppressions.cpp index de990c9fd91..4d27ccb0bf3 100644 --- a/test/testsuppressions.cpp +++ b/test/testsuppressions.cpp @@ -1388,6 +1388,34 @@ class TestSuppressions : public TestFixture { suppressions=SuppressionList::parseMultiSuppressComment("/*cppcheck-suppress[errorId1, errorId2 symbolName=arr]*/", &errMsg); ASSERT_EQUALS(2, suppressions.size()); ASSERT_EQUALS(true, errMsg.empty()); + + errMsg = ""; + suppressions=SuppressionList::parseMultiSuppressComment("//cppcheck-suppress[errorId1, errorId2 symbolName=arr] ; extra comment", &errMsg); + ASSERT_EQUALS(2, suppressions.size()); + ASSERT_EQUALS(true, errMsg.empty()); + ASSERT_EQUALS("extra comment", suppressions[0].extraComment); + ASSERT_EQUALS("extra comment", suppressions[1].extraComment); + + errMsg = ""; + suppressions=SuppressionList::parseMultiSuppressComment("//cppcheck-suppress[errorId1, errorId2 symbolName=arr] // extra comment", &errMsg); + ASSERT_EQUALS(2, suppressions.size()); + ASSERT_EQUALS(true, errMsg.empty()); + ASSERT_EQUALS("extra comment", suppressions[0].extraComment); + ASSERT_EQUALS("extra comment", suppressions[1].extraComment); + + errMsg = ""; + suppressions=SuppressionList::parseMultiSuppressComment("/*cppcheck-suppress[errorId1, errorId2 symbolName=arr] ; extra comment */", &errMsg); + ASSERT_EQUALS(2, suppressions.size()); + ASSERT_EQUALS(true, errMsg.empty()); + ASSERT_EQUALS("extra comment", suppressions[0].extraComment); + ASSERT_EQUALS("extra comment", suppressions[1].extraComment); + + errMsg = ""; + suppressions=SuppressionList::parseMultiSuppressComment("/*cppcheck-suppress[errorId1, errorId2 symbolName=arr] // extra comment */", &errMsg); + ASSERT_EQUALS(2, suppressions.size()); + ASSERT_EQUALS(true, errMsg.empty()); + ASSERT_EQUALS("extra comment", suppressions[0].extraComment); + ASSERT_EQUALS("extra comment", suppressions[1].extraComment); } void globalSuppressions() { // Testing that Cppcheck::useGlobalSuppressions works (#8515)