From dd627a2b1d375dc8cbfdf86d28d7c361e0a3a2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Wed, 1 Nov 2023 21:08:30 +0100 Subject: [PATCH] moved `ImportProject` out of `Settings` and only store `fileSettings` (#5603) `ImportProject` is not needed outside of the command-line parsing so we do not need it inside the `Settings` at all. We only use the `fileSettings` in the executors. --- cli/cmdlineparser.cpp | 43 +++++++++++++++++++++--------------- cli/cppcheckexecutor.cpp | 12 +++++----- cli/processexecutor.cpp | 12 +++++----- cli/singleexecutor.cpp | 12 +++++----- cli/threadexecutor.cpp | 2 +- gui/mainwindow.cpp | 2 +- lib/cppcheck.cpp | 2 +- lib/settings.h | 4 ++-- test/testcmdlineparser.cpp | 1 - test/testprocessexecutor.cpp | 4 ++-- test/testsingleexecutor.cpp | 4 ++-- test/testthreadexecutor.cpp | 4 ++-- 12 files changed, 54 insertions(+), 48 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b4a092799..ef81ee931 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -122,6 +122,8 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) bool def = false; bool maxconfigs = false; + ImportProject project; + mSettings.exename = Path::getCurrentExecutablePath(argv[0]); for (int i = 1; i < argc; i++) { @@ -666,7 +668,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) // --project else if (std::strncmp(argv[i], "--project=", 10) == 0) { - if (mSettings.project.projectType != ImportProject::Type::NONE) + if (project.projectType != ImportProject::Type::NONE) { mLogger.printError("multiple --project options are not supported."); return false; @@ -674,16 +676,16 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) mSettings.checkAllConfigurations = false; // Can be overridden with --max-configs or --force std::string projectFile = argv[i]+10; - ImportProject::Type projType = mSettings.project.import(projectFile, &mSettings); - mSettings.project.projectType = projType; + ImportProject::Type projType = project.import(projectFile, &mSettings); + project.projectType = projType; if (projType == ImportProject::Type::CPPCHECK_GUI) { - for (const std::string &lib : mSettings.project.guiProject.libraries) + for (const std::string &lib : project.guiProject.libraries) mSettings.libraries.emplace_back(lib); - const auto& excludedPaths = mSettings.project.guiProject.excludedPaths; + const auto& excludedPaths = project.guiProject.excludedPaths; std::copy(excludedPaths.cbegin(), excludedPaths.cend(), std::back_inserter(mIgnoredPaths)); - std::string platform(mSettings.project.guiProject.platform); + std::string platform(project.guiProject.platform); // keep existing platform from command-line intact if (!platform.empty()) { @@ -700,14 +702,16 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) } } - if (!mSettings.project.guiProject.projectFile.empty()) { - projectFile = mSettings.project.guiProject.projectFile; - projType = mSettings.project.import(mSettings.project.guiProject.projectFile, &mSettings); + const auto& projectFileGui = project.guiProject.projectFile; + if (!projectFileGui.empty()) { + // read underlying project + projectFile = projectFileGui; + projType = project.import(projectFileGui, &mSettings); } } if (projType == ImportProject::Type::VS_SLN || projType == ImportProject::Type::VS_VCXPROJ) { - if (mSettings.project.guiProject.analyzeAllVsConfigs == "false") - mSettings.project.selectOneVsConfig(mSettings.platform.type); + if (project.guiProject.analyzeAllVsConfigs == "false") + project.selectOneVsConfig(mSettings.platform.type); if (!CppCheckExecutor::tryLoadLibrary(mSettings.library, argv[0], "windows.cfg")) { // This shouldn't happen normally. mLogger.printError("failed to load 'windows.cfg'. Your Cppcheck installation is broken. Please re-install."); @@ -731,8 +735,8 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) // --project-configuration else if (std::strncmp(argv[i], "--project-configuration=", 24) == 0) { mVSConfig = argv[i] + 24; - if (!mVSConfig.empty() && (mSettings.project.projectType == ImportProject::Type::VS_SLN || mSettings.project.projectType == ImportProject::Type::VS_VCXPROJ)) - mSettings.project.ignoreOtherConfigs(mVSConfig); + if (!mVSConfig.empty() && (project.projectType == ImportProject::Type::VS_SLN || project.projectType == ImportProject::Type::VS_VCXPROJ)) + project.ignoreOtherConfigs(mVSConfig); } // Only print something when there are errors @@ -1028,7 +1032,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) substituteTemplateFormatStatic(mSettings.templateFormat); substituteTemplateLocationStatic(mSettings.templateLocation); - mSettings.project.ignorePaths(mIgnoredPaths); + project.ignorePaths(mIgnoredPaths); if (mSettings.force || maxconfigs) mSettings.checkAllConfigurations = true; @@ -1053,19 +1057,22 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) return true; } - if (!mPathNames.empty() && mSettings.project.projectType != ImportProject::Type::NONE) { + if (!mPathNames.empty() && project.projectType != ImportProject::Type::NONE) { mLogger.printError("--project cannot be used in conjunction with source files."); return false; } // Print error only if we have "real" command and expect files - if (!mExitAfterPrint && mPathNames.empty() && mSettings.project.guiProject.pathNames.empty() && mSettings.project.fileSettings.empty()) { + if (!mExitAfterPrint && mPathNames.empty() && project.guiProject.pathNames.empty() && project.fileSettings.empty()) { mLogger.printError("no C or C++ source files found."); return false; } - if (!mSettings.project.guiProject.pathNames.empty()) - mPathNames = mSettings.project.guiProject.pathNames; + if (!project.guiProject.pathNames.empty()) + mPathNames = project.guiProject.pathNames; + + if (!project.fileSettings.empty()) + mSettings.fileSettings = project.fileSettings; // Use paths _pathnames if no base paths for relative path output are given if (mSettings.basePaths.empty() && mSettings.relativePaths) diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 80f635ca5..1e8b670a9 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -194,16 +194,16 @@ bool CppCheckExecutor::parseFromArgs(Settings &settings, int argc, const char* c #else const bool caseSensitive = true; #endif - if (!settings.project.fileSettings.empty() && !settings.fileFilters.empty()) { + if (!settings.fileSettings.empty() && !settings.fileFilters.empty()) { // filter only for the selected filenames from all project files std::list newList; - const std::list& fileSettings = settings.project.fileSettings; + const std::list& fileSettings = settings.fileSettings; std::copy_if(fileSettings.cbegin(), fileSettings.cend(), std::back_inserter(newList), [&](const ImportProject::FileSettings& fs) { return matchglobs(settings.fileFilters, fs.filename); }); if (!newList.empty()) - settings.project.fileSettings = newList; + settings.fileSettings = newList; else { logger.printError("could not find any files matching the filter."); return false; @@ -220,13 +220,13 @@ bool CppCheckExecutor::parseFromArgs(Settings &settings, int argc, const char* c } } - if (mFiles.empty() && settings.project.fileSettings.empty()) { + if (mFiles.empty() && settings.fileSettings.empty()) { logger.printError("could not find or open any of the paths given."); if (!ignored.empty()) logger.printMessage("Maybe all paths were ignored?"); return false; } - if (!settings.fileFilters.empty() && settings.project.fileSettings.empty()) { + if (!settings.fileFilters.empty() && settings.fileSettings.empty()) { std::map newMap; for (std::map::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) if (matchglobs(settings.fileFilters, i->first)) { @@ -319,7 +319,7 @@ int CppCheckExecutor::check_internal(CppCheck& cppcheck) std::list fileNames; for (std::map::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) fileNames.emplace_back(i->first); - AnalyzerInformation::writeFilesTxt(settings.buildDir, fileNames, settings.userDefines, settings.project.fileSettings); + AnalyzerInformation::writeFilesTxt(settings.buildDir, fileNames, settings.userDefines, settings.fileSettings); } if (!settings.checkersReportFilename.empty()) diff --git a/cli/processexecutor.cpp b/cli/processexecutor.cpp index 543ee8df6..e1373a525 100644 --- a/cli/processexecutor.cpp +++ b/cli/processexecutor.cpp @@ -237,11 +237,11 @@ unsigned int ProcessExecutor::check() std::map pipeFile; std::size_t processedsize = 0; std::map::const_iterator iFile = mFiles.cbegin(); - std::list::const_iterator iFileSettings = mSettings.project.fileSettings.cbegin(); + std::list::const_iterator iFileSettings = mSettings.fileSettings.cbegin(); for (;;) { // Start a new child const size_t nchildren = childFile.size(); - if ((iFile != mFiles.cend() || iFileSettings != mSettings.project.fileSettings.cend()) && nchildren < mSettings.jobs && checkLoadAverage(nchildren)) { + if ((iFile != mFiles.cend() || iFileSettings != mSettings.fileSettings.cend()) && nchildren < mSettings.jobs && checkLoadAverage(nchildren)) { int pipes[2]; if (pipe(pipes) == -1) { std::cerr << "#### ThreadExecutor::check, pipe() failed: "<< std::strerror(errno) << std::endl; @@ -275,7 +275,7 @@ unsigned int ProcessExecutor::check() fileChecker.settings() = mSettings; unsigned int resultOfCheck = 0; - if (iFileSettings != mSettings.project.fileSettings.end()) { + if (iFileSettings != mSettings.fileSettings.end()) { resultOfCheck = fileChecker.check(*iFileSettings); if (fileChecker.settings().clangTidy) fileChecker.analyseClangTidy(*iFileSettings); @@ -291,7 +291,7 @@ unsigned int ProcessExecutor::check() close(pipes[1]); rpipes.push_back(pipes[0]); - if (iFileSettings != mSettings.project.fileSettings.end()) { + if (iFileSettings != mSettings.fileSettings.end()) { childFile[pid] = iFileSettings->filename + ' ' + iFileSettings->cfg; pipeFile[pipes[0]] = iFileSettings->filename + ' ' + iFileSettings->cfg; ++iFileSettings; @@ -334,7 +334,7 @@ unsigned int ProcessExecutor::check() fileCount++; processedsize += size; if (!mSettings.quiet) - Executor::reportStatus(fileCount, mFiles.size() + mSettings.project.fileSettings.size(), processedsize, totalfilesize); + Executor::reportStatus(fileCount, mFiles.size() + mSettings.fileSettings.size(), processedsize, totalfilesize); close(*rp); rp = rpipes.erase(rp); @@ -370,7 +370,7 @@ unsigned int ProcessExecutor::check() } } } - if (iFile == mFiles.end() && iFileSettings == mSettings.project.fileSettings.end() && rpipes.empty() && childFile.empty()) { + if (iFile == mFiles.end() && iFileSettings == mSettings.fileSettings.end() && rpipes.empty() && childFile.empty()) { // All done break; } diff --git a/cli/singleexecutor.cpp b/cli/singleexecutor.cpp index 6c5ea6964..a0265db63 100644 --- a/cli/singleexecutor.cpp +++ b/cli/singleexecutor.cpp @@ -51,7 +51,7 @@ unsigned int SingleExecutor::check() unsigned int c = 0; // TODO: processes either mSettings.project.fileSettings or mFiles - process/thread implementations process both // TODO: thread/process implementations process fileSettings first - if (mSettings.project.fileSettings.empty()) { + if (mSettings.fileSettings.empty()) { for (std::map::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) { if (!mSettings.library.markupFile(i->first) || !mSettings.library.processMarkupAfterCode(i->first)) { @@ -66,13 +66,13 @@ unsigned int SingleExecutor::check() } else { // filesettings // check all files of the project - for (const ImportProject::FileSettings &fs : mSettings.project.fileSettings) { + for (const ImportProject::FileSettings &fs : mSettings.fileSettings) { if (!mSettings.library.markupFile(fs.filename) || !mSettings.library.processMarkupAfterCode(fs.filename)) { result += mCppcheck.check(fs); ++c; if (!mSettings.quiet) - reportStatus(c, mSettings.project.fileSettings.size(), c, mSettings.project.fileSettings.size()); + reportStatus(c, mSettings.fileSettings.size(), c, mSettings.fileSettings.size()); if (mSettings.clangTidy) mCppcheck.analyseClangTidy(fs); } @@ -82,7 +82,7 @@ unsigned int SingleExecutor::check() // second loop to parse all markup files which may not work until all // c/cpp files have been parsed and checked // TODO: get rid of duplicated code - if (mSettings.project.fileSettings.empty()) { + if (mSettings.fileSettings.empty()) { for (std::map::const_iterator i = mFiles.cbegin(); i != mFiles.cend(); ++i) { if (mSettings.library.markupFile(i->first) && mSettings.library.processMarkupAfterCode(i->first)) { @@ -96,13 +96,13 @@ unsigned int SingleExecutor::check() } } else { - for (const ImportProject::FileSettings &fs : mSettings.project.fileSettings) { + for (const ImportProject::FileSettings &fs : mSettings.fileSettings) { if (mSettings.library.markupFile(fs.filename) && mSettings.library.processMarkupAfterCode(fs.filename)) { result += mCppcheck.check(fs); ++c; if (!mSettings.quiet) - reportStatus(c, mSettings.project.fileSettings.size(), c, mSettings.project.fileSettings.size()); + reportStatus(c, mSettings.fileSettings.size(), c, mSettings.fileSettings.size()); if (mSettings.clangTidy) mCppcheck.analyseClangTidy(fs); } diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 9cd8dcae1..0b7283319 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -180,7 +180,7 @@ unsigned int ThreadExecutor::check() std::vector> threadFutures; threadFutures.reserve(mSettings.jobs); - ThreadData data(*this, mErrorLogger, mSettings, mFiles, mSettings.project.fileSettings, mExecuteCommand); + ThreadData data(*this, mErrorLogger, mSettings, mFiles, mSettings.fileSettings, mExecuteCommand); for (unsigned int i = 0; i < mSettings.jobs; ++i) { try { diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 84efbf662..c8dd8fa2e 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -600,7 +600,7 @@ void MainWindow::doAnalyzeFiles(const QStringList &files, const bool checkLibrar std::transform(fileNames.cbegin(), fileNames.cend(), std::back_inserter(sourcefiles), [](const QString& s) { return s.toStdString(); }); - AnalyzerInformation::writeFilesTxt(checkSettings.buildDir, sourcefiles, checkSettings.userDefines, checkSettings.project.fileSettings); + AnalyzerInformation::writeFilesTxt(checkSettings.buildDir, sourcefiles, checkSettings.userDefines, checkSettings.fileSettings); } mThread->setCheckFiles(true); diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 55284f6fb..6cee5ffe8 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1797,7 +1797,7 @@ void CppCheck::removeCtuInfoFiles(const std::map &file const std::string &ctuInfoFileName = getCtuInfoFileName(dumpFileName); std::remove(ctuInfoFileName.c_str()); } - for (const auto& fs: mSettings.project.fileSettings) { + for (const auto& fs: mSettings.fileSettings) { const std::string &dumpFileName = getDumpFileName(mSettings, fs.filename); const std::string &ctuInfoFileName = getCtuInfoFileName(dumpFileName); std::remove(ctuInfoFileName.c_str()); diff --git a/lib/settings.h b/lib/settings.h index fa9289db2..c8c19f3da 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -205,6 +205,8 @@ public: /** @brief List of --file-filter for analyzing special files */ std::vector fileFilters; + std::list fileSettings; + /** @brief Force checking the files with "too many" configurations (--force). */ bool force{}; @@ -267,8 +269,6 @@ public: /** @brief Using -E for debugging purposes */ bool preprocessOnly{}; - ImportProject project; - /** @brief Is --quiet given? */ bool quiet{}; diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 8162b8f37..48fcd6d0c 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -2015,7 +2015,6 @@ private: ""); const char * const argv[] = {"cppcheck", "--project=project.cppcheck"}; ASSERT(parser->parseFromArgs(2, argv)); - ASSERT_EQUALS(static_cast(ImportProject::Type::CPPCHECK_GUI), static_cast(settings->project.projectType)); ASSERT_EQUALS(1, parser->getPathNames().size()); auto it = parser->getPathNames().cbegin(); ASSERT_EQUALS("dir", *it); diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index 2d3450a20..ea0fda81b 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -82,7 +82,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = std::move(f_s); - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } } @@ -93,7 +93,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = f; - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } } diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index b212c916b..d005378ac 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -87,7 +87,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = std::move(f_s); - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } } @@ -98,7 +98,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = f; - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } } diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 170cfe118..81622cb40 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -82,7 +82,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = std::move(f_s); - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } } @@ -93,7 +93,7 @@ private: if (useFS) { ImportProject::FileSettings fs; fs.filename = f; - s.project.fileSettings.emplace_back(std::move(fs)); + s.fileSettings.emplace_back(std::move(fs)); } } }