Skip to content

Commit e35d5d3

Browse files
authored
Fix #11882 (add --premium=misra-c-2023 option) (cppcheck-opensource#5363)
1 parent 2adaafd commit e35d5d3

4 files changed

Lines changed: 58 additions & 12 deletions

File tree

cli/cmdlineparser.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
666666
mSettings.premiumArgs += " ";
667667
const std::string p(argv[i] + 10);
668668
mSettings.premiumArgs += "--" + p;
669-
if (p == "misra-c-2012")
669+
if (p == "misra-c-2012" || p == "misra-c-2023")
670670
mSettings.addons.emplace("misra");
671671
}
672672

@@ -1270,6 +1270,7 @@ void CmdLineParser::printHelp()
12701270
<< " * cert-c-2016 Cert C 2016 checking\n"
12711271
<< " * cert-c++-2016 Cert C++ 2016 checking (partial)\n"
12721272
<< " * misra-c-2012 Misra C 2012\n"
1273+
<< " * misra-c-2023 Misra C 2023\n"
12731274
<< " * misra-c++-2008 Misra C++ 2008 (partial)\n"
12741275
<< " Other:\n"
12751276
<< " * bughunting Soundy analysis\n"

gui/projectfile.ui

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -806,11 +806,42 @@
806806
</property>
807807
<layout class="QVBoxLayout" name="verticalLayout_20">
808808
<item>
809-
<widget class="QCheckBox" name="mMisraC2012">
810-
<property name="text">
811-
<string>Misra C 2012</string>
812-
</property>
813-
</widget>
809+
<layout class="QHBoxLayout" name="horizontalLayout_6">
810+
<item>
811+
<widget class="QCheckBox" name="mMisraC">
812+
<property name="text">
813+
<string>Misra C</string>
814+
</property>
815+
</widget>
816+
</item>
817+
<item>
818+
<widget class="QComboBox" name="mMisraVersion">
819+
<item>
820+
<property name="text">
821+
<string>2012</string>
822+
</property>
823+
</item>
824+
<item>
825+
<property name="text">
826+
<string>2023</string>
827+
</property>
828+
</item>
829+
</widget>
830+
</item>
831+
<item>
832+
<spacer name="horizontalSpacer_4">
833+
<property name="orientation">
834+
<enum>Qt::Horizontal</enum>
835+
</property>
836+
<property name="sizeHint" stdset="0">
837+
<size>
838+
<width>40</width>
839+
<height>20</height>
840+
</size>
841+
</property>
842+
</spacer>
843+
</item>
844+
</layout>
814845
</item>
815846
<item>
816847
<layout class="QHBoxLayout" name="mLayoutMisraRuleTexts">

gui/projectfiledialog.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
#include <QtCore>
5959

6060
static const char ADDON_MISRA[] = "misra";
61+
static const char CODING_STANDARD_MISRA_C_2023[] = "misra-c-2023";
6162
static const char CODING_STANDARD_MISRA_CPP_2008[] = "misra-cpp-2008";
6263
static const char CODING_STANDARD_CERT_C[] = "cert-c-2016";
6364
static const char CODING_STANDARD_CERT_CPP[] = "cert-cpp-2016";
@@ -370,15 +371,22 @@ void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
370371
const QString dataDir = getDataDir();
371372
updateAddonCheckBox(mUI->mAddonThreadSafety, projectFile, dataDir, "threadsafety");
372373
updateAddonCheckBox(mUI->mAddonY2038, projectFile, dataDir, "y2038");
373-
updateAddonCheckBox(mUI->mMisraC2012, projectFile, dataDir, ADDON_MISRA);
374+
375+
// Misra checkbox..
376+
mUI->mMisraC->setText(mPremium ? "Misra C" : "Misra C 2012");
377+
updateAddonCheckBox(mUI->mMisraC, projectFile, dataDir, ADDON_MISRA);
378+
mUI->mMisraVersion->setEnabled(mUI->mMisraC->isChecked());
379+
connect(mUI->mMisraC, &QCheckBox::toggled, mUI->mMisraVersion, &QComboBox::setEnabled);
374380

