From 85d90bf3f3b76b656fa7291ce339d00e5256f290 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 10 Sep 2026 21:16:14 +0200 Subject: [PATCH 1/7] Fix #15025 (settings: match cert c premium options better) --- lib/settings.cpp | 10 ++++++++-- test/testsettings.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/settings.cpp b/lib/settings.cpp index 410f3d5107d..96ce07cf680 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -795,16 +795,22 @@ bool Settings::isPremiumEnabled(const char id[]) const 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("cert-cpp") != std::string::npos && certCppCheckers.count(id)) + return true; + if (premiumArgs.find("cert-c") != std::string::npos && certCCheckers.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-cpp-2008") != std::string::npos && misracpp2008Checkers.count(id)) + return true; if (premiumArgs.find("misra-c++-2023") != std::string::npos && misracpp2023Checkers.count(id)) return true; + if (premiumArgs.find("misra-cpp-2023") != std::string::npos && misracpp2023Checkers.count(id)) + return true; return false; } diff --git a/test/testsettings.cpp b/test/testsettings.cpp index ddd11de3273..8a78ebc0fe4 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -42,6 +42,8 @@ class TestSettings : public TestFixture { TEST_CASE(getMaxConfigsDefines); TEST_CASE(getMaxConfigsDefinesAndOpt); TEST_CASE(getMaxConfigsOptAndProject); + + TEST_CASE(isPremiumEnabledCert); } void simpleEnableGroup() const { @@ -356,6 +358,14 @@ 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")); + } }; REGISTER_TEST(TestSettings) From e7f928d662c2a706113d2a97e897fad8db7b0d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Thu, 10 Sep 2026 21:42:52 +0200 Subject: [PATCH 2/7] 2 --- test/testsettings.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/testsettings.cpp b/test/testsettings.cpp index 8a78ebc0fe4..67fbd9b7ccc 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -44,6 +44,7 @@ class TestSettings : public TestFixture { TEST_CASE(getMaxConfigsOptAndProject); TEST_CASE(isPremiumEnabledCert); + TEST_CASE(isPremiumEnabledMisra); } void simpleEnableGroup() const { @@ -365,6 +366,28 @@ class TestSettings : public TestFixture { ASSERT(s.isPremiumEnabled("uninitvar")); s.premiumArgs = "cert-c"; 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")); } }; From 1363faf18bf255c91fcfb814e0527043907ded3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2026 06:33:54 +0200 Subject: [PATCH 3/7] refactor --- lib/settings.cpp | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/lib/settings.cpp b/lib/settings.cpp index 96ce07cf680..7332239b6ac 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -791,26 +791,25 @@ 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 && certCppCheckers.count(id)) - return true; - if (premiumArgs.find("cert-cpp") != std::string::npos && certCppCheckers.count(id)) - return true; - if (premiumArgs.find("cert-c") != std::string::npos && certCCheckers.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-cpp-2008") != std::string::npos && misracpp2008Checkers.count(id)) - return true; - if (premiumArgs.find("misra-c++-2023") != std::string::npos && misracpp2023Checkers.count(id)) - return true; - if (premiumArgs.find("misra-cpp-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 (startsWith(arg, "autosar") && autosarCheckers.count(id)) + return true; + if (startsWith(arg, "cert-cpp") && certCppCheckers.count(id)) + return true; + if (startsWith(arg, "cert-c") && certCCheckers.count(id)) + return true; + if (startsWith(arg, "misra-c-2012") && misrac2012Checkers.count(id)) + return true; + if (startsWith(arg, "misra-c-2023") && misrac2023Checkers.count(id)) + return true; + if (startsWith(arg, "misra-c-2025") && misrac2025Checkers.count(id)) + return true; + if (startsWith(arg, "misra-cpp-2008") && misracpp2008Checkers.count(id)) + return true; + if (startsWith(arg, "misra-cpp-2023") && misracpp2023Checkers.count(id)) + return true; + } return false; } From aff1fe916071ef8d547e38c4e116c66450909de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2026 06:59:17 +0200 Subject: [PATCH 4/7] 2 --- lib/settings.cpp | 16 ++++++++-------- test/testsettings.cpp | 22 +++++++++++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/lib/settings.cpp b/lib/settings.cpp index 7332239b6ac..429684f1e6f 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -793,21 +793,21 @@ bool Settings::isPremiumEnabled(const char id[]) const { for (std::string arg: splitString(premiumArgs, ' ')) { std::transform(arg.cbegin(), arg.cend(), arg.begin(), [](char c) { return c=='+' ? 'p' : c; }); - if (startsWith(arg, "autosar") && autosarCheckers.count(id)) + if (startsWith(arg, "--autosar") && autosarCheckers.count(id)) return true; - if (startsWith(arg, "cert-cpp") && certCppCheckers.count(id)) + if (startsWith(arg, "--cert-cpp") && certCppCheckers.count(id)) return true; - if (startsWith(arg, "cert-c") && certCCheckers.count(id)) + if (startsWith(arg, "--cert-c") && certCCheckers.count(id)) return true; - if (startsWith(arg, "misra-c-2012") && misrac2012Checkers.count(id)) + if (startsWith(arg, "--misra-c-2012") && misrac2012Checkers.count(id)) return true; - if (startsWith(arg, "misra-c-2023") && misrac2023Checkers.count(id)) + if (startsWith(arg, "--misra-c-2023") && misrac2023Checkers.count(id)) return true; - if (startsWith(arg, "misra-c-2025") && misrac2025Checkers.count(id)) + if (startsWith(arg, "--misra-c-2025") && misrac2025Checkers.count(id)) return true; - if (startsWith(arg, "misra-cpp-2008") && misracpp2008Checkers.count(id)) + if (startsWith(arg, "--misra-cpp-2008") && misracpp2008Checkers.count(id)) return true; - if (startsWith(arg, "misra-cpp-2023") && misracpp2023Checkers.count(id)) + if (startsWith(arg, "--misra-cpp-2023") && misracpp2023Checkers.count(id)) return true; } return false; diff --git a/test/testsettings.cpp b/test/testsettings.cpp index 67fbd9b7ccc..024c278e9fd 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -362,31 +362,31 @@ class TestSettings : public TestFixture { void isPremiumEnabledCert() const { Settings s; - s.premiumArgs = "cert-c-2016"; + s.premiumArgs = "--cert-c-2016"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "cert-c"; + s.premiumArgs = "--cert-c"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "cert-c++"; + s.premiumArgs = "--cert-c++"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "cert-cpp"; + s.premiumArgs = "--cert-cpp"; ASSERT(s.isPremiumEnabled("uninitvar")); } void isPremiumEnabledMisra() const { Settings s; - s.premiumArgs = "misra-c-2012"; + s.premiumArgs = "--misra-c-2012"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-c-2023"; + s.premiumArgs = "--misra-c-2023"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-c-2025"; + s.premiumArgs = "--misra-c-2025"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-cpp-2008"; + s.premiumArgs = "--misra-cpp-2008"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-c++-2008"; + s.premiumArgs = "--misra-c++-2008"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-cpp-2023"; + s.premiumArgs = "--misra-cpp-2023"; ASSERT(s.isPremiumEnabled("uninitvar")); - s.premiumArgs = "misra-c++-2023"; + s.premiumArgs = "--misra-c++-2023"; ASSERT(s.isPremiumEnabled("uninitvar")); } }; From ee01d1feee2ef3b84a62c8626a74ed92517d2936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2026 07:55:34 +0200 Subject: [PATCH 5/7] TestOther::testUnusedLabelPremiumMisra --- test/testother.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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)); From 935af5599a690087e56dfff5a28e4a64e01c9037 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2026 08:51:20 +0200 Subject: [PATCH 6/7] refactor --- lib/settings.cpp | 20 ++++++++++++-------- test/testsettings.cpp | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/settings.cpp b/lib/settings.cpp index 429684f1e6f..f3fc838592b 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -793,21 +793,25 @@ bool Settings::isPremiumEnabled(const char id[]) const { for (std::string arg: splitString(premiumArgs, ' ')) { std::transform(arg.cbegin(), arg.cend(), arg.begin(), [](char c) { return c=='+' ? 'p' : c; }); - if (startsWith(arg, "--autosar") && autosarCheckers.count(id)) + if (endsWith(arg, ":all")) + arg.erase(arg.size()-4); + if (arg == "--autosar" && autosarCheckers.count(id)) return true; - if (startsWith(arg, "--cert-cpp") && certCppCheckers.count(id)) + if (arg == "--cert-c" && certCCheckers.count(id)) + return true; + if (arg == "--cert-c-2016" && certCCheckers.count(id)) return true; - if (startsWith(arg, "--cert-c") && certCCheckers.count(id)) + if (startsWith(arg, "--cert-cpp") && certCppCheckers.count(id)) return true; - if (startsWith(arg, "--misra-c-2012") && misrac2012Checkers.count(id)) + if (arg == "--misra-c-2012" && misrac2012Checkers.count(id)) return true; - if (startsWith(arg, "--misra-c-2023") && misrac2023Checkers.count(id)) + if (arg == "--misra-c-2023" && misrac2023Checkers.count(id)) return true; - if (startsWith(arg, "--misra-c-2025") && misrac2025Checkers.count(id)) + if (arg == "--misra-c-2025" && misrac2025Checkers.count(id)) return true; - if (startsWith(arg, "--misra-cpp-2008") && misracpp2008Checkers.count(id)) + if (arg == "--misra-cpp-2008" && misracpp2008Checkers.count(id)) return true; - if (startsWith(arg, "--misra-cpp-2023") && misracpp2023Checkers.count(id)) + if (arg == "--misra-cpp-2023" && misracpp2023Checkers.count(id)) return true; } return false; diff --git a/test/testsettings.cpp b/test/testsettings.cpp index 024c278e9fd..8235e75f8c7 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -366,6 +366,8 @@ class TestSettings : public TestFixture { 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"; From 6c93a1f61f5bbf165656fc705b753337e3cd44ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 11 Sep 2026 08:54:59 +0200 Subject: [PATCH 7/7] format --- lib/settings.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/settings.cpp b/lib/settings.cpp index f3fc838592b..da576f7a5c8 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -792,7 +792,9 @@ static const std::set misracpp2023Checkers{ bool Settings::isPremiumEnabled(const char id[]) const { for (std::string arg: splitString(premiumArgs, ' ')) { - std::transform(arg.cbegin(), arg.cend(), arg.begin(), [](char c) { return c=='+' ? 'p' : c; }); + 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))