Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- AnalyzerOptions.h - Analysis Engine Options --------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This header defines various options for the static analyzer that are set
  10. // by the frontend and are consulted throughout the analyzer.
  11. //
  12. //===----------------------------------------------------------------------===//
  13.  
  14. #ifndef LLVM_CLANG_STATICANALYZER_CORE_ANALYZEROPTIONS_H
  15. #define LLVM_CLANG_STATICANALYZER_CORE_ANALYZEROPTIONS_H
  16.  
  17. #include "clang/Analysis/PathDiagnostic.h"
  18. #include "clang/Basic/LLVM.h"
  19. #include "llvm/ADT/IntrusiveRefCntPtr.h"
  20. #include "llvm/ADT/StringMap.h"
  21. #include "llvm/ADT/StringRef.h"
  22. #include <string>
  23. #include <utility>
  24. #include <vector>
  25.  
  26. namespace clang {
  27.  
  28. namespace ento {
  29.  
  30. class CheckerBase;
  31.  
  32. } // namespace ento
  33.  
  34. /// AnalysisConstraints - Set of available constraint models.
  35. enum AnalysisConstraints {
  36. #define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) NAME##Model,
  37. #include "clang/StaticAnalyzer/Core/Analyses.def"
  38. NumConstraints
  39. };
  40.  
  41. /// AnalysisDiagClients - Set of available diagnostic clients for rendering
  42. ///  analysis results.
  43. enum AnalysisDiagClients {
  44. #define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN) PD_##NAME,
  45. #include "clang/StaticAnalyzer/Core/Analyses.def"
  46. PD_NONE,
  47. NUM_ANALYSIS_DIAG_CLIENTS
  48. };
  49.  
  50. /// AnalysisPurgeModes - Set of available strategies for dead symbol removal.
  51. enum AnalysisPurgeMode {
  52. #define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) NAME,
  53. #include "clang/StaticAnalyzer/Core/Analyses.def"
  54. NumPurgeModes
  55. };
  56.  
  57. /// AnalysisInlineFunctionSelection - Set of inlining function selection heuristics.
  58. enum AnalysisInliningMode {
  59. #define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) NAME,
  60. #include "clang/StaticAnalyzer/Core/Analyses.def"
  61. NumInliningModes
  62. };
  63.  
  64. /// Describes the different kinds of C++ member functions which can be
  65. /// considered for inlining by the analyzer.
  66. ///
  67. /// These options are cumulative; enabling one kind of member function will
  68. /// enable all kinds with lower enum values.
  69. enum CXXInlineableMemberKind {
  70.   // Uninitialized = 0,
  71.  
  72.   /// A dummy mode in which no C++ inlining is enabled.
  73.   CIMK_None,
  74.  
  75.   /// Refers to regular member function and operator calls.
  76.   CIMK_MemberFunctions,
  77.  
  78.   /// Refers to constructors (implicit or explicit).
  79.   ///
  80.   /// Note that a constructor will not be inlined if the corresponding
  81.   /// destructor is non-trivial.
  82.   CIMK_Constructors,
  83.  
  84.   /// Refers to destructors (implicit or explicit).
  85.   CIMK_Destructors
  86. };
  87.  
  88. /// Describes the different modes of inter-procedural analysis.
  89. enum IPAKind {
  90.   /// Perform only intra-procedural analysis.
  91.   IPAK_None = 1,
  92.  
  93.   /// Inline C functions and blocks when their definitions are available.
  94.   IPAK_BasicInlining = 2,
  95.  
  96.   /// Inline callees(C, C++, ObjC) when their definitions are available.
  97.   IPAK_Inlining = 3,
  98.  
  99.   /// Enable inlining of dynamically dispatched methods.
  100.   IPAK_DynamicDispatch = 4,
  101.  
  102.   /// Enable inlining of dynamically dispatched methods, bifurcate paths when
  103.   /// exact type info is unavailable.
  104.   IPAK_DynamicDispatchBifurcate = 5
  105. };
  106.  
  107. enum class ExplorationStrategyKind {
  108.   DFS,
  109.   BFS,
  110.   UnexploredFirst,
  111.   UnexploredFirstQueue,
  112.   UnexploredFirstLocationQueue,
  113.   BFSBlockDFSContents,
  114. };
  115.  
  116. /// Describes the kinds for high-level analyzer mode.
  117. enum UserModeKind {
  118.   /// Perform shallow but fast analyzes.
  119.   UMK_Shallow = 1,
  120.  
  121.   /// Perform deep analyzes.
  122.   UMK_Deep = 2
  123. };
  124.  
  125. enum class CTUPhase1InliningKind { None, Small, All };
  126.  
  127. /// Stores options for the analyzer from the command line.
  128. ///
  129. /// Some options are frontend flags (e.g.: -analyzer-output), but some are
  130. /// analyzer configuration options, which are preceded by -analyzer-config
  131. /// (e.g.: -analyzer-config notes-as-events=true).
  132. ///
  133. /// If you'd like to add a new frontend flag, add it to
  134. /// include/clang/Driver/CC1Options.td, add a new field to store the value of
  135. /// that flag in this class, and initialize it in
  136. /// lib/Frontend/CompilerInvocation.cpp.
  137. ///
  138. /// If you'd like to add a new non-checker configuration, register it in
  139. /// include/clang/StaticAnalyzer/Core/AnalyzerOptions.def, and refer to the
  140. /// top of the file for documentation.
  141. ///
  142. /// If you'd like to add a new checker option, call getChecker*Option()
  143. /// whenever.
  144. ///
  145. /// Some of the options are controlled by raw frontend flags for no good reason,
  146. /// and should be eventually converted into -analyzer-config flags. New analyzer
  147. /// options should not be implemented as frontend flags. Frontend flags still
  148. /// make sense for things that do not affect the actual analysis.
  149. class AnalyzerOptions : public RefCountedBase<AnalyzerOptions> {
  150. public:
  151.   using ConfigTable = llvm::StringMap<std::string>;
  152.  
  153.   /// Retrieves the list of checkers generated from Checkers.td. This doesn't
  154.   /// contain statically linked but non-generated checkers and plugin checkers!
  155.   static std::vector<StringRef>
  156.   getRegisteredCheckers(bool IncludeExperimental = false);
  157.  
  158.   /// Retrieves the list of packages generated from Checkers.td. This doesn't
  159.   /// contain statically linked but non-generated packages and plugin packages!
  160.   static std::vector<StringRef>
  161.   getRegisteredPackages(bool IncludeExperimental = false);
  162.  
  163.   /// Convenience function for printing options or checkers and their
  164.   /// description in a formatted manner. If \p MinLineWidth is set to 0, no line
  165.   /// breaks are introduced for the description.
  166.   ///
  167.   /// Format, depending whether the option name's length is less than
  168.   /// \p EntryWidth:
  169.   ///
  170.   ///   <padding>EntryName<padding>Description
  171.   ///   <---------padding--------->Description
  172.   ///   <---------padding--------->Description
  173.   ///
  174.   ///   <padding>VeryVeryLongEntryName
  175.   ///   <---------padding--------->Description
  176.   ///   <---------padding--------->Description
  177.   ///   ^~~~~~~~~InitialPad
  178.   ///            ^~~~~~~~~~~~~~~~~~EntryWidth
  179.   ///   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~MinLineWidth
  180.   static void printFormattedEntry(llvm::raw_ostream &Out,
  181.                                   std::pair<StringRef, StringRef> EntryDescPair,
  182.                                   size_t InitialPad, size_t EntryWidth,
  183.                                   size_t MinLineWidth = 0);
  184.  
  185.   /// Pairs of checker/package name and enable/disable.
  186.   std::vector<std::pair<std::string, bool>> CheckersAndPackages;
  187.  
  188.   /// Vector of checker/package names which will not emit warnings.
  189.   std::vector<std::string> SilencedCheckersAndPackages;
  190.  
  191.   /// A key-value table of use-specified configuration values.
  192.   // TODO: This shouldn't be public.
  193.   ConfigTable Config;
  194.   AnalysisConstraints AnalysisConstraintsOpt = RangeConstraintsModel;
  195.   AnalysisDiagClients AnalysisDiagOpt = PD_HTML;
  196.   AnalysisPurgeMode AnalysisPurgeOpt = PurgeStmt;
  197.  
  198.   std::string AnalyzeSpecificFunction;
  199.  
  200.   /// File path to which the exploded graph should be dumped.
  201.   std::string DumpExplodedGraphTo;
  202.  
  203.   /// Store full compiler invocation for reproducible instructions in the
  204.   /// generated report.
  205.   std::string FullCompilerInvocation;
  206.  
  207.   /// The maximum number of times the analyzer visits a block.
  208.   unsigned maxBlockVisitOnPath;
  209.  
  210.   /// Disable all analyzer checkers.
  211.   ///
  212.   /// This flag allows one to disable analyzer checkers on the code processed by
  213.   /// the given analysis consumer. Note, the code will get parsed and the
  214.   /// command-line options will get checked.
  215.   unsigned DisableAllCheckers : 1;
  216.  
  217.   unsigned ShowCheckerHelp : 1;
  218.   unsigned ShowCheckerHelpAlpha : 1;
  219.   unsigned ShowCheckerHelpDeveloper : 1;
  220.  
  221.   unsigned ShowCheckerOptionList : 1;
  222.   unsigned ShowCheckerOptionAlphaList : 1;
  223.   unsigned ShowCheckerOptionDeveloperList : 1;
  224.  
  225.   unsigned ShowEnabledCheckerList : 1;
  226.   unsigned ShowConfigOptionsList : 1;
  227.   unsigned ShouldEmitErrorsOnInvalidConfigValue : 1;
  228.   unsigned AnalyzeAll : 1;
  229.   unsigned AnalyzerDisplayProgress : 1;
  230.  
  231.   unsigned eagerlyAssumeBinOpBifurcation : 1;
  232.  
  233.   unsigned TrimGraph : 1;
  234.   unsigned visualizeExplodedGraphWithGraphViz : 1;
  235.   unsigned UnoptimizedCFG : 1;
  236.   unsigned PrintStats : 1;
  237.  
  238.   /// Do not re-analyze paths leading to exhausted nodes with a different
  239.   /// strategy. We get better code coverage when retry is enabled.
  240.   unsigned NoRetryExhausted : 1;
  241.  
  242.   /// Emit analyzer warnings as errors.
  243.   bool AnalyzerWerror : 1;
  244.  
  245.   /// The inlining stack depth limit.
  246.   unsigned InlineMaxStackDepth;
  247.  
  248.   /// The mode of function selection used during inlining.
  249.   AnalysisInliningMode InliningMode = NoRedundancy;
  250.  
  251.   // Create a field for each -analyzer-config option.
  252. #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC,        \
  253.                                              SHALLOW_VAL, DEEP_VAL)            \
  254.   ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, SHALLOW_VAL)
  255.  
  256. #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL)                \
  257.   TYPE NAME;
  258.  
  259. #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
  260. #undef ANALYZER_OPTION
  261. #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE
  262.  
  263.   // Create an array of all -analyzer-config command line options. Sort it in
  264.   // the constructor.
  265.   std::vector<llvm::StringLiteral> AnalyzerConfigCmdFlags = {
  266. #define ANALYZER_OPTION_DEPENDS_ON_USER_MODE(TYPE, NAME, CMDFLAG, DESC,        \
  267.                                              SHALLOW_VAL, DEEP_VAL)            \
  268.   ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, SHALLOW_VAL)
  269.  
  270. #define ANALYZER_OPTION(TYPE, NAME, CMDFLAG, DESC, DEFAULT_VAL)                \
  271.   llvm::StringLiteral(CMDFLAG),
  272.  
  273. #include "clang/StaticAnalyzer/Core/AnalyzerOptions.def"
  274. #undef ANALYZER_OPTION
  275. #undef ANALYZER_OPTION_DEPENDS_ON_USER_MODE
  276.   };
  277.  
  278.   bool isUnknownAnalyzerConfig(StringRef Name) const {
  279.     assert(llvm::is_sorted(AnalyzerConfigCmdFlags));
  280.  
  281.     return !std::binary_search(AnalyzerConfigCmdFlags.begin(),
  282.                                AnalyzerConfigCmdFlags.end(), Name);
  283.   }
  284.  
  285.   AnalyzerOptions()
  286.       : DisableAllCheckers(false), ShowCheckerHelp(false),
  287.         ShowCheckerHelpAlpha(false), ShowCheckerHelpDeveloper(false),
  288.         ShowCheckerOptionList(false), ShowCheckerOptionAlphaList(false),
  289.         ShowCheckerOptionDeveloperList(false), ShowEnabledCheckerList(false),
  290.         ShowConfigOptionsList(false),
  291.         ShouldEmitErrorsOnInvalidConfigValue(false), AnalyzeAll(false),
  292.         AnalyzerDisplayProgress(false), eagerlyAssumeBinOpBifurcation(false),
  293.         TrimGraph(false), visualizeExplodedGraphWithGraphViz(false),
  294.         UnoptimizedCFG(false), PrintStats(false), NoRetryExhausted(false),
  295.         AnalyzerWerror(false) {
  296.     llvm::sort(AnalyzerConfigCmdFlags);
  297.   }
  298.  
  299.   /// Interprets an option's string value as a boolean. The "true" string is
  300.   /// interpreted as true and the "false" string is interpreted as false.
  301.   ///
  302.   /// If an option value is not provided, returns the given \p DefaultVal.
  303.   /// @param [in] CheckerName The *full name* of the checker. One may retrieve
  304.   /// this from the checker object's field \c Name, or through \c
  305.   /// CheckerManager::getCurrentCheckerName within the checker's registry
  306.   /// function.
  307.   /// Checker options are retrieved in the following format:
  308.   /// `-analyzer-config CheckerName:OptionName=Value.
  309.   /// @param [in] OptionName Name for option to retrieve.
  310.   /// @param [in] SearchInParents If set to true and the searched option was not
  311.   /// specified for the given checker the options for the parent packages will
  312.   /// be searched as well. The inner packages take precedence over the outer
  313.   /// ones.
  314.   bool getCheckerBooleanOption(StringRef CheckerName, StringRef OptionName,
  315.                                bool SearchInParents = false) const;
  316.  
  317.   bool getCheckerBooleanOption(const ento::CheckerBase *C, StringRef OptionName,
  318.                                bool SearchInParents = false) const;
  319.  
  320.   /// Interprets an option's string value as an integer value.
  321.   ///
  322.   /// If an option value is not provided, returns the given \p DefaultVal.
  323.   /// @param [in] CheckerName The *full name* of the checker. One may retrieve
  324.   /// this from the checker object's field \c Name, or through \c
  325.   /// CheckerManager::getCurrentCheckerName within the checker's registry
  326.   /// function.
  327.   /// Checker options are retrieved in the following format:
  328.   /// `-analyzer-config CheckerName:OptionName=Value.
  329.   /// @param [in] OptionName Name for option to retrieve.
  330.   /// @param [in] SearchInParents If set to true and the searched option was not
  331.   /// specified for the given checker the options for the parent packages will
  332.   /// be searched as well. The inner packages take precedence over the outer
  333.   /// ones.
  334.   int getCheckerIntegerOption(StringRef CheckerName, StringRef OptionName,
  335.                               bool SearchInParents = false) const;
  336.  
  337.   int getCheckerIntegerOption(const ento::CheckerBase *C, StringRef OptionName,
  338.                               bool SearchInParents = false) const;
  339.  
  340.   /// Query an option's string value.
  341.   ///
  342.   /// If an option value is not provided, returns the given \p DefaultVal.
  343.   /// @param [in] CheckerName The *full name* of the checker. One may retrieve
  344.   /// this from the checker object's field \c Name, or through \c
  345.   /// CheckerManager::getCurrentCheckerName within the checker's registry
  346.   /// function.
  347.   /// Checker options are retrieved in the following format:
  348.   /// `-analyzer-config CheckerName:OptionName=Value.
  349.   /// @param [in] OptionName Name for option to retrieve.
  350.   /// @param [in] SearchInParents If set to true and the searched option was not
  351.   /// specified for the given checker the options for the parent packages will
  352.   /// be searched as well. The inner packages take precedence over the outer
  353.   /// ones.
  354.   StringRef getCheckerStringOption(StringRef CheckerName, StringRef OptionName,
  355.                                    bool SearchInParents = false) const;
  356.  
  357.   StringRef getCheckerStringOption(const ento::CheckerBase *C,
  358.                                    StringRef OptionName,
  359.                                    bool SearchInParents = false) const;
  360.  
  361.   ExplorationStrategyKind getExplorationStrategy() const;
  362.   CTUPhase1InliningKind getCTUPhase1Inlining() const;
  363.  
  364.   /// Returns the inter-procedural analysis mode.
  365.   IPAKind getIPAMode() const;
  366.  
  367.   /// Returns the option controlling which C++ member functions will be
  368.   /// considered for inlining.
  369.   ///
  370.   /// This is controlled by the 'c++-inlining' config option.
  371.   ///
  372.   /// \sa CXXMemberInliningMode
  373.   bool mayInlineCXXMemberFunction(CXXInlineableMemberKind K) const;
  374.  
  375.   ento::PathDiagnosticConsumerOptions getDiagOpts() const {
  376.     return {FullCompilerInvocation,
  377.             ShouldDisplayMacroExpansions,
  378.             ShouldSerializeStats,
  379.             // The stable report filename option is deprecated because
  380.             // file names are now always stable. Now the old option acts as
  381.             // an alias to the new verbose filename option because this
  382.             // closely mimics the behavior under the old option.
  383.             ShouldWriteStableReportFilename || ShouldWriteVerboseReportFilename,
  384.             AnalyzerWerror,
  385.             ShouldApplyFixIts,
  386.             ShouldDisplayCheckerNameForText};
  387.   }
  388. };
  389.  
  390. using AnalyzerOptionsRef = IntrusiveRefCntPtr<AnalyzerOptions>;
  391.  
  392. //===----------------------------------------------------------------------===//
  393. // We'll use AnalyzerOptions in the frontend, but we can't link the frontend
  394. // with clangStaticAnalyzerCore, because clangStaticAnalyzerCore depends on
  395. // clangFrontend.
  396. //
  397. // For this reason, implement some methods in this header file.
  398. //===----------------------------------------------------------------------===//
  399.  
  400. inline std::vector<StringRef>
  401. AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental) {
  402.   static constexpr llvm::StringLiteral StaticAnalyzerCheckerNames[] = {
  403. #define GET_CHECKERS
  404. #define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)                 \
  405.   llvm::StringLiteral(FULLNAME),
  406. #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
  407. #undef CHECKER
  408. #undef GET_CHECKERS
  409.   };
  410.   std::vector<StringRef> Checkers;
  411.   for (StringRef CheckerName : StaticAnalyzerCheckerNames) {
  412.     if (!CheckerName.startswith("debug.") &&
  413.         (IncludeExperimental || !CheckerName.startswith("alpha.")))
  414.       Checkers.push_back(CheckerName);
  415.   }
  416.   return Checkers;
  417. }
  418.  
  419. inline std::vector<StringRef>
  420. AnalyzerOptions::getRegisteredPackages(bool IncludeExperimental) {
  421.   static constexpr llvm::StringLiteral StaticAnalyzerPackageNames[] = {
  422. #define GET_PACKAGES
  423. #define PACKAGE(FULLNAME) llvm::StringLiteral(FULLNAME),
  424. #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
  425. #undef PACKAGE
  426. #undef GET_PACKAGES
  427.   };
  428.   std::vector<StringRef> Packages;
  429.   for (StringRef PackageName : StaticAnalyzerPackageNames) {
  430.     if (PackageName != "debug" &&
  431.         (IncludeExperimental || PackageName != "alpha"))
  432.       Packages.push_back(PackageName);
  433.   }
  434.   return Packages;
  435. }
  436.  
  437. } // namespace clang
  438.  
  439. #endif // LLVM_CLANG_STATICANALYZER_CORE_ANALYZEROPTIONS_H
  440.