From 14e540a2dc6433ef2ba1c20b64a4d0d0b040966d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 12 Jan 2024 11:30:51 +0100 Subject: [PATCH] Fix #12341 (If --premium=safety is used then go to "safety mode". do not override this in cppcheck.cfg) (#5872) --- cli/cmdlineparser.cpp | 2 ++ lib/settings.cpp | 2 +- test/testcmdlineparser.cpp | 12 ++++++++++++ test/testsettings.cpp | 29 +++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 0cb85af412b..ba374586faa 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -890,6 +890,8 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // Special Cppcheck Premium options else if (std::strncmp(argv[i], "--premium=", 10) == 0 && isCppcheckPremium()) { + if (std::strcmp(argv[i], "--premium=safety") == 0) + mSettings.safety = true; if (!mSettings.premiumArgs.empty()) mSettings.premiumArgs += " "; const std::string p(argv[i] + 10); diff --git a/lib/settings.cpp b/lib/settings.cpp index a58e75b2c21..393ce377732 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -125,7 +125,7 @@ std::string Settings::loadCppcheckCfg() const auto& v = it->second; if (!v.is()) return "'safety' is not a bool"; - safety = v.get(); + safety = safety || v.get(); } } diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index e5905cddef6..e0d0f3de65e 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -213,6 +213,7 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(maxConfigsMissingCount); TEST_CASE(maxConfigsInvalid); TEST_CASE(maxConfigsTooSmall); + TEST_CASE(premiumSafety); TEST_CASE(reportProgress1); TEST_CASE(reportProgress2); TEST_CASE(reportProgress3); @@ -1186,6 +1187,17 @@ class TestCmdlineParser : public TestFixture { ASSERT_EQUALS("cppcheck: error: argument to '--max-configs=' must be greater than 0.\n", logger->str()); } + void premiumSafety() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--premium=safety", "file.cpp"}; + settings->safety = false; + settings->cppcheckCfgProductName = "Cppcheck Premium 0.0.0"; + ASSERT_EQUALS(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); + ASSERT_EQUALS(true, settings->safety); + settings->safety = false; + settings->cppcheckCfgProductName.clear(); + } + void reportProgress1() { REDIRECT; const char * const argv[] = {"cppcheck", "--report-progress", "file.cpp"}; diff --git a/test/testsettings.cpp b/test/testsettings.cpp index f09dfed1aa4..6c2b2de2d7c 100644 --- a/test/testsettings.cpp +++ b/test/testsettings.cpp @@ -30,6 +30,7 @@ class TestSettings : public TestFixture { void run() override { TEST_CASE(simpleEnableGroup); TEST_CASE(loadCppcheckCfg); + TEST_CASE(loadCppcheckCfgSafety); } void simpleEnableGroup() const { @@ -209,6 +210,34 @@ class TestSettings : public TestFixture { // TODO: test with FILESDIR } + + void loadCppcheckCfgSafety() const + { + // Test the "safety" flag + { + Settings s; + s.safety = false; + ScopedFile file("cppcheck.cfg", "{}"); + ASSERT_EQUALS("", s.loadCppcheckCfg()); + ASSERT_EQUALS(false, s.safety); + } + + { + Settings s; + s.safety = true; + ScopedFile file("cppcheck.cfg", "{\"safety\": false}"); + ASSERT_EQUALS("", s.loadCppcheckCfg()); + ASSERT_EQUALS(true, s.safety); + } + + { + Settings s; + s.safety = false; + ScopedFile file("cppcheck.cfg", "{\"safety\": true}"); + ASSERT_EQUALS("", s.loadCppcheckCfg()); + ASSERT_EQUALS(true, s.safety); + } + } }; REGISTER_TEST(TestSettings)