Skip to content

Commit 8d9ceff

Browse files
committed
fix #11824
1 parent 77b76aa commit 8d9ceff

File tree

4 files changed

+36
-55
lines changed

4 files changed

+36
-55
lines changed

cli/cmdlineparser.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -439,11 +439,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
439439
}
440440

441441
bool def = false;
442-
bool maxconfigs = false;
443442

444443
ImportProject project;
445444

446445
bool executorAuto = true;
446+
bool is_set_max_config = false;
447447

448448
for (int i = 1; i < argc; i++) {
449449
if (argv[i][0] != '-') {
@@ -984,10 +984,8 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
984984
mLogger.printError("argument to '--max-configs=' must be greater than 0.");
985985
return Result::Fail;
986986
}
987-
987+
is_set_max_config = true;
988988
mSettings.maxConfigs = tmp;
989-
mSettings.force = false;
990-
maxconfigs = true;
991989
}
992990

993991
// max ctu depth
@@ -1157,7 +1155,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
11571155
return Result::Fail;
11581156
}
11591157

1160-
mSettings.checkAllConfigurations = false; // Can be overridden with --max-configs or --force
11611158
std::string projectFile = argv[i]+10;
11621159
ImportProject::Type projType = project.import(projectFile, &mSettings, &mSuppressions);
11631160
project.projectType = projType;
@@ -1551,6 +1548,10 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
15511548
}
15521549
}
15531550

1551+
if (is_set_max_config) {
1552+
mSettings.force = false;
1553+
}
1554+
15541555
if (!loadCppcheckCfg())
15551556
return Result::Fail;
15561557

@@ -1568,15 +1569,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
15681569
substituteTemplateFormatStatic(mSettings.templateFormat);
15691570
substituteTemplateLocationStatic(mSettings.templateLocation);
15701571

1571-
if (mSettings.force || maxconfigs)
1572-
mSettings.checkAllConfigurations = true;
1573-
1574-
if (mSettings.force)
1575-
mSettings.maxConfigs = INT_MAX;
1576-
1577-
else if ((def || mSettings.preprocessOnly) && !maxconfigs)
1578-
mSettings.maxConfigs = 1U;
1579-
15801572
if (mSettings.jobs > 1 && mSettings.buildDir.empty()) {
15811573
// TODO: bail out instead?
15821574
if (mSettings.checks.isEnabled(Checks::unusedFunction))

gui/mainwindow.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,14 +1101,6 @@ bool MainWindow::getCppcheckSettings(Settings& settings, Suppressions& supprs)
11011101
supprs.nomsg.addSuppression(suppression); // TODO: check result
11021102
}
11031103

