From e32d1ab3d1cc9a4e4da8f7e58a4c2c35f8ac41ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 19 Apr 2024 11:27:04 +0200 Subject: [PATCH] Fixed #12440 (Misra violations found but code exited with 0 even after specifying exit code) --- cli/cppcheckexecutor.cpp | 4 ++-- lib/cppcheck.cpp | 6 ++++-- lib/cppcheck.h | 2 +- test/cli/other_test.py | 11 +++++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 82673af9c14..27f1d1951db 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -292,7 +292,7 @@ int CppCheckExecutor::check_internal(const Settings& settings) const #endif } - cppcheck.analyseWholeProgram(settings.buildDir, mFiles, mFileSettings); + returnValue |= cppcheck.analyseWholeProgram(settings.buildDir, mFiles, mFileSettings); if (settings.severity.isEnabled(Severity::information) || settings.checkConfiguration) { const bool err = reportSuppressions(settings, suppressions, settings.checks.isEnabled(Checks::unusedFunction), mFiles, mFileSettings, stdLogger); @@ -311,7 +311,7 @@ int CppCheckExecutor::check_internal(const Settings& settings) const stdLogger.reportErr(ErrorMessage::getXMLFooter()); } - if (settings.safety && stdLogger.hasCriticalErrors()) + if (settings.safety && (stdLogger.hasCriticalErrors() || returnValue != 0)) return EXIT_FAILURE; if (returnValue) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index cfe7b624fbe..d4718dbba06 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1770,12 +1770,12 @@ bool CppCheck::analyseWholeProgram() return errors && (mExitCode > 0); } -void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings) +unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings) { executeAddonsWholeProgram(files); // TODO: pass FileSettings if (buildDir.empty()) { removeCtuInfoFiles(files, fileSettings); - return; + return mExitCode; } if (mSettings.checks.isEnabled(Checks::unusedFunction)) CheckUnusedFunctions::analyseWholeProgram(mSettings, *this, buildDir); @@ -1836,6 +1836,8 @@ void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list< for (Check::FileInfo *fi : fileInfoList) delete fi; + + return mExitCode; } void CppCheck::removeCtuInfoFiles(const std::list> &files, const std::list& fileSettings) diff --git a/lib/cppcheck.h b/lib/cppcheck.h index abe815377bb..ed942ebca8b 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -142,7 +142,7 @@ class CPPCHECKLIB CppCheck : ErrorLogger { void analyseClangTidy(const FileSettings &fileSettings); /** analyse whole program use .analyzeinfo files */ - void analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings); + unsigned int analyseWholeProgram(const std::string &buildDir, const std::list> &files, const std::list& fileSettings); /** Remove *.ctu-info files */ void removeCtuInfoFiles(const std::list>& files, const std::list& fileSettings); // cppcheck-suppress functionConst // has side effects diff --git a/test/cli/other_test.py b/test/cli/other_test.py index 7cdd3d9e841..1ac8e4a341e 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -207,6 +207,17 @@ def test_internal_error(tmpdir): assert stderr == '{}:0:0: error: Bailing from out analysis: Checking file failed: converting \'1f\' to integer failed - not an integer [internalError]\n\n^\n'.format(test_file) +def test_addon_ctu_exitcode(tmpdir): + """ #12440 - Misra ctu violations found => exit code should be non-zero """ + test_file = os.path.join(tmpdir, 'test.c') + with open(test_file, 'wt') as f: + f.write("""typedef enum { BLOCK = 0x80U, } E;""") + args = ['--addon=misra', '--enable=style', '--error-exitcode=1', test_file] + exitcode, stdout, stderr = cppcheck(args) + assert '2.3' in stderr, stderr + assert exitcode == 1 + + # TODO: test with -j2 def test_addon_misra(tmpdir): test_file = os.path.join(tmpdir, 'test.cpp')