diff --git a/lib/settings.cpp b/lib/settings.cpp index 410f3d5107d..da576f7a5c8 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -791,20 +791,31 @@ static const std::set misracpp2023Checkers{ bool Settings::isPremiumEnabled(const char id[]) const { - if (premiumArgs.empty()) - return false; - if (premiumArgs.find("autosar") != std::string::npos && autosarCheckers.count(id)) - return true; - if (premiumArgs.find("cert-c-") != std::string::npos && certCCheckers.count(id)) - return true; - if (premiumArgs.find("cert-c++") != std::string::npos && certCppCheckers.count(id)) - return true; - if (premiumArgs.find("misra-c-") != std::string::npos && (misrac2012Checkers.count(id) || misrac2023Checkers.count(id) || misrac2025Checkers.count(id))) - return true; - if (premiumArgs.find("misra-c++-2008") != std::string::npos && misracpp2008Checkers.count(id)) - return true; - if (premiumArgs.find("misra-c++-2023") != std::string::npos && misracpp2023Checkers.count(id)) - return true; + for (std::string arg: splitString(premiumArgs, ' ')) { + std::transform(arg.cbegin(), arg.cend(), arg.begin(), [](char c) { + return c=='+' ? 'p' : c; + }); + if (endsWith(arg, ":all")) + arg.erase(arg.size()-4); + if (arg == "--autosar" && autosarCheckers.count(id)) + return true; + if (arg == "--cert-c" && certCCheckers.count(id)) + return true; + if (arg == "--cert-c-2016" && certCCheckers.count(id)) + return true; + if (startsWith(arg, "--cert-cpp") && certCppCheckers.count(id)) + return true; + if (arg == "--misra-c-2012" && misrac2012Checkers.count(id)) + return true; + if (arg == "--misra-c-2023" && misrac2023Checkers.count(id)) + return true; + if (arg == "--misra-c-2025" && misrac2025Checkers.count(id)) + return true; + if (arg == "--misra-cpp-2008" && misracpp2008Checkers.count(id)) + return true; + if (arg == "--misra-cpp-2023" && misracpp2023Checkers.count(id)) + return true; + } return false; } diff --git a/test/testother.cpp b/test/testother.cpp index 27f7700bd54..1c1c8640461 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -12512,7 +12512,7 @@ class TestOther : public TestFixture { " label:\n" "}\n", dinit(CheckOptions, $.settings = &s)); ASSERT_EQUALS("", errout_str()); - s.premiumArgs = "--premium=misra-c-2012"; // <- activates unusedLabel checking + s.premiumArgs = "--misra-c-2012"; // <- activates unusedLabel checking check("void f() {\n" " label:\n" "}\n", dinit(CheckOptions, $.settings = &s)); diff --git a/test/testsettings.cpp b/test/testsettings.cpp index ddd11de3273..8235e75f8c7 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -42,6 +42,9 @@ class TestSettings : public TestFixture { TEST_CASE(getMaxConfigsDefines); TEST_CASE(getMaxConfigsDefinesAndOpt); TEST_CASE(getMaxConfigsOptAndProject); + + TEST_CASE(isPremiumEnabledCert); + TEST_CASE(isPremiumEnabledMisra); } void simpleEnableGroup() const { @@ -356,6 +359,38 @@ class TestSettings : public TestFixture { s.maxConfigsProject = 10; ASSERT_EQUALS(3, s.getMaxConfigs()); } + + void isPremiumEnabledCert() const { + Settings s; + s.premiumArgs = "--cert-c-2016"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--cert-c"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--cert-c:all"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--cert-c++"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--cert-cpp"; + ASSERT(s.isPremiumEnabled("uninitvar")); + } + + void isPremiumEnabledMisra() const { + Settings s; + s.premiumArgs = "--misra-c-2012"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-c-2023"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-c-2025"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-cpp-2008"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-c++-2008"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-cpp-2023"; + ASSERT(s.isPremiumEnabled("uninitvar")); + s.premiumArgs = "--misra-c++-2023"; + ASSERT(s.isPremiumEnabled("uninitvar")); + } }; REGISTER_TEST(TestSettings)