Skip to content

Commit

Permalink
fix #13021: cmdline: validate option --std (#6740)
Browse files Browse the repository at this point in the history
  • Loading branch information
ludviggunne committed Aug 31, 2024
1 parent e775c55 commit ff85ecd
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 10 deletions.
14 changes: 6 additions & 8 deletions cli/cmdlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1261,14 +1261,12 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
// --std
else if (std::strncmp(argv[i], "--std=", 6) == 0) {
const std::string std = argv[i] + 6;
// TODO: print error when standard is unknown
if (std::strncmp(std.c_str(), "c++", 3) == 0) {
mSettings.standards.cpp = Standards::getCPP(std);
}
else if (std::strncmp(std.c_str(), "c", 1) == 0) {
mSettings.standards.c = Standards::getC(std);
}
else {
Standards tmp;
if (tmp.setC(std)) {
mSettings.standards.c = tmp.c;
} else if (tmp.setCPP(std)) {
mSettings.standards.cpp = tmp.cpp;
} else {
mLogger.printError("unknown --std value '" + std + "'");
return Result::Fail;
}
Expand Down
58 changes: 56 additions & 2 deletions test/testcmdlineparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,12 @@ class TestCmdlineParser : public TestFixture {
TEST_CASE(stdcpp11);
TEST_CASE(stdunknown1);
TEST_CASE(stdunknown2);
TEST_CASE(stdoverwrite1);
TEST_CASE(stdoverwrite2);
TEST_CASE(stdoverwrite3);
TEST_CASE(stdoverwrite4);
TEST_CASE(stdmulti1);
TEST_CASE(stdmulti2);
TEST_CASE(platformWin64);
TEST_CASE(platformWin32A);
TEST_CASE(platformWin32W);
Expand Down Expand Up @@ -1369,8 +1375,56 @@ class TestCmdlineParser : public TestFixture {
void stdunknown2() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=cplusplus11", "file.cpp"};
TODO_ASSERT_EQUALS(static_cast<int>(CmdLineParser::Result::Fail), static_cast<int>(CmdLineParser::Result::Success), static_cast<int>(parser->parseFromArgs(3, argv)));
TODO_ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", "", logger->str());
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parser->parseFromArgs(3, argv));
ASSERT_EQUALS("cppcheck: error: unknown --std value 'cplusplus11'\n", logger->str());
}

void stdoverwrite1() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c++23", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp);
ASSERT_EQUALS_ENUM(Standards::CLatest, settings->standards.c);
}

void stdoverwrite2() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c11", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
ASSERT_EQUALS_ENUM(Standards::CPPLatest, settings->standards.cpp);
}

void stdoverwrite3() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "--std=c11", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv));
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp);
}

void stdoverwrite4() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c++11", "--std=c99", "--std=c++23", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(5, argv));
ASSERT_EQUALS_ENUM(Standards::CPP23, settings->standards.cpp);
ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c);
}

void stdmulti1() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c99", "--std=c++11", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
ASSERT_EQUALS_ENUM(Standards::C99, settings->standards.c);
ASSERT_EQUALS_ENUM(Standards::CPP11, settings->standards.cpp);
}

void stdmulti2() {
REDIRECT;
const char *const argv[] = {"cppcheck", "--std=c++20", "--std=c11", "file.cpp"};
ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv));
ASSERT_EQUALS_ENUM(Standards::C11, settings->standards.c);
ASSERT_EQUALS_ENUM(Standards::CPP20, settings->standards.cpp);
}

void platformWin64() {
Expand Down

0 comments on commit ff85ecd

Please sign in to comment.