Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion lib/importproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion test/cli/more-projects_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,6 @@ def test_project_empty_fields(tmpdir):
</libraries>
<suppressions/>
<suppressions>
<suppression/>
</suppressions>
<vs-configurations/>
<vs-configurations>
Expand Down
33 changes: 33 additions & 0 deletions test/cli/project-suppressions.py
Original file line number Diff line number Diff line change
@@ -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)
21 changes: 21 additions & 0 deletions test/testimportproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -536,6 +537,26 @@ class TestImportProject : public TestFixture {
ASSERT_EQUALS(true, s.inlineSuppressions);
}

void importCppcheckGuiProjectDuplicateSuppressions() const {
REDIRECT;
constexpr char xml[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<project version=\"1\">\n"
" <root name=\".\"/>\n"
" <project-name>test test</project-name>\n"
" <suppressions>\n"
" <suppression>uninitvar</suppression>\n"
" <suppression>uninitvar</suppression>\n"
" </suppressions>\n"
"</project>\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[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
Expand Down
Loading