From 2d1af4a6a539f7d0e58e0580cac8a71b712410b5 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 25 Feb 2025 16:43:19 +0100 Subject: [PATCH 1/4] improved determination if application is Premium / added TODOs --- cli/cmdlineparser.cpp | 96 ++++++++++++++++++++----------------- cli/cmdlineparser.h | 4 +- gui/main.cpp | 1 + gui/mainwindow.cpp | 5 ++ gui/xmlreportv2.cpp | 1 + lib/errorlogger.cpp | 1 + lib/settings.cpp | 5 +- lib/settings.h | 6 +++ test/cli/lookup_test.py | 3 ++ test/cli/other_test.py | 23 ++++++++- test/cli/premium_test.py | 10 ++++ test/testcmdlineparser.cpp | 98 +++++++++++++++++++++++++++----------- 12 files changed, 175 insertions(+), 78 deletions(-) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index b9006711ce1..e83733c46da 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) @@ -1087,7 +1095,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", @@ -1148,7 +1156,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, mSettings.premium); if (projectType == ImportProject::Type::CPPCHECK_GUI) { for (const std::string &lib : project.guiProject.libraries) mSettings.libraries.emplace_back(lib); @@ -1561,9 +1569,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 +1692,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 +1901,7 @@ void CmdLineParser::printHelp() const " --plist-output=\n" " Generate Clang-plist output files in folder.\n"; - if (isCppcheckPremium()) { + if (premium) { oss << " --premium=