Skip to content

Commit 74d1ca4

Browse files
authored
Fix #13981 (cli: import gui project that uses misra c 2012 with cppcheck premium) (danmar#7677)
1 parent 4d5a7f9 commit 74d1ca4

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

cli/cmdlineparser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
11261126

11271127
mSettings.checkAllConfigurations = false; // Can be overridden with --max-configs or --force
11281128
std::string projectFile = argv[i]+10;
1129-
projectType = project.import(projectFile, &mSettings, &mSuppressions);
1129+
projectType = project.import(projectFile, &mSettings, &mSuppressions, isCppcheckPremium());
11301130
if (projectType == ImportProject::Type::CPPCHECK_GUI) {
11311131
for (const std::string &lib : project.guiProject.libraries)
11321132
mSettings.libraries.emplace_back(lib);

lib/importproject.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ void ImportProject::fsSetIncludePaths(FileSettings& fs, const std::string &basep
165165
}
166166
}
167167

168-
ImportProject::Type ImportProject::import(const std::string &filename, Settings *settings, Suppressions *supprs)
168+
ImportProject::Type ImportProject::import(const std::string &filename, Settings *settings, Suppressions *supprs, bool premium)
169169
{
170170
std::ifstream fin(filename);
171171
if (!fin.is_open())
@@ -201,7 +201,7 @@ ImportProject::Type ImportProject::import(const std::string &filename, Settings
201201
return ImportProject::Type::BORLAND;
202202
}
203203
} else if (settings && supprs && endsWith(filename, ".cppcheck")) {
204-
if (importCppcheckGuiProject(fin, *settings, *supprs)) {
204+
if (importCppcheckGuiProject(fin, *settings, *supprs, premium)) {
205205
setRelativePaths(filename);
206206
return ImportProject::Type::CPPCHECK_GUI;
207207
}
@@ -1287,7 +1287,7 @@ static std::string istream_to_string(std::istream &istr)
12871287
return std::string(std::istreambuf_iterator<char>(istr), eos);
12881288
}
12891289

1290-
bool ImportProject::importCppcheckGuiProject(std::istream &istr, Settings &settings, Suppressions &supprs)
1290+
bool ImportProject::importCppcheckGuiProject(std::istream &istr, Settings &settings, Suppressions &supprs, bool premium)
12911291
{
12921292
tinyxml2::XMLDocument doc;
12931293
const std::string xmldata = istream_to_string(istr);
@@ -1371,6 +1371,13 @@ bool ImportProject::importCppcheckGuiProject(std::istream &istr, Settings &setti
13711371
else if (strcmp(name, CppcheckXml::AddonsElementName) == 0) {
13721372
const auto& addons = readXmlStringList(node, "", CppcheckXml::AddonElementName, nullptr);
13731373
temp.addons.insert(addons.cbegin(), addons.cend());
1374+
if (premium) {
1375+
auto it = temp.addons.find("misra");
1376+
if (it != temp.addons.end()) {
1377+
temp.addons.erase(it);
1378+
temp.premiumArgs += " --misra-c-2012";
1379+
}
1380+
}
13741381
}
13751382
else if (strcmp(name, CppcheckXml::TagsElementName) == 0)
13761383
node->Attribute(CppcheckXml::TagElementName); // FIXME: Write some warning

lib/importproject.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ class CPPCHECKLIB WARN_UNUSED ImportProject {
9898
void ignorePaths(const std::vector<std::string> &ipaths, bool debug = false);
9999
void ignoreOtherConfigs(const std::string &cfg);
100100

101-
Type import(const std::string &filename, Settings *settings=nullptr, Suppressions *supprs=nullptr);
101+
Type import(const std::string &filename, Settings *settings=nullptr, Suppressions *supprs=nullptr, bool premium=false);
102102
protected:
103103
bool importCompileCommands(std::istream &istr);
104-
bool importCppcheckGuiProject(std::istream &istr, Settings &settings, Suppressions &supprs);
104+
bool importCppcheckGuiProject(std::istream &istr, Settings &settings, Suppressions &supprs, bool premium);
105105

106106
private:
107107
struct SharedItemsProject {

test/testimportproject.cpp

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class TestImportProject : public TestFixture {
7070
TEST_CASE(importCompileCommandsDirectoryMissing); // 'directory' field missing
7171
TEST_CASE(importCompileCommandsDirectoryInvalid); // 'directory' field not a string
7272
TEST_CASE(importCppcheckGuiProject);
73+
TEST_CASE(importCppcheckGuiProjectPremiumMisra);
7374
TEST_CASE(ignorePaths);
7475
TEST_CASE(testVcxprojUnicode);
7576
}
@@ -431,14 +432,34 @@ class TestImportProject : public TestFixture {
431432
Settings s;
432433
Suppressions supprs;
433434
TestImporter project;
434-
ASSERT_EQUALS(true, project.importCppcheckGuiProject(istr, s, supprs));
435+
ASSERT_EQUALS(true, project.importCppcheckGuiProject(istr, s, supprs, false));
435436
ASSERT_EQUALS(1, project.guiProject.pathNames.size());
436437
ASSERT_EQUALS("cli/", project.guiProject.pathNames[0]);
437438
ASSERT_EQUALS(1, s.includePaths.size());
438439
ASSERT_EQUALS("lib/", s.includePaths.front());
439440
ASSERT_EQUALS(true, s.inlineSuppressions);
440441
}
441442

443+
void importCppcheckGuiProjectPremiumMisra() const {
444+
REDIRECT;
445+
constexpr char xml[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
446+
"<project>\n"
447+
" <paths>\n"
448+
" <dir name=\"m1.c\"/>\n"
449+
" </paths>\n"
450+
" <addons>\n"
451+
" <addon>misra</addon>\n" // <- Premium: add premium argument misra-c-2012
452+
" </addons>\n"
453+
"</project>";
454+
std::istringstream istr(xml);
455+
Settings s;
456+
Suppressions supprs;
457+
TestImporter project;
458+
ASSERT_EQUALS(true, project.importCppcheckGuiProject(istr, s, supprs, true));
459+
ASSERT_EQUALS("--misra-c-2012", s.premiumArgs);
460+
ASSERT(s.addons.empty());
461+
}
462+
442463
void ignorePaths() const {
443464
FileSettings fs1{"foo/bar", Standards::Language::CPP, 0};
444465
FileSettings fs2{"qwe/rty", Standards::Language::CPP, 0};

0 commit comments

Comments
 (0)