Skip to content

Commit ff85ecd

Browse files
authored
fix #13021: cmdline: validate option --std (danmar#6740)
1 parent e775c55 commit ff85ecd

File tree

2 files changed

+62
-10
lines changed

2 files changed

+62
-10
lines changed

cli/cmdlineparser.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,14 +1261,12 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
12611261
// --std
12621262
else if (std::strncmp(argv[i], "--std=", 6) == 0) {
12631263
const std::string std = argv[i] + 6;
1264-
// TODO: print error when standard is unknown
1265-
if (std::strncmp(std.c_str(), "c++", 3) == 0) {
1266-
mSettings.standards.cpp = Standards::getCPP(std);
1267-
}
1268-
else if (std::strncmp(std.c_str(), "c", 1) == 0) {
1269-
mSettings.standards.c = Standards::getC(std);
1270-
}
1271-
else {
1264+
Standards tmp;
1265+
if (tmp.setC(std)) {
1266+
mSettings.standards.c = tmp.c;
1267+
} else if (tmp.setCPP(std)) {
1268+
mSettings.standards.cpp = tmp.cpp;
1269+
} else {
12721270
mLogger.printError("unknown --std value '" + std + "'");
12731271
return Result::Fail;
12741272
}

test/testcmdlineparser.cpp

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,12 @@ class TestCmdlineParser : public TestFixture {
225225
TEST_CASE(stdcpp11);
226226
TEST_CASE(stdunknown1);
227227
TEST_CASE(stdunknown2);
228+
TEST_CASE(stdoverwrite1);
229+
TEST_CASE(stdoverwrite2);
230+
TEST_CASE(stdoverwrite3);
231+
TEST_CASE(stdoverwrite4);
232+
TEST_CASE(stdmulti1);
233+
TEST_CASE(stdmulti2);
228234
TEST_CASE(platformWin64);
229235
TEST_CASE(platformWin32A);
230236
TEST_CASE(platformWin32W);
@@ -1369,8 +1375,56 @@ class TestCmdlineParser : public TestFixture {
13691375
void stdunknown2() {
13701376
REDIRECT;
13711377
const char *const argv[] = {"cppcheck", "--std=cplusplus11", "file.cpp"};
1372-
TODO_ASSERT_EQUALS(static_cast<int>(CmdLineParser::Result::Fail), static_cast<int>(CmdLineParser::Result::Success), static_cast<int>(parser->parseFromArgs(3, argv)));
1373-
TODO_ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", "", logger->str());
1378+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
1379+
ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", logger->str());
1380+
}
1381+
1382+
void stdoverwrite1() {
1383+
REDIRECT;
1384+
const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c++23", "file.cpp"};
1385+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
1386+
ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp);
1387+
ASSERT_EQUALS_ENUM(Standards::CLatest, settings->standards.c);
1388+
}
1389+
1390+
void stdoverwrite2() {
1391+
REDIRECT;
1392+
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c11", "file.cpp"};
1393+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
1394+
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
1395+
ASSERT_EQUALS_ENUM(Standards::CPPLatest, settings->standards.cpp);
1396+
}
1397+
1398+
void stdoverwrite3() {
1399+
REDIRECT;
1400+
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "--std=c11", "file.cpp"};
1401+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv));
1402+
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
1403+
ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp);
1404+
}
1405+
1406+
void stdoverwrite4() {
1407+
REDIRECT;
1408+
const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c99", "--std=c++23", "file.cpp"};
1409+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv));
1410+
ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp);
1411+
ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c);
1412+
}
1413+
1414+
void stdmulti1() {
1415+
REDIRECT;
1416+
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "file.cpp"};
1417+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
1418+
ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c);
1419+
ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp);
1420+
}
1421+
1422+
void stdmulti2() {
1423+
REDIRECT;
1424+
const char *const argv[] = {"cppcheck", "--std=c++20", "--std=c11", "file.cpp"};
1425+
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
1426+
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
1427+
ASSERT_EQUALS_ENUM(Standards::CPP20, settings->standards.cpp);
13741428
}
13751429

13761430
void platformWin64() {

0 commit comments

Comments
 (0)