moved suppression-specific code out of `ErrorLogger` (#5329)
This commit is contained in:
parent
7f22ef4e14
commit
33dee83c21
8
Makefile
8
Makefile
|
@ -455,7 +455,7 @@ validateRules:
|
||||||
|
|
||||||
###### Build
|
###### Build
|
||||||
|
|
||||||
$(libcppdir)/analyzerinfo.o: lib/analyzerinfo.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/path.h lib/platform.h lib/suppressions.h lib/utils.h
|
$(libcppdir)/analyzerinfo.o: lib/analyzerinfo.cpp externals/tinyxml2/tinyxml2.h lib/analyzerinfo.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/path.h lib/platform.h lib/utils.h
|
||||||
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp
|
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/analyzerinfo.cpp
|
||||||
|
|
||||||
$(libcppdir)/astutils.o: lib/astutils.cpp lib/astutils.h lib/check.h lib/checkclass.h lib/config.h lib/errortypes.h lib/importproject.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h
|
$(libcppdir)/astutils.o: lib/astutils.cpp lib/astutils.h lib/check.h lib/checkclass.h lib/config.h lib/errortypes.h lib/importproject.h lib/infer.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h lib/vfvalue.h
|
||||||
|
@ -641,10 +641,10 @@ cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlineparser.h cli/cppcheckexecu
|
||||||
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlineparser.h cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h cli/cppcheckexecutorsig.h cli/executor.h cli/filelister.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/analyzerinfo.h lib/check.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlineparser.h cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h cli/cppcheckexecutorsig.h cli/executor.h cli/filelister.h cli/processexecutor.h cli/singleexecutor.h cli/threadexecutor.h lib/analyzerinfo.h lib/check.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
||||||
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp
|
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp
|
||||||
|
|
||||||
cli/cppcheckexecutorseh.o: cli/cppcheckexecutorseh.cpp cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/suppressions.h lib/utils.h
|
cli/cppcheckexecutorseh.o: cli/cppcheckexecutorseh.cpp cli/cppcheckexecutor.h cli/cppcheckexecutorseh.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/utils.h
|
||||||
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutorseh.cpp
|
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutorseh.cpp
|
||||||
|
|
||||||
cli/cppcheckexecutorsig.o: cli/cppcheckexecutorsig.cpp cli/cppcheckexecutor.h cli/cppcheckexecutorsig.h cli/stacktrace.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/suppressions.h
|
cli/cppcheckexecutorsig.o: cli/cppcheckexecutorsig.cpp cli/cppcheckexecutor.h cli/cppcheckexecutorsig.h cli/stacktrace.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h
|
||||||
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutorsig.cpp
|
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutorsig.cpp
|
||||||
|
|
||||||
cli/executor.o: cli/executor.cpp cli/executor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
cli/executor.o: cli/executor.cpp cli/executor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
||||||
|
@ -653,7 +653,7 @@ cli/executor.o: cli/executor.cpp cli/executor.h lib/color.h lib/config.h lib/err
|
||||||
cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/path.h lib/pathmatch.h lib/utils.h
|
cli/filelister.o: cli/filelister.cpp cli/filelister.h lib/config.h lib/path.h lib/pathmatch.h lib/utils.h
|
||||||
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/filelister.cpp
|
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/filelister.cpp
|
||||||
|
|
||||||
cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/suppressions.h
|
cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h
|
||||||
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/main.cpp
|
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/main.cpp
|
||||||
|
|
||||||
cli/processexecutor.o: cli/processexecutor.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
cli/processexecutor.o: cli/processexecutor.cpp cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h lib/analyzerinfo.h lib/check.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
|
||||||
|
|
|
@ -261,11 +261,11 @@ bool CppCheckExecutor::reportSuppressions(const Settings &settings, bool unusedF
|
||||||
bool err = false;
|
bool err = false;
|
||||||
if (settings.useSingleJob()) {
|
if (settings.useSingleJob()) {
|
||||||
for (std::map<std::string, std::size_t>::const_iterator i = files.cbegin(); i != files.cend(); ++i) {
|
for (std::map<std::string, std::size_t>::const_iterator i = files.cbegin(); i != files.cend(); ++i) {
|
||||||
err |= errorLogger.reportUnmatchedSuppressions(
|
err |= Suppressions::reportUnmatchedSuppressions(
|
||||||
settings.nomsg.getUnmatchedLocalSuppressions(i->first, unusedFunctionCheckEnabled));
|
settings.nomsg.getUnmatchedLocalSuppressions(i->first, unusedFunctionCheckEnabled), errorLogger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err |= errorLogger.reportUnmatchedSuppressions(settings.nomsg.getUnmatchedGlobalSuppressions(unusedFunctionCheckEnabled));
|
err |= Suppressions::reportUnmatchedSuppressions(settings.nomsg.getUnmatchedGlobalSuppressions(unusedFunctionCheckEnabled), errorLogger);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,8 @@ class Settings;
|
||||||
*/
|
*/
|
||||||
class CppCheckExecutor : public ErrorLogger {
|
class CppCheckExecutor : public ErrorLogger {
|
||||||
public:
|
public:
|
||||||
|
friend class TestSuppressions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -101,8 +103,6 @@ public:
|
||||||
*/
|
*/
|
||||||
static bool executeCommand(std::string exe, std::vector<std::string> args, std::string redirect, std::string &output_);
|
static bool executeCommand(std::string exe, std::vector<std::string> args, std::string redirect, std::string &output_);
|
||||||
|
|
||||||
static bool reportSuppressions(const Settings &settings, bool unusedFunctionCheckEnabled, const std::map<std::string, std::size_t> &files, ErrorLogger& errorLogger);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,6 +124,8 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static bool reportSuppressions(const Settings &settings, bool unusedFunctionCheckEnabled, const std::map<std::string, std::size_t> &files, ErrorLogger& errorLogger);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper around check_internal
|
* Wrapper around check_internal
|
||||||
* - installs optional platform dependent signal handling
|
* - installs optional platform dependent signal handling
|
||||||
|
|
|
@ -1021,7 +1021,7 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string
|
||||||
// In jointSuppressionReport mode, unmatched suppressions are
|
// In jointSuppressionReport mode, unmatched suppressions are
|
||||||
// collected after all files are processed
|
// collected after all files are processed
|
||||||
if (!mSettings.useSingleJob() && (mSettings.severity.isEnabled(Severity::information) || mSettings.checkConfiguration)) {
|
if (!mSettings.useSingleJob() && (mSettings.severity.isEnabled(Severity::information) || mSettings.checkConfiguration)) {
|
||||||
reportUnmatchedSuppressions(mSettings.nomsg.getUnmatchedLocalSuppressions(filename, isUnusedFunctionCheckEnabled()));
|
Suppressions::reportUnmatchedSuppressions(mSettings.nomsg.getUnmatchedLocalSuppressions(filename, isUnusedFunctionCheckEnabled()), *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
mErrorList.clear();
|
mErrorList.clear();
|
||||||
|
@ -1597,7 +1597,7 @@ void CppCheck::reportErr(const ErrorMessage &msg)
|
||||||
mAnalyzerInformation.reportErr(msg);
|
mAnalyzerInformation.reportErr(msg);
|
||||||
|
|
||||||
// TODO: only convert if necessary
|
// TODO: only convert if necessary
|
||||||
const Suppressions::ErrorMessage errorMessage = msg.toSuppressionsErrorMessage();
|
const auto errorMessage = Suppressions::ErrorMessage::fromErrorMessage(msg);
|
||||||
|
|
||||||
if (mSettings.nomsg.isSuppressed(errorMessage, mUseGlobalSuppressions)) {
|
if (mSettings.nomsg.isSuppressed(errorMessage, mUseGlobalSuppressions)) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -211,22 +211,6 @@ void ErrorMessage::setmsg(const std::string &msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Suppressions::ErrorMessage ErrorMessage::toSuppressionsErrorMessage() const
|
|
||||||
{
|
|
||||||
Suppressions::ErrorMessage ret;
|
|
||||||
ret.hash = hash;
|
|
||||||
ret.errorId = id;
|
|
||||||
if (!callStack.empty()) {
|
|
||||||
ret.setFileName(callStack.back().getfile(false));
|
|
||||||
ret.lineNumber = callStack.back().line;
|
|
||||||
} else {
|
|
||||||
ret.lineNumber = Suppressions::Suppression::NO_LINE;
|
|
||||||
}
|
|
||||||
ret.certainty = certainty;
|
|
||||||
ret.symbolNames = mSymbolNames;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void serializeString(std::string &oss, const std::string & str)
|
static void serializeString(std::string &oss, const std::string & str)
|
||||||
{
|
{
|
||||||
oss += std::to_string(str.length());
|
oss += std::to_string(str.length());
|
||||||
|
@ -681,39 +665,6 @@ std::string ErrorMessage::toString(bool verbose, const std::string &templateForm
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ErrorLogger::reportUnmatchedSuppressions(const std::list<Suppressions::Suppression> &unmatched)
|
|
||||||
{
|
|
||||||
bool err = false;
|
|
||||||
// Report unmatched suppressions
|
|
||||||
for (const Suppressions::Suppression &s : unmatched) {
|
|
||||||
// don't report "unmatchedSuppression" as unmatched
|
|
||||||
if (s.errorId == "unmatchedSuppression")
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// check if this unmatched suppression is suppressed
|
|
||||||
bool suppressed = false;
|
|
||||||
for (const Suppressions::Suppression &s2 : unmatched) {
|
|
||||||
if (s2.errorId == "unmatchedSuppression") {
|
|
||||||
if ((s2.fileName.empty() || s2.fileName == "*" || s2.fileName == s.fileName) &&
|
|
||||||
(s2.lineNumber == Suppressions::Suppression::NO_LINE || s2.lineNumber == s.lineNumber)) {
|
|
||||||
suppressed = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (suppressed)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
std::list<ErrorMessage::FileLocation> callStack;
|
|
||||||
if (!s.fileName.empty())
|
|
||||||
callStack.emplace_back(s.fileName, s.lineNumber, 0);
|
|
||||||
reportErr(ErrorMessage(callStack, emptyString, Severity::information, "Unmatched suppression: " + s.errorId, "unmatchedSuppression", Certainty::normal));
|
|
||||||
err = true;
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string ErrorLogger::callStackToString(const std::list<ErrorMessage::FileLocation> &callStack)
|
std::string ErrorLogger::callStackToString(const std::list<ErrorMessage::FileLocation> &callStack)
|
||||||
{
|
{
|
||||||
std::string str;
|
std::string str;
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "errortypes.h"
|
#include "errortypes.h"
|
||||||
#include "suppressions.h"
|
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
@ -198,8 +197,6 @@ public:
|
||||||
return mSymbolNames;
|
return mSymbolNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
Suppressions::ErrorMessage toSuppressionsErrorMessage() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static std::string fixInvalidChars(const std::string& raw);
|
static std::string fixInvalidChars(const std::string& raw);
|
||||||
|
|
||||||
|
@ -250,13 +247,6 @@ public:
|
||||||
(void)value;
|
(void)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Report unmatched suppressions
|
|
||||||
* @param unmatched list of unmatched suppressions (from Settings::Suppressions::getUnmatched(Local|Global)Suppressions)
|
|
||||||
* @return true is returned if errors are reported
|
|
||||||
*/
|
|
||||||
bool reportUnmatchedSuppressions(const std::list<Suppressions::Suppression> &unmatched);
|
|
||||||
|
|
||||||
static std::string callStackToString(const std::list<ErrorMessage::FileLocation> &callStack);
|
static std::string callStackToString(const std::list<ErrorMessage::FileLocation> &callStack);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -35,6 +35,22 @@
|
||||||
|
|
||||||
#include <tinyxml2.h>
|
#include <tinyxml2.h>
|
||||||
|
|
||||||
|
Suppressions::ErrorMessage Suppressions::ErrorMessage::fromErrorMessage(const ::ErrorMessage &msg)
|
||||||
|
{
|
||||||
|
Suppressions::ErrorMessage ret;
|
||||||
|
ret.hash = msg.hash;
|
||||||
|
ret.errorId = msg.id;
|
||||||
|
if (!msg.callStack.empty()) {
|
||||||
|
ret.setFileName(msg.callStack.back().getfile(false));
|
||||||
|
ret.lineNumber = msg.callStack.back().line;
|
||||||
|
} else {
|
||||||
|
ret.lineNumber = Suppressions::Suppression::NO_LINE;
|
||||||
|
}
|
||||||
|
ret.certainty = msg.certainty;
|
||||||
|
ret.symbolNames = msg.symbolNames();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static bool isAcceptedErrorIdChar(char c)
|
static bool isAcceptedErrorIdChar(char c)
|
||||||
{
|
{
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
@ -384,7 +400,7 @@ bool Suppressions::isSuppressed(const ::ErrorMessage &errmsg)
|
||||||
{
|
{
|
||||||
if (mSuppressions.empty())
|
if (mSuppressions.empty())
|
||||||
return false;
|
return false;
|
||||||
return isSuppressed(errmsg.toSuppressionsErrorMessage());
|
return isSuppressed(Suppressions::ErrorMessage::fromErrorMessage(errmsg));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Suppressions::dump(std::ostream & out) const
|
void Suppressions::dump(std::ostream & out) const
|
||||||
|
@ -461,3 +477,36 @@ void Suppressions::markUnmatchedInlineSuppressionsAsChecked(const Tokenizer &tok
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Suppressions::reportUnmatchedSuppressions(const std::list<Suppressions::Suppression> &unmatched, ErrorLogger &errorLogger)
|
||||||
|
{
|
||||||
|
bool err = false;
|
||||||
|
// Report unmatched suppressions
|
||||||
|
for (const Suppressions::Suppression &s : unmatched) {
|
||||||
|
// don't report "unmatchedSuppression" as unmatched
|
||||||
|
if (s.errorId == "unmatchedSuppression")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// check if this unmatched suppression is suppressed
|
||||||
|
bool suppressed = false;
|
||||||
|
for (const Suppressions::Suppression &s2 : unmatched) {
|
||||||
|
if (s2.errorId == "unmatchedSuppression") {
|
||||||
|
if ((s2.fileName.empty() || s2.fileName == "*" || s2.fileName == s.fileName) &&
|
||||||
|
(s2.lineNumber == Suppressions::Suppression::NO_LINE || s2.lineNumber == s.lineNumber)) {
|
||||||
|
suppressed = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (suppressed)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
std::list<::ErrorMessage::FileLocation> callStack;
|
||||||
|
if (!s.fileName.empty())
|
||||||
|
callStack.emplace_back(s.fileName, s.lineNumber, 0);
|
||||||
|
errorLogger.reportErr(::ErrorMessage(callStack, emptyString, Severity::information, "Unmatched suppression: " + s.errorId, "unmatchedSuppression", Certainty::normal));
|
||||||
|
err = true;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
class Tokenizer;
|
class Tokenizer;
|
||||||
class ErrorMessage;
|
class ErrorMessage;
|
||||||
|
class ErrorLogger;
|
||||||
enum class Certainty;
|
enum class Certainty;
|
||||||
|
|
||||||
/** @brief class for handling suppressions */
|
/** @brief class for handling suppressions */
|
||||||
|
@ -50,6 +51,8 @@ public:
|
||||||
int lineNumber;
|
int lineNumber;
|
||||||
Certainty certainty;
|
Certainty certainty;
|
||||||
std::string symbolNames;
|
std::string symbolNames;
|
||||||
|
|
||||||
|
static Suppressions::ErrorMessage fromErrorMessage(const ::ErrorMessage &msg);
|
||||||
private:
|
private:
|
||||||
std::string mFileName;
|
std::string mFileName;
|
||||||
};
|
};
|
||||||
|
@ -201,6 +204,13 @@ public:
|
||||||
*/
|
*/
|
||||||
void markUnmatchedInlineSuppressionsAsChecked(const Tokenizer &tokenizer);
|
void markUnmatchedInlineSuppressionsAsChecked(const Tokenizer &tokenizer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Report unmatched suppressions
|
||||||
|
* @param unmatched list of unmatched suppressions (from Settings::Suppressions::getUnmatched(Local|Global)Suppressions)
|
||||||
|
* @return true is returned if errors are reported
|
||||||
|
*/
|
||||||
|
static bool reportUnmatchedSuppressions(const std::list<Suppressions::Suppression> &unmatched, ErrorLogger &errorLogger);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** @brief List of error which the user doesn't want to see. */
|
/** @brief List of error which the user doesn't want to see. */
|
||||||
std::list<Suppression> mSuppressions;
|
std::list<Suppression> mSuppressions;
|
||||||
|
|
|
@ -61,7 +61,6 @@ private:
|
||||||
TEST_CASE(SerializeSanitize);
|
TEST_CASE(SerializeSanitize);
|
||||||
TEST_CASE(SerializeFileLocation);
|
TEST_CASE(SerializeFileLocation);
|
||||||
|
|
||||||
TEST_CASE(suppressUnmatchedSuppressions);
|
|
||||||
TEST_CASE(substituteTemplateFormatStatic);
|
TEST_CASE(substituteTemplateFormatStatic);
|
||||||
TEST_CASE(substituteTemplateLocationStatic);
|
TEST_CASE(substituteTemplateLocationStatic);
|
||||||
}
|
}
|
||||||
|
@ -425,64 +424,6 @@ private:
|
||||||
ASSERT_EQUALS("abcd:/,", msg2.callStack.front().getinfo());
|
ASSERT_EQUALS("abcd:/,", msg2.callStack.front().getinfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
void suppressUnmatchedSuppressions() {
|
|
||||||
std::list<Suppressions::Suppression> suppressions;
|
|
||||||
|
|
||||||
// No unmatched suppression
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// suppress all unmatchedSuppression
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "*", Suppressions::Suppression::NO_LINE);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// suppress all unmatchedSuppression (corresponds to "--suppress=unmatchedSuppression")
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "", Suppressions::Suppression::NO_LINE);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// suppress all unmatchedSuppression in a.c
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "a.c", Suppressions::Suppression::NO_LINE);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// suppress unmatchedSuppression in a.c at line 10
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "a.c", 10U);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// don't suppress unmatchedSuppression when file is mismatching
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "b.c", Suppressions::Suppression::NO_LINE);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str());
|
|
||||||
|
|
||||||
// don't suppress unmatchedSuppression when line is mismatching
|
|
||||||
errout.str("");
|
|
||||||
suppressions.clear();
|
|
||||||
suppressions.emplace_back("abc", "a.c", 10U);
|
|
||||||
suppressions.emplace_back("unmatchedSuppression", "a.c", 1U);
|
|
||||||
reportUnmatchedSuppressions(suppressions);
|
|
||||||
ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void substituteTemplateFormatStatic() const
|
void substituteTemplateFormatStatic() const
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,6 +83,8 @@ private:
|
||||||
|
|
||||||
TEST_CASE(suppressingSyntaxErrorAndExitCode);
|
TEST_CASE(suppressingSyntaxErrorAndExitCode);
|
||||||
TEST_CASE(suppressLocal);
|
TEST_CASE(suppressLocal);
|
||||||
|
|
||||||
|
TEST_CASE(suppressUnmatchedSuppressions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void suppressionsBadId1() const {
|
void suppressionsBadId1() const {
|
||||||
|
@ -859,6 +861,64 @@ private:
|
||||||
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid2", "test2.cpp", 1)));
|
ASSERT_EQUALS(true, suppressions.isSuppressed(errorMessage("errorid2", "test2.cpp", 1)));
|
||||||
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid2", "test2.cpp", 1), false));
|
ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid2", "test2.cpp", 1), false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void suppressUnmatchedSuppressions() {
|
||||||
|
std::list<Suppressions::Suppression> suppressions;
|
||||||
|
|
||||||
|
// No unmatched suppression
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// suppress all unmatchedSuppression
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "*", Suppressions::Suppression::NO_LINE);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// suppress all unmatchedSuppression (corresponds to "--suppress=unmatchedSuppression")
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "", Suppressions::Suppression::NO_LINE);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// suppress all unmatchedSuppression in a.c
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "a.c", Suppressions::Suppression::NO_LINE);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// suppress unmatchedSuppression in a.c at line 10
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "a.c", 10U);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// don't suppress unmatchedSuppression when file is mismatching
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "b.c", Suppressions::Suppression::NO_LINE);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str());
|
||||||
|
|
||||||
|
// don't suppress unmatchedSuppression when line is mismatching
|
||||||
|
errout.str("");
|
||||||
|
suppressions.clear();
|
||||||
|
suppressions.emplace_back("abc", "a.c", 10U);
|
||||||
|
suppressions.emplace_back("unmatchedSuppression", "a.c", 1U);
|
||||||
|
Suppressions::reportUnmatchedSuppressions(suppressions, *this);
|
||||||
|
ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestSuppressions)
|
REGISTER_TEST(TestSuppressions)
|
||||||
|
|
Loading…
Reference in New Issue