1104-
// Only check the given -D configuration
1105-
if (!defines.isEmpty())
1106-
settings.maxConfigs = 1;
1107-
1108-
// If importing a project, only check the given configuration
1109-
if (!mProjectFile->getImportProject().isEmpty())
1110-
settings.checkAllConfigurations = false;
1111-
11121104
const QString &buildDir = fromNativePath(mProjectFile->getBuildDir());
11131105
if (!buildDir.isEmpty()) {
11141106
if (QDir(buildDir).isAbsolute()) {

lib/cppcheck.cpp

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,16 +1014,33 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10141014

10151015
// Get configurations..
10161016
std::set<std::string> configurations;
1017-
if ((mSettings.checkAllConfigurations && mSettings.userDefines.empty()) || mSettings.force) {
1018-
Timer::run("Preprocessor::getConfigs", mSettings.showtime, &s_timerResults, [&]() {
1017+
Timer::run("Preprocessor::getConfigs", mSettings.showtime, &s_timerResults, [&]() {
10191018
configurations = preprocessor.getConfigs(tokens1);
1020-
});
1019+
});
1020+
1021+
std::list<std::string> configs_total;
1022+
if (!mSettings.userDefines.empty()) {
1023+
configs_total.push_back(mSettings.userDefines);
1024+
}
1025+
1026+
int max_config_tmp;
1027+
if (mSettings.force) {
1028+
max_config_tmp = configurations.size();
10211029
} else {
1022-
configurations.insert(mSettings.userDefines);
1030+
if (mSettings.preprocessOnly) {
1031+
max_config_tmp = 1;
1032+
} else {
1033+
max_config_tmp = mSettings.maxConfigs;
1034+
}
1035+
max_config_tmp = max_config_tmp - configs_total.size();
1036+
}
1037+
1038+
for (auto it = configurations.begin(); it != configurations.end() && max_config_tmp > 0; ++it, max_config_tmp--) {
1039+
configs_total.push_back(*it);
10231040
}
10241041

10251042
if (mSettings.checkConfiguration) {
1026-
for (const std::string &config : configurations)
1043+
for (const std::string &config : configs_total)
10271044
(void)preprocessor.getcode(tokens1, config, files, true);
10281045

10291046
if (analyzerInformation)
@@ -1046,10 +1063,10 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10461063
executeRules("define", tokenlist);
10471064
}
10481065
#endif
1049-
1050-
if (!mSettings.force && configurations.size() > mSettings.maxConfigs) {
1066+
int max_total = configurations.size() + mSettings.userDefines.empty() ? 0 : 1;
1067+
if (!mSettings.force && max_total > mSettings.maxConfigs) {
10511068
if (mSettings.severity.isEnabled(Severity::information)) {
1052-
tooManyConfigsError(Path::toNativeSeparators(file.spath()),configurations.size());
1069+
tooManyConfigsError(Path::toNativeSeparators(file.spath()), max_total);
10531070
} else {
10541071
mTooManyConfigs = true;
10551072
}
@@ -1069,30 +1086,14 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10691086
}
10701087

10711088
std::set<unsigned long long> hashes;
1072-
int checkCount = 0;
10731089
bool hasValidConfig = false;
10741090
std::list<std::string> configurationError;
1075-
for (const std::string &currCfg : configurations) {
1091+
for (const std::string &currCfg : configs_total) {
10761092
// bail out if terminated
10771093
if (Settings::terminated())
10781094
break;
10791095

1080-
// Check only a few configurations (default 12), after that bail out, unless --force
1081-
// was used.
1082-
if (!mSettings.force && ++checkCount > mSettings.maxConfigs)
1083-
break;
1084-
1085-
if (!mSettings.userDefines.empty()) {
1086-
mCurrentConfig = mSettings.userDefines;
1087-
const std::vector<std::string> v1(split(mSettings.userDefines, ";"));
1088-
for (const std::string &cfg: split(currCfg, ";")) {
1089-
if (std::find(v1.cbegin(), v1.cend(), cfg) == v1.cend()) {
1090-
mCurrentConfig += ";" + cfg;
1091-
}
1092-
}
1093-
} else {
1094-
mCurrentConfig = currCfg;
1095-
}
1096+
mCurrentConfig = currCfg;
10961097

10971098
if (mSettings.preprocessOnly) {
10981099
std::string codeWithoutCfg;
@@ -1132,7 +1133,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
11321133
mLogger->setLocationMacros(tokenizer.tokens(), files);
11331134

11341135
// If only errors are printed, print filename after the check
1135-
if (!mSettings.quiet && (!mCurrentConfig.empty() || checkCount > 1)) {
1136+
if (!mSettings.quiet && (!mCurrentConfig.empty())) {
11361137
std::string fixedpath = Path::toNativeSeparators(file.spath());
11371138
mErrorLogger.reportOut("Checking " + fixedpath + ": " + mCurrentConfig + "...", Color::FgGreen);
11381139
}
@@ -1187,9 +1188,8 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
11871188
} catch (const simplecpp::Output &o) {
11881189
// #error etc during preprocessing
11891190
configurationError.push_back((mCurrentConfig.empty() ? "\'\'" : mCurrentConfig) + " : [" + o.location.file() + ':' + std::to_string(o.location.line) + "] " + o.msg);
1190-
--checkCount; // don't count invalid configurations
11911191

1192-
if (!hasValidConfig && currCfg == *configurations.rbegin()) {
1192+
if (!hasValidConfig && currCfg == *configs_total.rbegin()) {
11931193
// If there is no valid configuration then report error..
11941194
std::string locfile = Path::fromNativeSeparators(o.location.file());
11951195
if (mSettings.relativePaths)
@@ -1218,7 +1218,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
12181218
}
12191219
}
12201220

1221-
if (!hasValidConfig && configurations.size() > 1 && mSettings.severity.isEnabled(Severity::information)) {
1221+
if (!hasValidConfig && configs_total.size() > 1 && mSettings.severity.isEnabled(Severity::information)) {
12221222
std::string msg;
12231223
msg = "This file is not analyzed. Cppcheck failed to extract a valid configuration. Use -v for more details.";
12241224
msg += "\nThis file is not analyzed. Cppcheck failed to extract a valid configuration. The tested configurations have these preprocessor errors:";

lib/settings.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,6 @@ class CPPCHECKLIB WARN_UNUSED Settings {
129129
/** @brief --cppcheck-build-dir. Always uses / as path separator. No trailing path separator. */
130130
std::string buildDir;
131131

132-
/** @brief check all configurations (false if -D or --max-configs is used */
133-
bool checkAllConfigurations = true;
134-
135132
/** Is the 'configuration checking' wanted? */
136133
bool checkConfiguration{};
137134

0 commit comments

Comments
 (0)