From 8604d63b2c3d6bd2e351223e898d29135ccbaccd Mon Sep 17 00:00:00 2001 From: firewave Date: Sat, 28 Mar 2026 07:44:45 +0100 Subject: [PATCH] fixed #6969 - added CLI option `--exitcode-suppress` --- cli/cmdlineparser.cpp | 12 ++++++++++++ man/cppcheck.1.xml | 11 +++++++++++ releasenotes.txt | 3 +++ test/testcmdlineparser.cpp | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 00eee88c66e..89ad59a6085 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -756,6 +756,15 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } } + else if (std::strncmp(argv[i], "--exitcode-suppress=", 20) == 0) { + const std::string suppression = argv[i]+20; + const std::string errmsg(mSuppressions.nofail.addSuppressionLine(suppression)); + if (!errmsg.empty()) { + mLogger.printError(errmsg); + return Result::Fail; + } + } + // Filter errors else if (std::strncmp(argv[i], "--exitcode-suppressions=", 24) == 0) { // exitcode-suppressions=filename.txt @@ -1811,6 +1820,9 @@ void CmdLineParser::printHelp() const " provided. Note that your operating system can modify\n" " this value, e.g. '256' can become '0'.\n" " --errorlist Print a list of all the error messages in XML format.\n" + " --exitcode-suppress=\n" + " Used to specify an error ID which should not result in\n" + " a non-zero exitcode." " --exitcode-suppressions=\n" " Used when certain messages should be displayed but\n" " should not cause a non-zero exitcode.\n" diff --git a/man/cppcheck.1.xml b/man/cppcheck.1.xml index db3a5a9baa6..8579d375bdf 100644 --- a/man/cppcheck.1.xml +++ b/man/cppcheck.1.xml @@ -117,6 +117,9 @@ man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/ + + + @@ -343,6 +346,14 @@ Example: '-UDEBUG' Print a list of all possible error messages in XML format. + + + + + + Used to specify an error ID which should not result in a non-zero exitcode. + + diff --git a/releasenotes.txt b/releasenotes.txt index 94e79a792e3..6a5d917fa10 100644 --- a/releasenotes.txt +++ b/releasenotes.txt @@ -21,3 +21,6 @@ Infrastructure & dependencies: Other: - Make it possible to specify the regular expression engine using the `engine` element in a rule XML. +- Added CLI option `--exitcode-suppress` to specify an error ID which should not result in a non-zero exitcode. +- +- diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 870e0ac341c..71dd068b39e 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -304,6 +304,10 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(suppressSingleFile); TEST_CASE(suppressTwo); TEST_CASE(suppressTwoSeparate); + TEST_CASE(exitcodeSuppressSingle); + TEST_CASE(exitcodeSuppressSingleFile); + TEST_CASE(exitcodeSuppressTwo); + TEST_CASE(exitcodeSuppressTwoSeparate); TEST_CASE(templates); TEST_CASE(templatesGcc); TEST_CASE(templatesVs); @@ -1986,6 +1990,35 @@ class TestCmdlineParser : public TestFixture { ASSERT_EQUALS(true, supprs->nomsg.isSuppressed(errorMessage("noConstructor", "file.cpp", 1U))); } + void exitcodeSuppressSingle() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--exitcode-suppress=uninitvar", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); + ASSERT_EQUALS(true, supprs->nofail.isSuppressed(errorMessage("uninitvar", "file.cpp", 1))); + } + + void exitcodeSuppressSingleFile() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--exitcode-suppress=uninitvar:file.cpp", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); + ASSERT_EQUALS(true, supprs->nofail.isSuppressed(errorMessage("uninitvar", "file.cpp", 1U))); + } + + void exitcodeSuppressTwo() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--exitcode-suppress=uninitvar,noConstructor", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Fail, parseFromArgs(argv)); + ASSERT_EQUALS("cppcheck: error: Failed to add suppression. Invalid id \"uninitvar,noConstructor\"\n", logger->str()); + } + + void exitcodeSuppressTwoSeparate() { + REDIRECT; + const char * const argv[] = {"cppcheck", "--exitcode-suppress=uninitvar", "--exitcode-suppress=noConstructor", "file.cpp"}; + ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parseFromArgs(argv)); + ASSERT_EQUALS(true, supprs->nofail.isSuppressed(errorMessage("uninitvar", "file.cpp", 1U))); + ASSERT_EQUALS(true, supprs->nofail.isSuppressed(errorMessage("noConstructor", "file.cpp", 1U))); + } + void templates() { REDIRECT; const char * const argv[] = {"cppcheck", "--template={file}:{line},{severity},{id},{message}", "--template-location={file}:{line}:{column} {info}", "file.cpp"};