diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 9d49a5bd910..8559e8090cb 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -606,9 +606,9 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mLogger.printError("no path has been specified for --cppcheck-build-dir"); return Result::Fail; } + if (endsWith(path, '/')) + path.pop_back(); mSettings.buildDir = std::move(path); - if (endsWith(mSettings.buildDir, '/')) - mSettings.buildDir.pop_back(); } else if (std::strcmp(argv[i], "--cpp-header-probe") == 0) { @@ -992,10 +992,8 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } else if (std::strncmp(argv[i], "--max-template-recursion=", 25) == 0) { - int temp = 0; - if (!parseNumberArg(argv[i], 25, temp)) + if (!parseNumberArg(argv[i], 25, mSettings.maxTemplateRecursion)) return Result::Fail; - mSettings.maxTemplateRecursion = temp; } // undocumented option for usage in Python tests to indicate that no build dir should be injected @@ -1013,6 +1011,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a else if (std::strncmp(argv[i], "--output-format=", 16) == 0) { const std::string format = argv[i] + 16; + // TODO: text and plist is missing if (format == "sarif") mSettings.outputFormat = Settings::OutputFormat::sarif; else if (format == "xml") @@ -1021,7 +1020,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mLogger.printError("argument to '--output-format=' must be 'sarif' or 'xml'."); return Result::Fail; } - mSettings.xml = (mSettings.outputFormat == Settings::OutputFormat::xml); } @@ -1064,12 +1062,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // Write results in results.plist else if (std::strncmp(argv[i], "--plist-output=", 15) == 0) { - mSettings.outputFormat = Settings::OutputFormat::plist; - mSettings.plistOutput = Path::simplifyPath(argv[i] + 15); - if (mSettings.plistOutput.empty()) - mSettings.plistOutput = "."; + std::string path = Path::simplifyPath(argv[i] + 15); + if (path.empty()) + path = "."; - const std::string plistOutput = Path::toNativeSeparators(mSettings.plistOutput); + const std::string plistOutput = Path::toNativeSeparators(path); if (!Path::isDirectory(plistOutput)) { std::string message("plist folder does not exist: '"); message += plistOutput; @@ -1078,8 +1075,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a return Result::Fail; } - if (!endsWith(mSettings.plistOutput,'/')) - mSettings.plistOutput += '/'; + if (!endsWith(path,'/')) + path += '/'; + + mSettings.outputFormat = Settings::OutputFormat::plist; + mSettings.plistOutput = std::move(path); } // Special Cppcheck Premium options @@ -1226,10 +1226,8 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } else if (std::strncmp(argv[i], "--report-progress=", 18) == 0) { - int tmp; - if (!parseNumberArg(argv[i], 18, tmp, true)) + if (!parseNumberArg(argv[i], 18, mSettings.reportProgress, true)) return Result::Fail; - mSettings.reportProgress = tmp; } else if (std::strncmp(argv[i], "--report-type=", 14) == 0) { @@ -1501,7 +1499,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // Write results in results.xml else if (std::strcmp(argv[i], "--xml") == 0) { - mSettings.xml = true; mSettings.outputFormat = Settings::OutputFormat::xml; } @@ -1518,7 +1515,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mSettings.xml_version = tmp; // Enable also XML if version is set - mSettings.xml = true; mSettings.outputFormat = Settings::OutputFormat::xml; } diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index d6fbb2da54f..d632bc1dcc7 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -425,7 +425,7 @@ int CppCheckExecutor::check_internal(const Settings& settings) const if (settings.reportProgress >= 0) stdLogger.resetLatestProgressOutputTime(); - if (settings.xml) { + if (settings.outputFormat == Settings::OutputFormat::xml) { stdLogger.reportErr(ErrorMessage::getXMLHeader(settings.cppcheckCfgProductName, settings.xml_version)); } @@ -477,7 +477,7 @@ int CppCheckExecutor::check_internal(const Settings& settings) const stdLogger.writeCheckersReport(); - if (settings.xml) { + if (settings.outputFormat == Settings::OutputFormat::xml) { stdLogger.reportErr(ErrorMessage::getXMLFooter(settings.xml_version)); } @@ -492,7 +492,7 @@ int CppCheckExecutor::check_internal(const Settings& settings) const void StdLogger::writeCheckersReport() { const bool summary = mSettings.safety || mSettings.severity.isEnabled(Severity::information); - const bool xmlReport = mSettings.xml && mSettings.xml_version == 3; + const bool xmlReport = mSettings.outputFormat == Settings::OutputFormat::xml && mSettings.xml_version == 3; const bool textReport = !mSettings.checkersReportFilename.empty(); if (!summary && !xmlReport && !textReport) @@ -566,7 +566,7 @@ void StdLogger::reportErr(const std::string &errmsg) if (mErrorOutput) *mErrorOutput << errmsg << std::endl; else { - std::cerr << ansiToOEM(errmsg, !mSettings.xml) << std::endl; + std::cerr << ansiToOEM(errmsg, mSettings.outputFormat != Settings::OutputFormat::xml) << std::endl; } } @@ -640,7 +640,7 @@ void StdLogger::reportErr(const ErrorMessage &msg) if (mSettings.outputFormat == Settings::OutputFormat::sarif) mSarifReport.addFinding(msgCopy); - else if (mSettings.xml) + else if (mSettings.outputFormat == Settings::OutputFormat::xml) reportErr(msgCopy.toXML()); else reportErr(msgCopy.toString(mSettings.verbose, mSettings.templateFormat, mSettings.templateLocation)); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 86c8d2c6e09..2f813318e3d 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -1201,7 +1201,7 @@ QPair MainWindow::getCppcheckSettings() result.quiet = false; result.verbose = true; result.force = mSettings->value(SETTINGS_CHECK_FORCE, 1).toBool(); - result.xml = false; + result.outputFormat = Settings::OutputFormat::text; result.jobs = mSettings->value(SETTINGS_CHECK_THREADS, 1).toInt(); result.certainty.setEnabled(Certainty::inconclusive, mSettings->value(SETTINGS_INCONCLUSIVE_ERRORS, false).toBool()); if (!mProjectFile || result.platform.type == Platform::Type::Unspecified) diff --git a/lib/check.cpp b/lib/check.cpp index 12b42a82cab..7f289e0974b 100644 --- a/lib/check.cpp +++ b/lib/check.cpp @@ -115,7 +115,7 @@ ErrorPath Check::getErrorPath(const Token* errtok, const ValueFlow::Value* value ErrorPath errorPath; if (!value) { errorPath.emplace_back(errtok, std::move(bug)); - } else if (mSettings->verbose || mSettings->xml || !mSettings->templateLocation.empty()) { + } else if (mSettings->verbose || mSettings->outputFormat == Settings::OutputFormat::xml || !mSettings->templateLocation.empty()) { errorPath = value->errorPath; errorPath.emplace_back(errtok, std::move(bug)); } else { diff --git a/lib/settings.h b/lib/settings.h index 8709f9b76f3..dcec599c2e9 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -137,7 +137,7 @@ class CPPCHECKLIB WARN_UNUSED Settings { /** * Check code in the headers, this is on by default but can * be turned off to save CPU */ - bool checkHeaders = true; + bool checkHeaders = true; // TODO: CLI /** Check for incomplete info in library files? */ bool checkLibrary{}; @@ -149,10 +149,10 @@ class CPPCHECKLIB WARN_UNUSED Settings { std::string checkersReportFilename; /** @brief check unknown function return values */ - std::set checkUnknownFunctionReturn; + std::set checkUnknownFunctionReturn; // TODO: move to Library? /** Check unused/uninstantiated templates */ - bool checkUnusedTemplates = true; + bool checkUnusedTemplates = true; // TODO: CLI /** Use Clang */ bool clang{}; @@ -161,10 +161,10 @@ class CPPCHECKLIB WARN_UNUSED Settings { std::string clangExecutable = "clang"; /** Use clang-tidy */ - bool clangTidy{}; + bool clangTidy{}; // TODO: CLI /** Internal: Clear the simplecpp non-existing include cache */ - bool clearIncludeCache{}; + bool clearIncludeCache{}; // internal /** @brief include paths excluded from checking the configuration */ std::set configExcludePaths; @@ -269,8 +269,10 @@ class CPPCHECKLIB WARN_UNUSED Settings { /** Library */ Library library; +#ifdef HAS_THREADING_MODEL_FORK /** @brief Load average value */ int loadAverage{}; +#endif /** @brief Maximum number of configurations to check before bailing. Default is 12. (--max-configs=N) */ @@ -291,7 +293,7 @@ class CPPCHECKLIB WARN_UNUSED Settings { Platform platform; /** @brief pid of cppcheck. Intention is that this is set in the main process. */ - int pid; + int pid; // internal /** @brief plist output (--plist-output=<dir>) */ std::string plistOutput; @@ -458,11 +460,8 @@ class CPPCHECKLIB WARN_UNUSED Settings { /** @brief Is --verbose given? */ bool verbose{}; - /** @brief write XML results (--xml) */ - bool xml{}; - /** @brief XML version (--xml-version=..) */ - int xml_version = 2; + int xml_version = 2; // TODO: integrate into outputFormat enum? /** * @brief return true if a included file is to be excluded in Preprocessor::getConfigs diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index aadb7fdbe01..2813e357e0f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -5930,17 +5930,19 @@ void Tokenizer::printDebugOutput(int simplification, std::ostream &out) const (simplification != 2U && mSettings.debugnormal); if (debug && list.front()) { - if (!mSettings.xml) - list.front()->printOut(out, mSettings.xml, nullptr, list.getFiles()); + const bool xml = (mSettings.outputFormat == Settings::OutputFormat::xml); - if (mSettings.xml) + if (!xml) + list.front()->printOut(out, xml, nullptr, list.getFiles()); + + if (xml) { out << "" << std::endl; - list.front()->printOut(out, mSettings.xml, nullptr, list.getFiles()); + list.front()->printOut(out, xml, nullptr, list.getFiles()); } if (mSymbolDatabase) { - if (mSettings.xml) + if (xml) mSymbolDatabase->printXml(out); else if (mSettings.verbose) { mSymbolDatabase->printOut("Symbol database"); @@ -5948,11 +5950,11 @@ void Tokenizer::printDebugOutput(int simplification, std::ostream &out) const } if (mSettings.verbose) - list.front()->printAst(mSettings.verbose, mSettings.xml, list.getFiles(), out); + list.front()->printAst(mSettings.verbose, xml, list.getFiles(), out); - list.front()->printValueFlow(mSettings.xml, out); + list.front()->printValueFlow(xml, out); - if (mSettings.xml) + if (xml) out << "" << std::endl; } diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 43396748f2f..e9dcd8f1858 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -1832,7 +1832,7 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--xml", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); - ASSERT(settings->xml); + ASSERT_EQUALS_ENUM(Settings::OutputFormat::xml, settings->outputFormat); ASSERT_EQUALS(2, settings->xml_version); } @@ -1840,7 +1840,7 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--xml-version=2", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(3, argv)); - ASSERT(settings->xml); + ASSERT_EQUALS_ENUM(Settings::OutputFormat::xml, settings->outputFormat); ASSERT_EQUALS(2, settings->xml_version); } @@ -1848,7 +1848,7 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--xml", "--xml-version=2", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); - ASSERT(settings->xml); + ASSERT_EQUALS_ENUM(Settings::OutputFormat::xml, settings->outputFormat); ASSERT_EQUALS(2, settings->xml_version); } @@ -1856,7 +1856,7 @@ class TestCmdlineParser : public TestFixture { REDIRECT; const char * const argv[] = {"cppcheck", "--xml-version=2", "--xml", "file.cpp"}; ASSERT_EQUALS_ENUM(CmdLineParser::Result::Success, parser->parseFromArgs(4, argv)); - ASSERT(settings->xml); + ASSERT_EQUALS_ENUM(Settings::OutputFormat::xml, settings->outputFormat); ASSERT_EQUALS(2, settings->xml_version); }