Skip to content

Commit

Permalink
Fixed #12440 (Misra violations found but code exited with 0 even afte…
Browse files Browse the repository at this point in the history
…r specifying exit code)
  • Loading branch information
danmar committed Apr 19, 2024
1 parent 8c78869 commit e32d1ab
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 5 deletions.
4 changes: 2 additions & 2 deletions cli/cppcheckexecutor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions lib/cppcheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1770,12 +1770,12 @@ bool CppCheck::analyseWholeProgram()
return errors && (mExitCode > 0);
}

void CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list<std::pair<std::string, std::size_t>> &files, const std::list<FileSettings>& fileSettings)
unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const std::list<std::pair<std::string, std::size_t>> &files, const std::list<FileSettings>& 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);
Expand Down Expand Up @@ -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<std::pair<std::string, std::size_t>> &files, const std::list<FileSettings>& fileSettings)
Expand Down
2 changes: 1 addition & 1 deletion lib/cppcheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::pair<std::string, std::size_t>> &files, const std::list<FileSettings>& fileSettings);
unsigned int analyseWholeProgram(const std::string &buildDir, const std::list<std::pair<std::string, std::size_t>> &files, const std::list<FileSettings>& fileSettings);

/** Remove *.ctu-info files */
void removeCtuInfoFiles(const std::list<std::pair<std::string, std::size_t>>& files, const std::list<FileSettings>& fileSettings); // cppcheck-suppress functionConst // has side effects
Expand Down
11 changes: 11 additions & 0 deletions test/cli/other_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down

0 comments on commit e32d1ab

Please sign in to comment.