/* * Cppcheck - A tool for static C/C++ code analysis * Copyright (C) 2007-2019 Cppcheck team. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ //--------------------------------------------------------------------------- #ifndef settingsH #define settingsH //--------------------------------------------------------------------------- #include "config.h" #include "errorlogger.h" #include "importproject.h" #include "library.h" #include "platform.h" #include "standards.h" #include "suppressions.h" #include "timer.h" #include #include #include #include #include namespace ValueFlow { class Value; } /// @addtogroup Core /// @{ /** * @brief This is just a container for general settings so that we don't need * to pass individual values to functions or constructors now or in the * future when we might have even more detailed settings. */ class CPPCHECKLIB Settings : public cppcheck::Platform { public: enum EnabledGroup { WARNING = 0x1, STYLE = 0x2, PERFORMANCE = 0x4, PORTABILITY = 0x8, INFORMATION = 0x10, UNUSED_FUNCTION = 0x20, MISSING_INCLUDE = 0x40, INTERNAL = 0x80 }; private: /** @brief enable extra checks by id */ int mEnabled; /** @brief terminate checking */ static std::atomic mTerminated; public: Settings(); std::list addons; /** @brief Path to the python interpreter to be used to run addons. */ std::string addonPython; /** @brief Paths used as base for conversion to relative paths. */ std::vector basePaths; /** @brief --cppcheck-build-dir */ std::string buildDir; /** @brief --file-filter for analyzing special files */ std::string fileFilter; /** Is the 'configuration checking' wanted? */ bool checkConfiguration; /** Check for incomplete info in library files? */ bool checkLibrary; /** * Check code in the headers, this is on by default but can * be turned off to save CPU */ bool checkHeaders; /** Check unused/uninstantiated templates */ bool checkUnusedTemplates; /** Use Clang */ bool clang; /** Use clang-tidy */ bool clangTidy; /** @brief include paths excluded from checking the configuration */ std::set configExcludePaths; /** @brief Are we running from DACA script? */ bool daca; /** @brief Is --debug-simplified given? */ bool debugSimplified; /** @brief Is --debug-normal given? */ bool debugnormal; /** @brief Is --debug-warnings given? */ bool debugwarnings; /** @brief Is --debug-template given? */ bool debugtemplate; /** @brief Is --dump given? */ bool dump; std::string dumpFile; enum Language { None, C, CPP }; /** @brief Name of the language that is enforced. Empty per default. */ Language enforcedLang; /** @brief Is --exception-handling given */ bool exceptionHandling; // argv[0] std::string exename; /** @brief If errors are found, this value is returned from main(). Default value is 0. */ int exitCode; /** * When this flag is false (default) then experimental * heuristics and checks are disabled. * * It should not be possible to enable this from any client. */ bool experimental; /** @brief Force checking the files with "too many" configurations (--force). */ bool force; /** @brief List of include paths, e.g. "my/includes/" which should be used for finding include files inside source files. (-I) */ std::list includePaths; /** @brief List of selected Visual Studio configurations that should be checks */ std::list checkVsConfigs; /** @brief Inconclusive checks */ bool inconclusive; /** Do not only check how interface is used. Also check that interface is safe. */ class CPPCHECKLIB SafeChecks { public: SafeChecks() : classes(false), externalFunctions(false), internalFunctions(false), externalVariables(false) {} static const char XmlRootName[]; static const char XmlClasses[]; static const char XmlExternalFunctions[]; static const char XmlInternalFunctions[]; static const char XmlExternalVariables[]; void clear() { classes = externalFunctions = internalFunctions = externalVariables = false; } /** * Public interface of classes * - public function parameters can have any value * - public functions can be called in any order * - public variables can have any value */ bool classes; /** * External functions * - external functions can be called in any order * - function parameters can have any values */ bool externalFunctions; /** * Experimental: assume that internal functions can be used in any way * This is only available in the GUI. */ bool internalFunctions; /** * Global variables that can be modified outside the TU. * - Such variable can have "any" value */ bool externalVariables; }; SafeChecks safeChecks; /** @brief Bug hunting */ bool bugHunting; /** @brief Debug bug hunting */ bool debugBugHunting; /** Filename for bug hunting report */ std::string bugHuntingReport; /** @brief Check diff */ struct Diff { std::string filename; int fromLine; int toLine; }; std::vector checkDiff; /** @brief check unknown function return values */ std::set checkUnknownFunctionReturn; /** @brief Is --inline-suppr given? */ bool inlineSuppressions; /** @brief How many processes/threads should do checking at the same time. Default is 1. (-j N) */ unsigned int jobs; /** @brief Collect unmatched suppressions in one run. * This delays the reporting until all files are checked. * It is needed by checks that analyse the whole code base. */ bool jointSuppressionReport; /** @brief --library= */ std::list libraries; /** Library */ Library library; /** @brief Load average value */ unsigned int loadAverage; /** @brief Maximum number of configurations to check before bailing. Default is 12. (--max-configs=N) */ unsigned int maxConfigs; /** @brief --check all configurations */ bool checkAllConfigurations; /** @brief --max-ctu-depth */ int maxCtuDepth; /** @brief suppress exitcode */ Suppressions nofail; /** @brief suppress message (--suppressions) */ Suppressions nomsg; /** @brief write results (--output-file=<file>) */ std::string outputFile; /** @brief plist output (--plist-output=<dir>) */ std::string plistOutput; /** @brief Using -E for debugging purposes */ bool preprocessOnly; ImportProject project; /** @brief Is --quiet given? */ bool quiet; /** @brief Use relative paths in output. */ bool relativePaths; /** @brief --report-progress */ bool reportProgress; /** Rule */ class CPPCHECKLIB Rule { public: Rule() : tokenlist("simple") // use simple tokenlist , id("rule") // default id , severity(Severity::style) { // default severity } std::string tokenlist; std::string pattern; std::string id; std::string summary; Severity::SeverityType severity; }; /** * @brief Extra rules */ std::list rules; /** @brief show timing information (--showtime=file|summary|top5) */ SHOWTIME_MODES showtime; /** Struct contains standards settings */ Standards standards; /** @brief The output format in which the errors are printed in text mode, e.g. "{severity} {file}:{line} {message} {id}" */ std::string templateFormat; /** @brief The output format in which the error locations are printed in * text mode, e.g. "{file}:{line} {info}" */ std::string templateLocation; /** @brief defines given by the user */ std::string userDefines; /** @brief undefines given by the user */ std::set userUndefs; /** @brief forced includes given by the user */ std::list userIncludes; /** @brief Is --verbose given? */ bool verbose; /** @brief write XML results (--xml) */ bool xml; /** @brief XML version (--xml-version=..) */ int xml_version; /** * @brief return true if a included file is to be excluded in Preprocessor::getConfigs * @return true for the file to be excluded. */ bool configurationExcluded(const std::string &file) const { for (const std::string & configExcludePath : configExcludePaths) { if (file.length()>=configExcludePath.length() && file.compare(0,configExcludePath.length(),configExcludePath)==0) { return true; } } return false; } /** * @brief Enable extra checks by id. See isEnabled() * @param str single id or list of id values to be enabled * or empty string to enable all. e.g. "style,possibleError" * @return error message. empty upon success */ std::string addEnabled(const std::string &str); /** * @brief Disables all severities, except from error. */ void clearEnabled() { mEnabled = 0; } /** * @brief Returns true if given id is in the list of * enabled extra checks (--enable) * @param group group to be enabled * @return true if the check is enabled. */ bool isEnabled(EnabledGroup group) const { return (mEnabled & group) == group; } /** * @brief Returns true if given severity is enabled * @return true if the check is enabled. */ bool isEnabled(Severity::SeverityType severity) const; /** * @brief Returns true if given value can be shown * @return true if the value can be shown */ bool isEnabled(const ValueFlow::Value *value, bool inconclusiveCheck=false) const; static std::vector loadDiffFile(std::istream &istr); /** Is posix library specified? */ bool posix() const { return std::find(libraries.begin(), libraries.end(), "posix") != libraries.end(); } /** @brief Request termination of checking */ static void terminate(bool t = true) { Settings::mTerminated = t; } /** @brief termination requested? */ static bool terminated() { return Settings::mTerminated; } }; /// @} //--------------------------------------------------------------------------- #endif // settingsH