Skip to content

Commit e279f62

Browse files
committed
fix #11824
1 parent 77b76aa commit e279f62

4 files changed

Lines changed: 42 additions & 49 deletions

File tree

cli/cmdlineparser.cpp

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,6 @@ 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

@@ -984,10 +983,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
984983
mLogger.printError("argument to '--max-configs=' must be greater than 0.");
985984
return Result::Fail;
986985
}
987-
988986
mSettings.maxConfigs = tmp;
989-
mSettings.force = false;
990-
maxconfigs = true;
991987
}
992988

993989
// max ctu depth
@@ -1551,6 +1547,10 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
15511547
}
15521548
}
15531549

1550+
if (mSettings.maxConfigs > 0) {
1551+
mSettings.force = false;
1552+
}
1553+
15541554
if (!loadCppcheckCfg())
15551555
return Result::Fail;
15561556

@@ -1568,15 +1568,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
15681568
substituteTemplateFormatStatic(mSettings.templateFormat);
15691569
substituteTemplateLocationStatic(mSettings.templateLocation);
15701570

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-
15801571
if (mSettings.jobs > 1 && mSettings.buildDir.empty()) {
15811572
// TODO: bail out instead?
15821573
if (mSettings.checks.isEnabled(Checks::unusedFunction))

gui/mainwindow.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,10 +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-
11081104
// If importing a project, only check the given configuration
11091105
if (!mProjectFile->getImportProject().isEmpty())
11101106
settings.checkAllConfigurations = false;

lib/cppcheck.cpp

Lines changed: 35 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,16 +1014,37 @@ 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, [&]() {
1019-
configurations = preprocessor.getConfigs(tokens1);
1020-
});
1017+
Timer::run("Preprocessor::getConfigs", mSettings.showtime, &s_timerResults, [&]() {
1018+
configurations = preprocessor.getConfigs(tokens1);
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 && mSettings.maxConfigs <= 0) {
1028+
max_config_tmp = configurations.size();
1029+
} else if (mSettings.maxConfigs > 0) {
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+
} else if (!mSettings.checkAllConfigurations) {
1037+
max_config_tmp = 1;
10211038
} else {
1022-
configurations.insert(mSettings.userDefines);
1039+
max_config_tmp = mSettings.maxConfigsDefault - configs_total.size();
1040+
}
1041+
1042+
for (auto it = configurations.begin(); it != configurations.end() && max_config_tmp > 0; ++it, max_config_tmp--) {
1043+
configs_total.push_back(*it);
10231044
}
10241045

10251046
if (mSettings.checkConfiguration) {
1026-
for (const std::string &config : configurations)
1047+
for (const std::string &config : configs_total)
10271048
(void)preprocessor.getcode(tokens1, config, files, true);
10281049

10291050
if (analyzerInformation)
@@ -1046,10 +1067,10 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10461067
executeRules("define", tokenlist);
10471068
}
10481069
#endif
1049-
1050-
if (!mSettings.force && configurations.size() > mSettings.maxConfigs) {
1070+
int max_total = configurations.size() + (mSettings.userDefines.empty() ? 0 : 1);
1071+
if (!mSettings.force && max_total > mSettings.maxConfigsDefault) {
10511072
if (mSettings.severity.isEnabled(Severity::information)) {
1052-
tooManyConfigsError(Path::toNativeSeparators(file.spath()),configurations.size());
1073+
tooManyConfigsError(Path::toNativeSeparators(file.spath()), max_total);
10531074
} else {
10541075
mTooManyConfigs = true;
10551076
}
@@ -1069,30 +1090,14 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10691090
}
10701091

10711092
std::set<unsigned long long> hashes;
1072-
int checkCount = 0;
10731093
bool hasValidConfig = false;
10741094
std::list<std::string> configurationError;
1075-
for (const std::string &currCfg : configurations) {
1095+
for (const std::string &currCfg : configs_total) {
10761096
// bail out if terminated
10771097
if (Settings::terminated())
10781098
break;
10791099

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-
}
1100+
mCurrentConfig = currCfg;
10961101

10971102
if (mSettings.preprocessOnly) {
10981103
std::string codeWithoutCfg;
@@ -1132,7 +1137,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
11321137
mLogger->setLocationMacros(tokenizer.tokens(), files);
11331138

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

1192-
if (!hasValidConfig && currCfg == *configurations.rbegin()) {
1196+
if (!hasValidConfig && currCfg == *configs_total.rbegin()) {
11931197
// If there is no valid configuration then report error..
11941198
std::string locfile = Path::fromNativeSeparators(o.location.file());
11951199
if (mSettings.relativePaths)
@@ -1218,7 +1222,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
12181222
}
12191223
}
12201224

1221-
if (!hasValidConfig && configurations.size() > 1 && mSettings.severity.isEnabled(Severity::information)) {
1225+
if (!hasValidConfig && configs_total.size() > 1 && mSettings.severity.isEnabled(Severity::information)) {
12221226
std::string msg;
12231227
msg = "This file is not analyzed. Cppcheck failed to extract a valid configuration. Use -v for more details.";
12241228
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: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,9 +278,11 @@ class CPPCHECKLIB WARN_UNUSED Settings {
278278
int loadAverage{};
279279
#endif
280280

281+
const static int maxConfigsDefault = 12;
282+
281283
/** @brief Maximum number of configurations to check before bailing.
282284
Default is 12. (--max-configs=N) */
283-
int maxConfigs = 12;
285+
int maxConfigs = 0;
284286

285287
/** @brief --max-ctu-depth */
286288
int maxCtuDepth = 2;

0 commit comments

Comments
 (0)