From 88eb7685b48a2a5d99e2c4caca18dbd8e7922980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 27 Jul 2026 10:50:36 +0200 Subject: [PATCH 1/4] add test --- test/testimportproject.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/testimportproject.cpp b/test/testimportproject.cpp index c9889445c3c..873272030f6 100644 --- a/test/testimportproject.cpp +++ b/test/testimportproject.cpp @@ -79,6 +79,7 @@ class TestImportProject : public TestFixture { TEST_CASE(importCompileCommandsDirectoryMissing); // 'directory' field missing TEST_CASE(importCompileCommandsDirectoryInvalid); // 'directory' field not a string TEST_CASE(importCppcheckGuiProject); + TEST_CASE(importCppcheckGuiProjectDuplicateSuppressions); TEST_CASE(importCppcheckGuiProjectPremiumMisra); TEST_CASE(ignorePaths); TEST_CASE(testVcxprojUnicode); @@ -536,6 +537,26 @@ class TestImportProject : public TestFixture { ASSERT_EQUALS(true, s.inlineSuppressions); } + void importCppcheckGuiProjectDuplicateSuppressions() const { + REDIRECT; + constexpr char xml[] = "\n" + "\n" + " \n" + " test test\n" + " \n" + " uninitvar\n" + " uninitvar\n" + " \n" + "\n"; + std::istringstream istr(xml); + Settings s; + Suppressions supprs; + TestImporter project; + ASSERT_EQUALS(false, project.importCppcheckGuiProject(istr, s, supprs)); + ASSERT_EQUALS(1, project.errors.size()); + ASSERT_EQUALS("suppression 'uninitvar' already exists", project.errors[0]); + } + void importCppcheckGuiProjectPremiumMisra() const { REDIRECT; constexpr char xml[] = "\n" From ecba564006201bd445255bd2403aa269a38590d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 27 Jul 2026 11:05:06 +0200 Subject: [PATCH 2/4] update cli test --- test/cli/more-projects_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cli/more-projects_test.py b/test/cli/more-projects_test.py index 504a2b14431..98304bbe8aa 100644 --- a/test/cli/more-projects_test.py +++ b/test/cli/more-projects_test.py @@ -173,7 +173,6 @@ def test_project_empty_fields(tmpdir): - From 57e64e561e22919bae021b8bafcf5c075de87ee4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 27 Jul 2026 12:06:32 +0200 Subject: [PATCH 3/4] add cli test --- test/cli/project-suppressions.py | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 test/cli/project-suppressions.py diff --git a/test/cli/project-suppressions.py b/test/cli/project-suppressions.py new file mode 100644 index 00000000000..e2b6ba5e7d6 --- /dev/null +++ b/test/cli/project-suppressions.py @@ -0,0 +1,33 @@ + +# python -m pytest project-suppressions.py + +from testutils import create_gui_project_file, assert_cppcheck + +def test_cli_and_project_suppressions(tmp_path): + # Uninitvar suppressed in project file + suppressions = [{ 'id': 'uninitvar' }] + project_path = tmp_path / 'project.cppcheck' + create_gui_project_file(project_path, root_path=str(tmp_path), suppressions=suppressions) + + # Uninitvar suppressed on command line before import + args = ['--suppress=uninitvar', f'--project={project_path}'] + out_exp = [ + "cppcheck: error: suppression 'uninitvar' already exists", + f"cppcheck: error: failed to load project '{project_path}'. An error occurred." + ] + assert_cppcheck(args, ec_exp=1, out_exp=out_exp) + +def test_multiple_cli_and_project_suppressions(tmp_path): + # Uninitvar and unreadVariable suppressed in project file + suppressions = [{ 'id': 'uninitvar' }, { 'id': 'unreadVariable' },] + project_path = tmp_path / 'project.cppcheck' + create_gui_project_file(project_path, root_path=str(tmp_path), suppressions=suppressions) + + # Uninitvar and unreadVariable suppressed on command line before import + args = ['--suppress=uninitvar', '--suppress=unreadVariable', f'--project={project_path}'] + out_exp = [ + "cppcheck: error: suppression 'uninitvar' already exists", + "cppcheck: error: suppression 'unreadVariable' already exists", + f"cppcheck: error: failed to load project '{project_path}'. An error occurred." + ] + assert_cppcheck(args, ec_exp=1, out_exp=out_exp) From 764acedb7981173aaba520854325578401f8df57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludvig=20Gunne=20Lindstr=C3=B6m?= Date: Mon, 27 Jul 2026 09:19:22 +0200 Subject: [PATCH 4/4] fix --- lib/importproject.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 0e6ca353480..242c1719ba9 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -1653,7 +1653,18 @@ bool ImportProject::importCppcheckGuiProject(std::istream &istr, Settings &setti for (const std::string &p : paths) guiProject.pathNames.push_back(Path::fromNativeSeparators(p)); - supprs.nomsg.addSuppressions(std::move(suppressions)); // TODO: check result + + bool ok = true; + for (const auto &suppression : suppressions) { + const std::string addError = supprs.nomsg.addSuppression(suppression); + if (!addError.empty()) { + errors.emplace_back(addError); + ok = false; + } + } + if (!ok) + return false; + settings.checkHeaders = temp.checkHeaders; settings.checkUnusedTemplates = temp.checkUnusedTemplates; settings.maxCtuDepth = temp.maxCtuDepth;