added command-line option `--disable=<id>` to disable individual checks (#4712)
This commit is contained in:
parent
7945b835e1
commit
38abeccd24
4
Makefile
4
Makefile
|
@ -301,6 +301,7 @@ TESTOBJ = test/options.o \
|
||||||
test/testpreprocessor.o \
|
test/testpreprocessor.o \
|
||||||
test/testprocessexecutor.o \
|
test/testprocessexecutor.o \
|
||||||
test/testrunner.o \
|
test/testrunner.o \
|
||||||
|
test/testsettings.o \
|
||||||
test/testsimplifytemplate.o \
|
test/testsimplifytemplate.o \
|
||||||
test/testsimplifytokens.o \
|
test/testsimplifytokens.o \
|
||||||
test/testsimplifytypedef.o \
|
test/testsimplifytypedef.o \
|
||||||
|
@ -768,6 +769,9 @@ test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/proc
|
||||||
test/testrunner.o: test/testrunner.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/preprocessor.h lib/suppressions.h test/options.h test/testsuite.h
|
test/testrunner.o: test/testrunner.cpp externals/simplecpp/simplecpp.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/preprocessor.h lib/suppressions.h test/options.h test/testsuite.h
|
||||||
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testrunner.cpp
|
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testrunner.cpp
|
||||||
|
|
||||||
|
test/testsettings.o: test/testsettings.cpp 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/timer.h lib/utils.h test/testsuite.h
|
||||||
|
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp
|
||||||
|
|
||||||
test/testsimplifytemplate.o: test/testsimplifytemplate.cpp 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/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
|
test/testsimplifytemplate.o: test/testsimplifytemplate.cpp 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/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h test/testsuite.h
|
||||||
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp
|
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsimplifytemplate.cpp
|
||||||
|
|
||||||
|
|
|
@ -299,6 +299,14 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
else if (std::strcmp(argv[i], "--debug-warnings") == 0)
|
else if (std::strcmp(argv[i], "--debug-warnings") == 0)
|
||||||
mSettings->debugwarnings = true;
|
mSettings->debugwarnings = true;
|
||||||
|
|
||||||
|
else if (std::strncmp(argv[i], "--disable=", 10) == 0) {
|
||||||
|
const std::string errmsg = mSettings->removeEnabled(argv[i] + 10);
|
||||||
|
if (!errmsg.empty()) {
|
||||||
|
printError(errmsg);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// documentation..
|
// documentation..
|
||||||
else if (std::strcmp(argv[i], "--doc") == 0) {
|
else if (std::strcmp(argv[i], "--doc") == 0) {
|
||||||
std::ostringstream doc;
|
std::ostringstream doc;
|
||||||
|
@ -321,13 +329,14 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
|
||||||
mSettings->dump = true;
|
mSettings->dump = true;
|
||||||
|
|
||||||
else if (std::strncmp(argv[i], "--enable=", 9) == 0) {
|
else if (std::strncmp(argv[i], "--enable=", 9) == 0) {
|
||||||
const std::string errmsg = mSettings->addEnabled(argv[i] + 9);
|
const std::string enable_arg = argv[i] + 9;
|
||||||
|
const std::string errmsg = mSettings->addEnabled(enable_arg);
|
||||||
if (!errmsg.empty()) {
|
if (!errmsg.empty()) {
|
||||||
printError(errmsg);
|
printError(errmsg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// when "style" is enabled, also enable "warning", "performance" and "portability"
|
// when "style" is enabled, also enable "warning", "performance" and "portability"
|
||||||
if (mSettings->severity.isEnabled(Severity::style)) {
|
if (enable_arg.find("style") != std::string::npos) {
|
||||||
mSettings->addEnabled("warning");
|
mSettings->addEnabled("warning");
|
||||||
mSettings->addEnabled("performance");
|
mSettings->addEnabled("performance");
|
||||||
mSettings->addEnabled("portability");
|
mSettings->addEnabled("portability");
|
||||||
|
@ -1084,6 +1093,9 @@ void CmdLineParser::printHelp()
|
||||||
" be considered for evaluation.\n"
|
" be considered for evaluation.\n"
|
||||||
" --config-excludes-file=<file>\n"
|
" --config-excludes-file=<file>\n"
|
||||||
" A file that contains a list of config-excludes\n"
|
" A file that contains a list of config-excludes\n"
|
||||||
|
" --disable=<id> Disable individual checks.\n"
|
||||||
|
" Please refer to the documentation of --enable=<id>\n"
|
||||||
|
" for futher details.\n"
|
||||||
" --dump Dump xml data for each translation unit. The dump\n"
|
" --dump Dump xml data for each translation unit. The dump\n"
|
||||||
" files have the extension .dump and contain ast,\n"
|
" files have the extension .dump and contain ast,\n"
|
||||||
" tokenlist, symboldatabase, valueflow.\n"
|
" tokenlist, symboldatabase, valueflow.\n"
|
||||||
|
|
|
@ -113,7 +113,7 @@ void Settings::loadCppcheckCfg()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string Settings::addEnabled(const std::string &str)
|
std::string Settings::parseEnabled(const std::string &str, std::tuple<SimpleEnableGroup<Severity::SeverityType>, SimpleEnableGroup<Checks>> &groups)
|
||||||
{
|
{
|
||||||
// Enable parameters may be comma separated...
|
// Enable parameters may be comma separated...
|
||||||
if (str.find(',') != std::string::npos) {
|
if (str.find(',') != std::string::npos) {
|
||||||
|
@ -122,7 +122,7 @@ std::string Settings::addEnabled(const std::string &str)
|
||||||
while ((pos = str.find(',', pos)) != std::string::npos) {
|
while ((pos = str.find(',', pos)) != std::string::npos) {
|
||||||
if (pos == prevPos)
|
if (pos == prevPos)
|
||||||
return std::string("--enable parameter is empty");
|
return std::string("--enable parameter is empty");
|
||||||
const std::string errmsg(addEnabled(str.substr(prevPos, pos - prevPos)));
|
std::string errmsg(parseEnabled(str.substr(prevPos, pos - prevPos), groups));
|
||||||
if (!errmsg.empty())
|
if (!errmsg.empty())
|
||||||
return errmsg;
|
return errmsg;
|
||||||
++pos;
|
++pos;
|
||||||
|
@ -130,11 +130,18 @@ std::string Settings::addEnabled(const std::string &str)
|
||||||
}
|
}
|
||||||
if (prevPos >= str.length())
|
if (prevPos >= str.length())
|
||||||
return std::string("--enable parameter is empty");
|
return std::string("--enable parameter is empty");
|
||||||
return addEnabled(str.substr(prevPos));
|
return parseEnabled(str.substr(prevPos), groups);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto& severity = std::get<0>(groups);
|
||||||
|
auto& checks = std::get<1>(groups);
|
||||||
|
|
||||||
if (str == "all") {
|
if (str == "all") {
|
||||||
severity.fill();
|
// "error" is always enabled and cannot be controlled - so exclude it from "all"
|
||||||
|
SimpleEnableGroup<Severity::SeverityType> newSeverity;
|
||||||
|
newSeverity.fill();
|
||||||
|
newSeverity.disable(Severity::SeverityType::error);
|
||||||
|
severity.enable(newSeverity);
|
||||||
checks.enable(Checks::missingInclude);
|
checks.enable(Checks::missingInclude);
|
||||||
checks.enable(Checks::unusedFunction);
|
checks.enable(Checks::unusedFunction);
|
||||||
} else if (str == "warning") {
|
} else if (str == "warning") {
|
||||||
|
@ -159,13 +166,46 @@ std::string Settings::addEnabled(const std::string &str)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else {
|
else {
|
||||||
|
// the actual option is prepending in the applyEnabled() call
|
||||||
if (str.empty())
|
if (str.empty())
|
||||||
return std::string("cppcheck: --enable parameter is empty");
|
return " parameter is empty";
|
||||||
else
|
else
|
||||||
return std::string("cppcheck: there is no --enable parameter with the name '" + str + "'");
|
return " parameter with the unknown name '" + str + "'";
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::string();
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Settings::addEnabled(const std::string &str)
|
||||||
|
{
|
||||||
|
return applyEnabled(str, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Settings::removeEnabled(const std::string &str)
|
||||||
|
{
|
||||||
|
return applyEnabled(str, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string Settings::applyEnabled(const std::string &str, bool enable)
|
||||||
|
{
|
||||||
|
std::tuple<SimpleEnableGroup<Severity::SeverityType>, SimpleEnableGroup<Checks>> groups;
|
||||||
|
std::string errmsg = parseEnabled(str, groups);
|
||||||
|
if (!errmsg.empty())
|
||||||
|
return (enable ? "--enable" : "--disable") + errmsg;
|
||||||
|
|
||||||
|
const auto s = std::get<0>(groups);
|
||||||
|
const auto c = std::get<1>(groups);
|
||||||
|
if (enable) {
|
||||||
|
severity.enable(s);
|
||||||
|
checks.enable(c);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
severity.disable(s);
|
||||||
|
checks.disable(c);
|
||||||
|
}
|
||||||
|
// FIXME: hack to make sure "error" is always enabled
|
||||||
|
severity.enable(Severity::SeverityType::error);
|
||||||
|
return errmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Settings::isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck) const
|
bool Settings::isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck) const
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <list>
|
#include <list>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <tuple>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
|
||||||
|
@ -71,9 +72,15 @@ public:
|
||||||
void enable(T flag) {
|
void enable(T flag) {
|
||||||
mFlags |= (1U << (uint32_t)flag);
|
mFlags |= (1U << (uint32_t)flag);
|
||||||
}
|
}
|
||||||
|
void enable(SimpleEnableGroup<T> group) {
|
||||||
|
mFlags |= group.intValue();
|
||||||
|
}
|
||||||
void disable(T flag) {
|
void disable(T flag) {
|
||||||
mFlags &= ~(1U << (uint32_t)flag);
|
mFlags &= ~(1U << (uint32_t)flag);
|
||||||
}
|
}
|
||||||
|
void disable(SimpleEnableGroup<T> group) {
|
||||||
|
mFlags &= ~(group.intValue());
|
||||||
|
}
|
||||||
void setEnabled(T flag, bool enabled) {
|
void setEnabled(T flag, bool enabled) {
|
||||||
if (enabled)
|
if (enabled)
|
||||||
enable(flag);
|
enable(flag);
|
||||||
|
@ -393,6 +400,14 @@ public:
|
||||||
*/
|
*/
|
||||||
std::string addEnabled(const std::string &str);
|
std::string addEnabled(const std::string &str);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Disable extra checks by id
|
||||||
|
* @param str single id or list of id values to be enabled
|
||||||
|
* or empty string to enable all. e.g. "style,possibleError"
|
||||||
|
* @return error message. empty upon success
|
||||||
|
*/
|
||||||
|
std::string removeEnabled(const std::string &str);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Returns true if given value can be shown
|
* @brief Returns true if given value can be shown
|
||||||
* @return true if the value can be shown
|
* @return true if the value can be shown
|
||||||
|
@ -417,6 +432,10 @@ public:
|
||||||
std::set<std::string> summaryReturn;
|
std::set<std::string> summaryReturn;
|
||||||
|
|
||||||
void loadSummaries();
|
void loadSummaries();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::string parseEnabled(const std::string &str, std::tuple<SimpleEnableGroup<Severity::SeverityType>, SimpleEnableGroup<Checks>> &groups);
|
||||||
|
std::string applyEnabled(const std::string &str, bool enable);
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
|
@ -105,6 +105,9 @@ man(1), man(7), http://www.tldp.org/HOWTO/Man-Page/
|
||||||
<arg choice="opt">
|
<arg choice="opt">
|
||||||
<option>-U<id></option>
|
<option>-U<id></option>
|
||||||
</arg>
|
</arg>
|
||||||
|
<arg choice="opt">
|
||||||
|
<option>--disable=<id></option>
|
||||||
|
</arg>
|
||||||
<arg choice="opt">
|
<arg choice="opt">
|
||||||
<option>--enable=<id></option>
|
<option>--enable=<id></option>
|
||||||
</arg>
|
</arg>
|
||||||
|
@ -272,6 +275,15 @@ Example: -DDEBUG=1 -D__cplusplus</para>
|
||||||
Example: '-UDEBUG'</para>
|
Example: '-UDEBUG'</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<option>--disable=<id></option>
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Disable individual checks. Please refer to the documentation of --enable=<id> for futher details.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<option>--enable=<id></option>
|
<option>--enable=<id></option>
|
||||||
|
|
|
@ -2,3 +2,4 @@ release notes for cppcheck-2.10
|
||||||
|
|
||||||
- the deprecated Makefile option SRCDIR is no longer accepted
|
- the deprecated Makefile option SRCDIR is no longer accepted
|
||||||
- if the file provided via "--file-list" cannot be opened it will now error out
|
- if the file provided via "--file-list" cannot be opened it will now error out
|
||||||
|
- add command-line option "--disable=<id>" to individually disable checks
|
||||||
|
|
|
@ -88,6 +88,15 @@ private:
|
||||||
TEST_CASE(enabledInternal);
|
TEST_CASE(enabledInternal);
|
||||||
#endif
|
#endif
|
||||||
TEST_CASE(enabledMultiple);
|
TEST_CASE(enabledMultiple);
|
||||||
|
TEST_CASE(enabledInvalid);
|
||||||
|
TEST_CASE(enabledError);
|
||||||
|
TEST_CASE(enabledEmpty);
|
||||||
|
TEST_CASE(disableAll);
|
||||||
|
TEST_CASE(disableMultiple);
|
||||||
|
TEST_CASE(disableStylePartial);
|
||||||
|
TEST_CASE(disableInvalid);
|
||||||
|
TEST_CASE(disableError);
|
||||||
|
TEST_CASE(disableEmpty);
|
||||||
TEST_CASE(inconclusive);
|
TEST_CASE(inconclusive);
|
||||||
TEST_CASE(errorExitcode);
|
TEST_CASE(errorExitcode);
|
||||||
TEST_CASE(errorExitcodeMissing);
|
TEST_CASE(errorExitcodeMissing);
|
||||||
|
@ -654,6 +663,109 @@ private:
|
||||||
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void enabledInvalid() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=warning,missingIncludeSystem,style", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --enable parameter with the unknown name 'missingIncludeSystem'\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enabledError() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=error", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --enable parameter with the unknown name 'error'\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void enabledEmpty() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --enable parameter is empty\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableAll() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=all", "--disable=all"};
|
||||||
|
settings.severity.clear();
|
||||||
|
settings.checks.clear();
|
||||||
|
ASSERT(defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::error));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::warning));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::style));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::performance));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::portability));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::debug));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::internalCheck));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableMultiple() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=all", "--disable=style", "--disable=unusedFunction"};
|
||||||
|
settings.severity.clear();
|
||||||
|
settings.checks.clear();
|
||||||
|
ASSERT(defParser.parseFromArgs(4, argv));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::error));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::warning));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::style));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::performance));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::portability));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::debug));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(true, settings.checks.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::internalCheck));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
// make sure the implied "style" checks are not added when "--enable=style" is specified
|
||||||
|
void disableStylePartial() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--enable=style", "--disable=performance", "--enable=unusedFunction"};
|
||||||
|
settings.severity.clear();
|
||||||
|
settings.checks.clear();
|
||||||
|
ASSERT(defParser.parseFromArgs(4, argv));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::error));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::warning));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::style));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::performance));
|
||||||
|
ASSERT_EQUALS(true, settings.severity.isEnabled(Severity::portability));
|
||||||
|
ASSERT_EQUALS(false, settings.severity.isEnabled(Severity::debug));
|
||||||
|
ASSERT_EQUALS(true, settings.checks.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, settings.checks.isEnabled(Checks::internalCheck));
|
||||||
|
ASSERT_EQUALS("", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableInvalid() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--disable=leaks", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --disable parameter with the unknown name 'leaks'\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableError() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--disable=error", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --disable parameter with the unknown name 'error'\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableEmpty() {
|
||||||
|
REDIRECT;
|
||||||
|
const char * const argv[] = {"cppcheck", "--disable=", "file.cpp"};
|
||||||
|
settings = Settings();
|
||||||
|
ASSERT(!defParser.parseFromArgs(3, argv));
|
||||||
|
ASSERT_EQUALS("cppcheck: error: --disable parameter is empty\n", GET_REDIRECT_OUTPUT);
|
||||||
|
}
|
||||||
|
|
||||||
void inconclusive() {
|
void inconclusive() {
|
||||||
REDIRECT;
|
REDIRECT;
|
||||||
const char * const argv[] = {"cppcheck", "--inconclusive"};
|
const char * const argv[] = {"cppcheck", "--inconclusive"};
|
||||||
|
|
|
@ -71,6 +71,7 @@
|
||||||
<ClCompile Include="testpreprocessor.cpp" />
|
<ClCompile Include="testpreprocessor.cpp" />
|
||||||
<ClCompile Include="testprocessexecutor.cpp" />
|
<ClCompile Include="testprocessexecutor.cpp" />
|
||||||
<ClCompile Include="testrunner.cpp" />
|
<ClCompile Include="testrunner.cpp" />
|
||||||
|
<ClCompile Include="testsettings.cpp" />
|
||||||
<ClCompile Include="testsimplifytemplate.cpp" />
|
<ClCompile Include="testsimplifytemplate.cpp" />
|
||||||
<ClCompile Include="testsimplifytokens.cpp" />
|
<ClCompile Include="testsimplifytokens.cpp" />
|
||||||
<ClCompile Include="testsimplifytypedef.cpp" />
|
<ClCompile Include="testsimplifytypedef.cpp" />
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
|
* Copyright (C) 2007-2022 Cppcheck team.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "errortypes.h"
|
||||||
|
#include "settings.h"
|
||||||
|
#include "testsuite.h"
|
||||||
|
|
||||||
|
class TestSettings : public TestFixture {
|
||||||
|
public:
|
||||||
|
TestSettings() : TestFixture("TestSettings") {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void run() override {
|
||||||
|
TEST_CASE(simpleEnableGroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
void simpleEnableGroup() const {
|
||||||
|
SimpleEnableGroup<Checks> group;
|
||||||
|
|
||||||
|
ASSERT_EQUALS(0, group.intValue());
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
group.fill();
|
||||||
|
|
||||||
|
ASSERT_EQUALS(4294967295, group.intValue());
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
group.clear();
|
||||||
|
|
||||||
|
ASSERT_EQUALS(0, group.intValue());
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
group.enable(Checks::unusedFunction);
|
||||||
|
group.setEnabled(Checks::missingInclude, true);
|
||||||
|
|
||||||
|
ASSERT_EQUALS(3, group.intValue());
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
group.disable(Checks::unusedFunction);
|
||||||
|
group.setEnabled(Checks::missingInclude, false);
|
||||||
|
|
||||||
|
ASSERT_EQUALS(0, group.intValue());
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
SimpleEnableGroup<Checks> newGroup;
|
||||||
|
newGroup.enable(Checks::missingInclude);
|
||||||
|
|
||||||
|
group.enable(newGroup);
|
||||||
|
|
||||||
|
ASSERT_EQUALS(2, group.intValue());
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(true, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
|
||||||
|
group.disable(newGroup);
|
||||||
|
|
||||||
|
ASSERT_EQUALS(0, group.intValue());
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::unusedFunction));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::missingInclude));
|
||||||
|
ASSERT_EQUALS(false, group.isEnabled(Checks::internalCheck));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
REGISTER_TEST(TestSettings)
|
Loading…
Reference in New Issue