375381
const QString &misraFile = settings.value(SETTINGS_MISRA_FILE, QString()).toString();
376382
mUI->mEditMisraFile->setText(misraFile);
383+
mUI->mMisraVersion->setVisible(mPremium);
384+
mUI->mMisraVersion->setCurrentIndex(projectFile->getCodingStandards().contains(CODING_STANDARD_MISRA_C_2023));
377385
if (mPremium) {
378386
mUI->mLabelMisraFile->setVisible(false);
379387
mUI->mEditMisraFile->setVisible(false);
380388
mUI->mBtnBrowseMisraFile->setVisible(false);
381-
} else if (!mUI->mMisraC2012->isEnabled()) {
389+
} else if (!mUI->mMisraC->isEnabled()) {
382390
mUI->mEditMisraFile->setEnabled(false);
383391
mUI->mBtnBrowseMisraFile->setEnabled(false);
384392
}
@@ -464,14 +472,16 @@ void ProjectFileDialog::saveToProjectFile(ProjectFile *projectFile) const
464472
addons << "threadsafety";
465473
if (mUI->mAddonY2038->isChecked())
466474
addons << "y2038";
467-
if (mUI->mMisraC2012->isChecked())
475+
if (mUI->mMisraC->isChecked())
468476
addons << ADDON_MISRA;
469477
projectFile->setAddons(addons);
470478
QStringList codingStandards;
471479
if (mUI->mCertC2016->isChecked())
472480
codingStandards << CODING_STANDARD_CERT_C;
473481
if (mUI->mCertCpp2016->isChecked())
474482
codingStandards << CODING_STANDARD_CERT_CPP;
483+
if (mPremium && mUI->mMisraVersion->currentIndex() == 1)
484+
codingStandards << CODING_STANDARD_MISRA_C_2023;
475485
if (mUI->mMisraCpp2008->isChecked())
476486
codingStandards << CODING_STANDARD_MISRA_CPP_2008;
477487
if (mUI->mAutosar->isChecked())
@@ -914,8 +924,8 @@ void ProjectFileDialog::browseMisraFile()
914924
mUI->mEditMisraFile->setText(fileName);
915925
settings.setValue(SETTINGS_MISRA_FILE, fileName);
916926

917-
mUI->mMisraC2012->setText("MISRA C 2012");
918-
mUI->mMisraC2012->setEnabled(true);
919-
updateAddonCheckBox(mUI->mMisraC2012, nullptr, getDataDir(), ADDON_MISRA);
927+
mUI->mMisraC->setText("MISRA C 2012");
928+
mUI->mMisraC->setEnabled(true);
929+
updateAddonCheckBox(mUI->mMisraC, nullptr, getDataDir(), ADDON_MISRA);
920930
}
921931
}

lib/cppcheck.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,8 @@ void CppCheck::executeAddons(const std::vector<std::string>& files)
14391439
std::istringstream istr(results);
14401440
std::string line;
14411441

1442+
const bool misraC2023 = mSettings.premiumArgs.find("--misra-c-2023") != std::string::npos;
1443+
14421444
while (std::getline(istr, line)) {
14431445
if (line.compare(0,1,"{") != 0)
14441446
continue;
@@ -1470,6 +1472,8 @@ void CppCheck::executeAddons(const std::vector<std::string>& files)
14701472
}
14711473

14721474
errmsg.id = obj["addon"].get<std::string>() + "-" + obj["errorId"].get<std::string>();
1475+
if (misraC2023 && errmsg.id.compare(0, 12, "misra-c2012-") == 0)
1476+
errmsg.id = "misra-c2023-" + errmsg.id.substr(12);
14731477
const std::string text = obj["message"].get<std::string>();
14741478
errmsg.setmsg(text);
14751479
const std::string severity = obj["severity"].get<std::string>();

0 commit comments

Comments
 (0)