diff --git a/gui/compliancereportdialog.cpp b/gui/compliancereportdialog.cpp
index 10ab0b424..57fbbba26 100644
--- a/gui/compliancereportdialog.cpp
+++ b/gui/compliancereportdialog.cpp
@@ -191,13 +191,7 @@ void ComplianceReportDialog::save()
"--project-version=" + projectVersion,
"--output-file=" + outFile};
- if (std.startsWith("misra-c-")) {
- args << "--misra-c"
- << "--compliant=misra-c2012-1.1"
- << "--compliant=misra-c2012-1.2";
- } else {
- args << ("--" + std);
- }
+ args << ("--" + std);
if (files)
args << "--files=" + tempFiles.fileName();
diff --git a/gui/compliancereportdialog.ui b/gui/compliancereportdialog.ui
index b65ef626e..b756ec7ea 100644
--- a/gui/compliancereportdialog.ui
+++ b/gui/compliancereportdialog.ui
@@ -47,7 +47,7 @@
-
- Misra C 2023
+ Misra C
-
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index aa377098b..5f28d8b98 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -1020,11 +1020,10 @@ Settings MainWindow::getCppcheckSettings()
premiumArgs += " --bughunting";
if (mProjectFile->getCertIntPrecision() > 0)
premiumArgs += " --cert-c-int-precision=" + QString::number(mProjectFile->getCertIntPrecision());
- if (mProjectFile->getAddons().contains("misra"))
- premiumArgs += " --misra-c-2012";
- for (const QString& c: mProjectFile->getCodingStandards()) {
+ for (const QString& c: mProjectFile->getCodingStandards())
premiumArgs += " --" + c;
- }
+ if (!premiumArgs.contains("misra") && mProjectFile->getAddons().contains("misra"))
+ premiumArgs += " --misra-c-2012";
result.premiumArgs = premiumArgs.mid(1).toStdString();
}
}
@@ -1495,16 +1494,24 @@ void MainWindow::save()
void MainWindow::complianceReport()
{
- if (isCppcheckPremium() && mProjectFile && mProjectFile->getAddons().contains("misra")) {
- QTemporaryFile tempResults;
- tempResults.open();
- tempResults.close();
-
- mUI->mResults->save(tempResults.fileName(), Report::XMLV2);
-
- ComplianceReportDialog dlg(mProjectFile, tempResults.fileName());
- dlg.exec();
+ if (!mUI->mResults->isSuccess()) {
+ QMessageBox m(QMessageBox::Critical,
+ "Cppcheck",
+ tr("Cannot generate a compliance report right now, an analysis must finish successfully. Try to reanalyze the code and ensure there are no critical errors."),
+ QMessageBox::Ok,
+ this);
+ m.exec();
+ return;
}
+
+ QTemporaryFile tempResults;
+ tempResults.open();
+ tempResults.close();
+
+ mUI->mResults->save(tempResults.fileName(), Report::XMLV2);
+
+ ComplianceReportDialog dlg(mProjectFile, tempResults.fileName());
+ dlg.exec();
}
void MainWindow::resultsAdded()
@@ -1574,6 +1581,7 @@ void MainWindow::aboutToShowViewMenu()
void MainWindow::stopAnalysis()
{
mThread->stop();
+ mUI->mResults->stopAnalysis();
mUI->mResults->disableProgressbar();
const QString &lastResults = getLastResults();
if (!lastResults.isEmpty()) {
diff --git a/gui/resultsview.cpp b/gui/resultsview.cpp
index b26d22be4..942ab5974 100644
--- a/gui/resultsview.cpp
+++ b/gui/resultsview.cpp
@@ -90,6 +90,7 @@ void ResultsView::initialize(QSettings *settings, ApplicationList *list, ThreadH
{
mUI->mProgress->setMinimum(0);
mUI->mProgress->setVisible(false);
+ mUI->mLabelCriticalErrors->setVisible(false);
CodeEditorStyle theStyle(CodeEditorStyle::loadSettings(settings));
mUI->mCode->setStyle(theStyle);
@@ -120,6 +121,10 @@ void ResultsView::clear(bool results)
mUI->mProgress->setMaximum(PROGRESS_MAX);
mUI->mProgress->setValue(0);
mUI->mProgress->setFormat("%p%");
+
+ mUI->mLabelCriticalErrors->setVisible(false);
+
+ mSuccess = false;
}
void ResultsView::clear(const QString &filename)
@@ -145,6 +150,8 @@ void ResultsView::progress(int value, const QString& description)
void ResultsView::error(const ErrorItem &item)
{
+ handleCriticalError(item);
+
if (mUI->mTree->addErrorItem(item)) {
emit gotResults();
mStatistics->addItem(item.tool(), ShowTypes::SeverityToShowType(item.severity));
@@ -277,6 +284,7 @@ QString ResultsView::getCheckDirectory()
void ResultsView::checkingStarted(int count)
{
+ mSuccess = true;
mUI->mProgress->setVisible(true);
mUI->mProgress->setMaximum(PROGRESS_MAX);
mUI->mProgress->setValue(0);
@@ -349,6 +357,8 @@ void ResultsView::disableProgressbar()
void ResultsView::readErrorsXml(const QString &filename)
{
+ mSuccess = false; // Don't know if results come from an aborted analysis
+
const int version = XmlReport::determineVersion(filename);
if (version == 0) {
QMessageBox msgBox;
@@ -377,6 +387,7 @@ void ResultsView::readErrorsXml(const QString &filename)
}
for (const ErrorItem& item : errors) {
+ handleCriticalError(item);
mUI->mTree->addErrorItem(item);
}
@@ -506,3 +517,38 @@ void ResultsView::on_mListLog_customContextMenuRequested(const QPoint &pos)
contextMenu.exec(globalPos);
}
+
+void ResultsView::stopAnalysis()
+{
+ mSuccess = false;
+ mUI->mLabelCriticalErrors->setText(tr("Analysis was stopped"));
+ mUI->mLabelCriticalErrors->setVisible(true);
+}
+
+void ResultsView::handleCriticalError(const ErrorItem &item)
+{
+ const QSet criticalErrors{
+ "cppcheckError",
+ "cppcheckLimit",
+ "internalAstError",
+ "instantiationError",
+ "internalError",
+ "preprocessorErrorDirective",
+ "syntaxError",
+ "unknownMacro"
+ };
+
+ if (criticalErrors.contains(item.errorId)) {
+ QString msg = tr("There was a critical error with id '%1'").arg(item.errorId);
+ if (!item.file0.isEmpty())
+ msg += ", " + tr("when checking %1").arg(item.file0);
+ msg += ". " + tr("Analysis was aborted.");
+ mUI->mLabelCriticalErrors->setText(msg);
+ mUI->mLabelCriticalErrors->setVisible(true);
+ mSuccess = false;
+ }
+}
+
+bool ResultsView::isSuccess() const {
+ return mSuccess;
+}
diff --git a/gui/resultsview.h b/gui/resultsview.h
index b44adfd07..70c8ddfa2 100644
--- a/gui/resultsview.h
+++ b/gui/resultsview.h
@@ -176,6 +176,17 @@ public:
*/
void translate();
+ /**
+ * @brief This function should be called when analysis is stopped
+ */
+ void stopAnalysis();
+
+ /**
+ * @brief Are there successful results?
+ * @return true if analysis finished without critical errors etc
+ */
+ bool isSuccess() const;
+
void disableProgressbar();
/**
@@ -340,7 +351,14 @@ public slots:
*/
void logCopyComplete();
-protected:
+private:
+
+ /**
+ * If provided ErrorItem is a critical error then display warning message
+ * in the resultsview
+ */
+ void handleCriticalError(const ErrorItem& item);
+
/**
* @brief Should we show a "No errors found dialog" every time no errors were found?
*/
@@ -350,6 +368,11 @@ protected:
CheckStatistics *mStatistics;
+ /**
+ * Set to true when checking finish successfully. Set to false whenever analysis starts.
+ */
+ bool mSuccess = false;
+
private slots:
/**
* @brief Custom context menu for Analysis Log
diff --git a/gui/resultsview.ui b/gui/resultsview.ui
index 9e22e561e..7ab18fffc 100644
--- a/gui/resultsview.ui
+++ b/gui/resultsview.ui
@@ -51,6 +51,16 @@
+ -
+
+
+ color: red;
+
+
+ Critical errors
+
+
+
-