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;
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):
-
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)
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"