diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index cbcc456cbc6..dc807773276 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -1167,8 +1167,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a return Result::Fail; } mSettings.premiumArgs += "--" + p; - if (p == "misra-c-2012" || p == "misra-c-2023") - mSettings.addons.emplace("misra"); if (startsWith(p, "autosar") || startsWith(p, "cert") || startsWith(p, "misra")) { // All checkers related to the coding standard should be enabled. The coding standards // do not all undefined behavior or portability issues. diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 2e31009b392..8522f3efcb5 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -1010,10 +1010,7 @@ QString MainWindow::loadAddon(Settings &settings, const QString &filesDir, const if (!misraFile.isEmpty()) { QString arg; picojson::array arr; - if (misraFile.endsWith(".pdf", Qt::CaseInsensitive)) - arg = "--misra-pdf=" + misraFile; - else - arg = "--rule-texts=" + misraFile; + arg = "--rule-texts=" + misraFile; arr.emplace_back(arg.toStdString()); obj["args"] = picojson::value(arr); } @@ -1039,6 +1036,7 @@ bool MainWindow::getCppcheckSettings(Settings& settings, Suppressions& supprs) Settings::terminate(true); settings.exename = QCoreApplication::applicationFilePath().toStdString(); + settings.templateFormat = "{file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]"; // default to --check-level=normal for GUI for now settings.setCheckLevel(Settings::CheckLevel::normal); @@ -1157,6 +1155,8 @@ bool MainWindow::getCppcheckSettings(Settings& settings, Suppressions& supprs) settings.checkUnknownFunctionReturn.insert(s.toStdString()); for (const QString& addon : mProjectFile->getAddons()) { + if (isCppcheckPremium() && addon == "misra") + continue; const QString addonError = loadAddon(settings, filesDir, pythonCmd, addon); if (!addonError.isEmpty()) { QMessageBox::critical(this, tr("Error"), tr("%1\n\nAnalysis is aborted.").arg(addonError)); @@ -1172,7 +1172,7 @@ bool MainWindow::getCppcheckSettings(Settings& settings, Suppressions& supprs) premiumArgs += " --cert-c-int-precision=" + QString::number(mProjectFile->getCertIntPrecision()); for (const QString& c: mProjectFile->getCodingStandards()) premiumArgs += " --" + c; - if (!premiumArgs.contains("misra") && mProjectFile->getAddons().contains("misra")) + if (!premiumArgs.contains("--misra-c-") && mProjectFile->getAddons().contains("misra")) premiumArgs += " --misra-c-2012"; settings.premiumArgs = premiumArgs.mid(1).toStdString(); settings.setMisraRuleTexts(CheckThread::executeCommand); diff --git a/lib/errorlogger.cpp b/lib/errorlogger.cpp index 4b87d7e379a..4a872a6c211 100644 --- a/lib/errorlogger.cpp +++ b/lib/errorlogger.cpp @@ -1016,7 +1016,7 @@ std::string getGuideline(const std::string &errId, ReportType reportType, } break; case ReportType::misraC: - if (errId.rfind("misra-c20", 0) == 0) + if (errId.rfind("misra-c20", 0) == 0 || errId.rfind("premium-misra-c-20", 0) == 0) guideline = errId.substr(errId.rfind('-') + 1); break; case ReportType::misraCpp2008: diff --git a/test/cli/premium_test.py b/test/cli/premium_test.py index 55adf772467..12dd7212450 100644 --- a/test/cli/premium_test.py +++ b/test/cli/premium_test.py @@ -114,3 +114,19 @@ def _get_hash(s:str): assert hash1 != hash2 +def test_misra_py(tmpdir): + # 13831 - do not execute misra.py when --premium=misra-c-2012 is used + test_file = os.path.join(tmpdir, 'test.c') + with open(test_file, 'wt') as f: + f.write('void foo();\n') + + exe = __copy_cppcheck_premium(tmpdir) + + # ensure that misra.py is not available: + _, stdout, _ = cppcheck(['--enable=style', '--addon=misra', test_file], cppcheck_exe=exe) + assert 'Did not find addon misra.py' in stdout + + # Execute misra + _, stdout, _ = cppcheck(['--enable=style', '--premium=misra-c-2012', test_file], cppcheck_exe=exe) + assert 'misra.py' not in stdout # Did not find misra.py + assert 'Checking' in stdout