From 0ba4b27d0a92729917c7aa9901fddc53e1c93841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 12 Jan 2024 10:50:18 +0100 Subject: [PATCH 1/3] Fix #12342 (Show premium autosar/misra/cert style issues even if --enable is not used) --- lib/cppcheck.cpp | 21 +++++++++++++++++++-- lib/cppcheck.h | 2 ++ test/testcppcheck.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index b7a27607cba..e38823fe4ed 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1472,8 +1472,12 @@ void CppCheck::executeAddons(const std::vector& files, const std::s continue; errmsg.severity = Severity::internal; } - else if (!mSettings.severity.isEnabled(errmsg.severity)) - continue; + else if (!mSettings.severity.isEnabled(errmsg.severity)) { + // Do not filter out premium misra/cert/autosar messages that has been + // explicitly enabled with a --premium option + if (!isPremiumCodingStandardId(errmsg.id)) + continue; + } errmsg.file0 = file0; reportErr(errmsg); @@ -1866,3 +1870,16 @@ void CppCheck::printTimerResults(SHOWTIME_MODES mode) { s_timerResults.showResults(mode); } + +bool CppCheck::isPremiumCodingStandardId(const std::string& id) const { + std::vector premiumCodingStandards; + if (mSettings.premiumArgs.find("--misra") != std::string::npos) { + if (startsWith(id, "misra-") || startsWith(id, "premium-misra-")) + return true; + } + if (mSettings.premiumArgs.find("--cert") != std::string::npos && startsWith(id, "premium-cert-")) + return true; + if (mSettings.premiumArgs.find("--autosar") != std::string::npos && startsWith(id, "premium-autosar-")) + return true; + return false; +} diff --git a/lib/cppcheck.h b/lib/cppcheck.h index 99272e89af1..f5ea60f23ed 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -150,6 +150,8 @@ class CPPCHECKLIB CppCheck : ErrorLogger { static void resetTimerResults(); static void printTimerResults(SHOWTIME_MODES mode); + bool isPremiumCodingStandardId(const std::string& id) const; + private: #ifdef HAVE_RULES /** Are there "simple" rules */ diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 8bcc1bee18d..c7dfc870c28 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -55,6 +55,7 @@ class TestCppcheck : public TestFixture { TEST_CASE(checkWithFS); TEST_CASE(suppress_error_library); TEST_CASE(unique_errors); + TEST_CASE(isPremiumCodingStandardId); } void getErrorMessages() const { @@ -180,6 +181,31 @@ class TestCppcheck : public TestFixture { ASSERT_EQUALS("nullPointer", it->id); } + void isPremiumCodingStandardId() { + ErrorLogger2 errorLogger; + CppCheck cppcheck(errorLogger, false, {}); + + cppcheck.settings().premiumArgs = ""; + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("misra-c2012-0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("misra-c2023-0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-misra-c2012-0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-misra-c2023-0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-misra-c++2008-0.0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-misra-c++2023-0.0.0")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-cert-int50-cpp")); + ASSERT_EQUALS(false, cppcheck.isPremiumCodingStandardId("premium-autosar-0-0-0")); + + cppcheck.settings().premiumArgs = "--misra-c-2012 --cert-c++-2016 --autosar"; + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("misra-c2012-0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("misra-c2023-0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-misra-c2012-0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-misra-c2023-0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-misra-c++2008-0.0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-misra-c++2023-0.0.0")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-cert-int50-cpp")); + ASSERT_EQUALS(true, cppcheck.isPremiumCodingStandardId("premium-autosar-0-0-0")); + } + // TODO: test suppressions // TODO: test all with FS }; From 702e9a53b2b3806e8ce5ab337ba28e33869f3349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 12 Jan 2024 14:00:38 +0100 Subject: [PATCH 2/3] self check --- lib/cppcheck.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index e38823fe4ed..46026ed6285 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1872,7 +1872,6 @@ void CppCheck::printTimerResults(SHOWTIME_MODES mode) } bool CppCheck::isPremiumCodingStandardId(const std::string& id) const { - std::vector premiumCodingStandards; if (mSettings.premiumArgs.find("--misra") != std::string::npos) { if (startsWith(id, "misra-") || startsWith(id, "premium-misra-")) return true; From ed2ad82a8aadeed9dc7928ccbda0449b7bd8ad42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 12 Jan 2024 16:51:03 +0100 Subject: [PATCH 3/3] self check --- test/testcppcheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index c7dfc870c28..f2b1e2904b5 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -181,7 +181,7 @@ class TestCppcheck : public TestFixture { ASSERT_EQUALS("nullPointer", it->id); } - void isPremiumCodingStandardId() { + void isPremiumCodingStandardId() const { ErrorLogger2 errorLogger; CppCheck cppcheck(errorLogger, false, {});