Skip to content

Commit b397caa

Browse files
authored
Fix #12344 (cmdline: better validation of premium options) (danmar#5875)
1 parent 09189b8 commit b397caa

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

cli/cmdlineparser.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -890,11 +890,26 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
890890

891891
// Special Cppcheck Premium options
892892
else if (std::strncmp(argv[i], "--premium=", 10) == 0 && isCppcheckPremium()) {
893+
const std::set<std::string> valid{
894+
"autosar",
895+
"cert-c-2016",
896+
"cert-c++-2016",
897+
"misra-c-2012",
898+
"misra-c-2023",
899+
"misra-c++-2008",
900+
"misra-c++-2023",
901+
"bughunting",
902+
"safety"};
903+
893904
if (std::strcmp(argv[i], "--premium=safety") == 0)
894905
mSettings.safety = true;
895906
if (!mSettings.premiumArgs.empty())
896907
mSettings.premiumArgs += " ";
897908
const std::string p(argv[i] + 10);
909+
if (!valid.count(p) && !startsWith(p, "cert-c-int-precision=")) {
910+
mLogger.printError("invalid --premium option '" + p + "'.");
911+
return Result::Fail;
912+
}
898913
mSettings.premiumArgs += "--" + p;
899914
if (p == "misra-c-2012" || p == "misra-c-2023")
900915
mSettings.addons.emplace("misra");
@@ -1516,10 +1531,11 @@ void CmdLineParser::printHelp() const
15161531
" * cert-c++-2016 Cert C++ 2016 checking\n"
15171532
" * misra-c-2012 Misra C 2012\n"
15181533
" * misra-c-2023 Misra C 2023\n"
1519-
" * misra-c++-2008 Misra C++ 2008 (partial)\n"
1534+
" * misra-c++-2008 Misra C++ 2008\n"
15201535
" Other:\n"
15211536
" * bughunting Soundy analysis\n"
1522-
" * cert-c-int-precision=BITS Integer precision to use in Cert C analysis.\n";
1537+
" * cert-c-int-precision=BITS Integer precision to use in Cert C analysis.\n"
1538+
" * safety Safe mode\n";
15231539
}
15241540

15251541
oss <<

test/testcmdlineparser.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ class TestCmdlineParser : public TestFixture {
213213
TEST_CASE(maxConfigsMissingCount);
214214
TEST_CASE(maxConfigsInvalid);
215215
TEST_CASE(maxConfigsTooSmall);
216+
TEST_CASE(premiumOptions);
216217
TEST_CASE(premiumSafety);
217218
TEST_CASE(reportProgress1);
218219
TEST_CASE(reportProgress2);
@@ -1187,6 +1188,36 @@ class TestCmdlineParser : public TestFixture {
11871188
ASSERT_EQUALS("cppcheck: error: argument to '--max-configs=' must be greater than 0.\n", logger->str());
11881189
}
11891190

1191+
void premiumOptions() {
1192+
REDIRECT;
1193+
settings->cppcheckCfgProductName = "Cppcheck Premium 0.0.0";
1194+
{
1195+
const char * const argv[] = {"cppcheck", "--premium=misra-c-2012", "file.c"};
1196+
ASSERT_EQUALS(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
1197+
}
1198+
{
1199+
const char * const argv[] = {"cppcheck", "--premium=misra-c++-2023", "file.c"};
1200+
ASSERT_EQUALS(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
1201+
}
1202+
{
1203+
const char * const argv[] = {"cppcheck", "--premium=cert-c++-2016", "file.c"};
1204+
ASSERT_EQUALS(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv));
1205+
}
1206+
// invalid options
1207+
{
1208+
const char * const argv[] = {"cppcheck", "--premium=misra", "file.c"};
1209+
ASSERT_EQUALS(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
1210+
ASSERT_EQUALS("cppcheck: error: invalid --premium option 'misra'.\n", logger->str());
1211+
}
1212+
{
1213+
const char * const argv[] = {"cppcheck", "--premium=cert", "file.c"};
1214+
ASSERT_EQUALS(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
1215+
ASSERT_EQUALS("cppcheck: error: invalid --premium option 'cert'.\n", logger->str());
1216+
}
1217+
settings->cppcheckCfgProductName.clear();
1218+
settings->premiumArgs.clear();
1219+
}
1220+
11901221
void premiumSafety() {
11911222
REDIRECT;
11921223
const char * const argv[] = {"cppcheck", "--premium=safety", "file.cpp"};

0 commit comments

Comments
 (0)