diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b9006711ce1..97b23e4f079 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -324,8 +324,37 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // default to --check-level=normal from CLI for now mSettings.setCheckLevel(Settings::CheckLevel::normal); + // read --debug-lookup early so the option is available for the cppcheck.cfg loading + for (int i = 1; i < argc; i++) { + // Show debug warnings for lookup for configuration files + if (std::strcmp(argv[i], "--debug-lookup") == 0) + mSettings.debuglookup = true; + + else if (std::strncmp(argv[i], "--debug-lookup=", 15) == 0) { + const std::string lookup = argv[i] + 15; + if (lookup == "all") + mSettings.debuglookup = true; + else if (lookup == "addon") + mSettings.debuglookupAddon = true; + else if (lookup == "config") + mSettings.debuglookupConfig = true; + else if (lookup == "library") + mSettings.debuglookupLibrary = true; + else if (lookup == "platform") + mSettings.debuglookupPlatform = true; + else + { + mLogger.printError("unknown lookup '" + lookup + "'"); + return Result::Fail; + } + } + } + + if (!loadCppcheckCfg()) + return Result::Fail; + if (argc <= 1) { - printHelp(); + printHelp(mSettings.premium); return Result::Exit; } @@ -349,8 +378,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // print all possible error messages.. if (std::strcmp(argv[i], "--errorlist") == 0) { - if (!loadCppcheckCfg()) - return Result::Fail; { XMLErrorMessagesLogger xmlLogger; std::cout << ErrorMessage::getXMLHeader(mSettings.cppcheckCfgProductName, 2); @@ -362,7 +389,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a // Print help if (std::strcmp(argv[i], "-h") == 0 || std::strcmp(argv[i], "--help") == 0) { - printHelp(); + printHelp(mSettings.premium); return Result::Exit; } @@ -374,8 +401,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } if (std::strcmp(argv[i], "--version") == 0) { - if (!loadCppcheckCfg()) - return Result::Fail; const std::string version = getVersion(); mLogger.printRaw(version); // TODO: should not include newline return Result::Exit; @@ -614,28 +639,11 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a std::strcmp(argv[i], "--debug-normal") == 0) debug = true; - // Show debug warnings for lookup for configuration files else if (std::strcmp(argv[i], "--debug-lookup") == 0) - mSettings.debuglookup = true; + continue; // already handled above - else if (std::strncmp(argv[i], "--debug-lookup=", 15) == 0) { - const std::string lookup = argv[i] + 15; - if (lookup == "all") - mSettings.debuglookup = true; - else if (lookup == "addon") - mSettings.debuglookupAddon = true; - else if (lookup == "config") - mSettings.debuglookupConfig = true; - else if (lookup == "library") - mSettings.debuglookupLibrary = true; - else if (lookup == "platform") - mSettings.debuglookupPlatform = true; - else - { - mLogger.printError("unknown lookup '" + lookup + "'"); - return Result::Fail; - } - } + else if (std::strncmp(argv[i], "--debug-lookup=", 15) == 0) + continue; // already handled above // Flag used for various purposes during debugging else if (std::strcmp(argv[i], "--debug-simplified") == 0) @@ -1005,6 +1013,9 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mSettings.cppHeaderProbe = false; } + else if (std::strcmp(argv[i], "--no-safety") == 0) + mSettings.safety = false; + // Write results in file else if (std::strncmp(argv[i], "--output-file=", 14) == 0) mSettings.outputFile = Path::simplifyPath(argv[i] + 14); @@ -1087,7 +1098,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } // Special Cppcheck Premium options - else if ((std::strncmp(argv[i], "--premium=", 10) == 0 || std::strncmp(argv[i], "--premium-", 10) == 0) && isCppcheckPremium()) { + else if ((std::strncmp(argv[i], "--premium=", 10) == 0 || std::strncmp(argv[i], "--premium-", 10) == 0) && mSettings.premium) { // valid options --premium=.. const std::set valid{ "autosar", @@ -1105,7 +1116,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a "misra-c++-2023", "misra-cpp-2023", "bughunting", - "safety", + "safety", // TODO: deprecate in favor of the regular --saftey/--no-safety "debug-progress"}; // valid options --premium-..= const std::set valid2{ @@ -1148,7 +1159,7 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a mSettings.checkAllConfigurations = false; // Can be overridden with --max-configs or --force std::string projectFile = argv[i]+10; - projectType = project.import(projectFile, &mSettings, &mSuppressions, isCppcheckPremium()); + projectType = project.import(projectFile, &mSettings, &mSuppressions); if (projectType == ImportProject::Type::CPPCHECK_GUI) { for (const std::string &lib : project.guiProject.libraries) mSettings.libraries.emplace_back(lib); @@ -1561,9 +1572,6 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a } } - if (!loadCppcheckCfg()) - return Result::Fail; - // TODO: bail out? if (!executorAuto && mSettings.useSingleJob()) mLogger.printMessage("'--executor' has no effect as only a single job will be used."); @@ -1687,13 +1695,15 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a return Result::Success; } -void CmdLineParser::printHelp() const +void CmdLineParser::printHelp(bool premium) const { - const std::string manualUrl(isCppcheckPremium() ? - "https://cppcheck.sourceforge.io/manual.pdf" : - "https://files.cppchecksolutions.com/manual.pdf"); + // TODO: fetch URL from config like product name? + const std::string manualUrl(premium ? + "https://files.cppchecksolutions.com/manual.pdf" : + "https://cppcheck.sourceforge.io/manual.pdf"); std::ostringstream oss; + // TODO: display product name oss << "Cppcheck - A tool for static C/C++ code analysis\n" "\n" "Syntax:\n" @@ -1894,7 +1904,7 @@ void CmdLineParser::printHelp() const " --plist-output=\n" " Generate Clang-plist output files in folder.\n"; - if (isCppcheckPremium()) { + if (premium) { oss << " --premium=