AnalyzerOptions.h revision bfa9ab8183e2fdc74f8633d758cb0c6201314320
19b414d3e2d0cb84512b55a3275a98490b090162aDaniel Dunbar//===--- AnalyzerOptions.h - Analysis Engine Options ------------*- C++ -*-===// 2e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// 3e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// The LLVM Compiler Infrastructure 4e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// 5e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// This file is distributed under the University of Illinois Open Source 6e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// License. See LICENSE.TXT for details. 7e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// 8e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//===----------------------------------------------------------------------===// 9e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// 105705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek// This header defines various options for the static analyzer that are set 115705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek// by the frontend and are consulted throughout the analyzer. 12e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman// 13e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman//===----------------------------------------------------------------------===// 14e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 155705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek#ifndef LLVM_CLANG_ANALYZEROPTIONS_H 165705a40c7ec62f1a903bf26e1e6a7f91b5b98ba3Ted Kremenek#define LLVM_CLANG_ANALYZEROPTIONS_H 175746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar 1881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose#include "clang/Basic/LLVM.h" 1945796b10d11869e86c6b85e24df165410536b313Ted Kremenek#include "llvm/ADT/IntrusiveRefCntPtr.h" 2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/Optional.h" 217229d0011766c174beffe6a846d78f448f845b39Anna Zaks#include "llvm/ADT/StringMap.h" 2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <string> 2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <vector> 24e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 25e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmannamespace clang { 26e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass ASTConsumer; 27d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieclass DiagnosticsEngine; 28e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass Preprocessor; 29e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanclass LangOptions; 30e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 31e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// Analysis - Set of available source code analyses. 32e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum Analyses { 33e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS(NAME, CMDFLAG, DESC, SCOPE) NAME, 34987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 35e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumAnalyses 36e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}; 37e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 38e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisStores - Set of available analysis store models. 39e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisStores { 40e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_STORE(NAME, CMDFLAG, DESC, CREATFN) NAME##Model, 41987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 42e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumStores 43e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}; 44e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 45e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisConstraints - Set of available constraint models. 46e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisConstraints { 47e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_CONSTRAINTS(NAME, CMDFLAG, DESC, CREATFN) NAME##Model, 48987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 49e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNumConstraints 50e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}; 51e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 52e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// AnalysisDiagClients - Set of available diagnostic clients for rendering 53e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman/// analysis results. 54e1718aff224e7da84720beb42a39362199ca83f3Eli Friedmanenum AnalysisDiagClients { 55e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman#define ANALYSIS_DIAGNOSTICS(NAME, CMDFLAG, DESC, CREATFN, AUTOCREAT) PD_##NAME, 56987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 57e1718aff224e7da84720beb42a39362199ca83f3Eli FriedmanNUM_ANALYSIS_DIAG_CLIENTS 58e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}; 59e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman 60d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks/// AnalysisPurgeModes - Set of available strategies for dead symbol removal. 61d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaksenum AnalysisPurgeMode { 62d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks#define ANALYSIS_PURGE(NAME, CMDFLAG, DESC) NAME, 63987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 64d30952838421ddfb9f7e346b2ba8213889a5f789Anna ZaksNumPurgeModes 65d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks}; 66d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks 6766253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks/// AnalysisInlineFunctionSelection - Set of inlining function selection heuristics. 6866253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaksenum AnalysisInliningMode { 6966253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks#define ANALYSIS_INLINING_MODE(NAME, CMDFLAG, DESC) NAME, 70987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/Analyses.def" 7166253352131e3e7a22b3bfd0e180607aa2bfb988Anna ZaksNumInliningModes 7266253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks}; 7366253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks 74de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// \brief Describes the different kinds of C++ member functions which can be 75de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// considered for inlining by the analyzer. 76de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// 77de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// These options are cumulative; enabling one kind of member function will 78de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose/// enable all kinds with lower enum values. 79de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseenum CXXInlineableMemberKind { 80de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose // Uninitialized = 0, 81de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 82de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// A dummy mode in which no C++ inlining is enabled. 83de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CIMK_None = 1, 84de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 85de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Refers to regular member function and operator calls. 86de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CIMK_MemberFunctions, 87de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 88de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Refers to constructors (implicit or explicit). 89de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// 90de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Note that a constructor will not be inlined if the corresponding 91de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// destructor is non-trivial. 92de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CIMK_Constructors, 93de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 94de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Refers to destructors (implicit or explicit). 95de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CIMK_Destructors 96de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose}; 97de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 98bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks/// \brief Describes the different modes of inter-procedural analysis. 99bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaksenum IPAKind { 100bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_NotSet = 0, 101bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 102bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Perform only intra-procedural analysis. 103bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_None = 1, 104bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 105bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Inline C functions and blocks when their definitions are available. 106bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_BasicInlining = 2, 107bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 108bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Inline callees when their definitions are available. 109bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks // TODO: How is this different from BasicInlining? 110bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_Inlining = 3, 111bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 112bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Enable inlining of dynamically dispatched methods. 113bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_DynamicDispatch = 4, 114bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 115bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Enable inlining of dynamically dispatched methods, bifurcate paths when 116bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// exact type info is unavailable. 117bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAK_DynamicDispatchBifurcate = 5 118bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks}; 119de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 120cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkoclass AnalyzerOptions : public RefCountedBase<AnalyzerOptions> { 121918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic: 122255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek typedef llvm::StringMap<std::string> ConfigTable; 123255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 12443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis /// \brief Pair of checker name and enable/disable. 12543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis std::vector<std::pair<std::string, bool> > CheckersControlList; 126255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 127255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief A key-value table of use-specified configuration values. 128255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek ConfigTable Config; 129e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman AnalysisStores AnalysisStoreOpt; 130e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman AnalysisConstraints AnalysisConstraintsOpt; 131e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman AnalysisDiagClients AnalysisDiagOpt; 132d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks AnalysisPurgeMode AnalysisPurgeOpt; 133255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 134e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman std::string AnalyzeSpecificFunction; 135255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 136255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The maximum number of exploded nodes the analyzer will generate. 137c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu unsigned MaxNodes; 138255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 139255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The maximum number of times the analyzer visits a block. 1402fa9d72d4d23ccdcd4137946e5ebafac7a04f04cTed Kremenek unsigned maxBlockVisitOnPath; 141255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 142255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 143116f3640daee424dfcdbe55e80be5a67476be4b0Argyrios Kyrtzidis unsigned ShowCheckerHelp : 1; 144918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar unsigned AnalyzeAll : 1; 145918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar unsigned AnalyzerDisplayProgress : 1; 146fc576514d06c46a7cac49500169411d82f38d04bTed Kremenek unsigned AnalyzeNestedBlocks : 1; 147255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 148255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The flag regulates if we should eagerly assume evaluations of 149255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// conditionals, thus, bifurcating the path. 150255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// 1510caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// This flag indicates how the engine should handle expressions such as: 'x = 1520caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// (y != 0)'. When this flag is true then the subexpression 'y != 0' will be 1530caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// eagerly assumed to be true or false, thus evaluating it to the integers 0 1540caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// or 1 respectively. The upside is that this can increase analysis 1550caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// precision until we have a better way to lazily evaluate such logic. The 1560caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek /// downside is that it eagerly bifurcates paths. 1570caa2d47b84337e942b3f6652adfafe4ae506cfeTed Kremenek unsigned eagerlyAssumeBinOpBifurcation : 1; 158255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 159918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbar unsigned TrimGraph : 1; 1603b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek unsigned visualizeExplodedGraphWithGraphViz : 1; 1613b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek unsigned visualizeExplodedGraphWithUbiGraph : 1; 1629b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek unsigned UnoptimizedCFG : 1; 16381fb169f42769e02c7425b23885a261c025fd5e6Anna Zaks unsigned PrintStats : 1; 164255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 165255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief Do not re-analyze paths leading to exhausted nodes with a different 166255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// strategy. We get better code coverage when retry is enabled. 167b47dbcbc12430fdf3e5a5b9f59cdec5480e89e75Anna Zaks unsigned NoRetryExhausted : 1; 168255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 169255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The inlining stack depth limit. 1708235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks unsigned InlineMaxStackDepth; 171255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 172255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The mode of function selection used during inlining. 1738235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks unsigned InlineMaxFunctionSize; 174255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek 175255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek /// \brief The mode of function selection used during inlining. 17666253352131e3e7a22b3bfd0e180607aa2bfb988Anna Zaks AnalysisInliningMode InliningMode; 1777b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu 178de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Roseprivate: 179bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// Controls the mode of inter-procedural analysis. 180bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAKind IPAMode; 181bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 182de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Controls which C++ member functions will be considered for inlining. 183de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose CXXInlineableMemberKind CXXMemberInliningMode; 18481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 185978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// \sa includeTemporaryDtorsInCFG 18681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose llvm::Optional<bool> IncludeTemporaryDtorsInCFG; 187978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose 188978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// \sa mayInlineCXXStandardLibrary 18981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose llvm::Optional<bool> InlineCXXStandardLibrary; 190978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose 191978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// \sa mayInlineTemplateFunctions 19281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose llvm::Optional<bool> InlineTemplateFunctions; 1937229d0011766c174beffe6a846d78f448f845b39Anna Zaks 19457330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks /// \sa mayInlineObjCMethod 19557330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks llvm::Optional<bool> ObjCInliningMode; 19657330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks 1977229d0011766c174beffe6a846d78f448f845b39Anna Zaks // Cache of the "ipa-always-inline-size" setting. 1987229d0011766c174beffe6a846d78f448f845b39Anna Zaks // \sa getAlwaysInlineSize 1997229d0011766c174beffe6a846d78f448f845b39Anna Zaks llvm::Optional<unsigned> AlwaysInlineSize; 200b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose 201b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// \sa shouldPruneNullReturnPaths 202b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose llvm::Optional<bool> PruneNullReturnPaths; 203b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose 2046a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// \sa shouldAvoidSuppressingNullArgumentPaths 2056a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose llvm::Optional<bool> AvoidSuppressingNullArgumentPaths; 2066a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose 2074d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// \sa getGraphTrimInterval 2084d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose llvm::Optional<unsigned> GraphTrimInterval; 2094d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose 2107959671d456c916706a5f61af609d8f1fc95decfAnna Zaks /// \sa getMaxTimesInlineLarge 2117959671d456c916706a5f61af609d8f1fc95decfAnna Zaks llvm::Optional<unsigned> MaxTimesInlineLarge; 2127959671d456c916706a5f61af609d8f1fc95decfAnna Zaks 213978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// Interprets an option's string value as a boolean. 214978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// 215978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// Accepts the strings "true" and "false". 216978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// If an option value is not provided, returns the given \p DefaultVal. 217622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool getBooleanOption(StringRef Name, bool DefaultVal); 218de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 21948d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek /// Variant that accepts a Optional value to cache the result. 22048d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek bool getBooleanOption(llvm::Optional<bool> &V, StringRef Name, 22148d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek bool DefaultVal); 22248d05e6d776f4b68f3db4016eb5680ac041c2b7dTed Kremenek 2237229d0011766c174beffe6a846d78f448f845b39Anna Zaks /// Interprets an option's string value as an integer value. 224cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko int getOptionAsInteger(StringRef Name, int DefaultVal); 2257229d0011766c174beffe6a846d78f448f845b39Anna Zaks 226de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rosepublic: 227bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks /// \brief Returns the inter-procedural analysis mode. 228bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks IPAKind getIPAMode(); 22973f0563009a6715a5d3d41f664f5bfab5096d51fAnna Zaks 230de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// Returns the option controlling which C++ member functions will be 231de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// considered for inlining. 232de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// 2335a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose /// This is controlled by the 'c++-inlining' config option. 2345a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose /// 235de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose /// \sa CXXMemberInliningMode 2369e28fe60bbfa5de196ce4aa396210bf10fc5c266Ted Kremenek bool mayInlineCXXMemberFunction(CXXInlineableMemberKind K); 237de5277fc555551857602bd7a7e5e616274e2d4a6Jordan Rose 23857330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks /// Returns true if ObjectiveC inlining is enabled, false otherwise. 239622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool mayInlineObjCMethod(); 24057330eed3fbe530cb05996e4a346cc5fc217c0d9Anna Zaks 2415a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose /// Returns whether or not the destructors for C++ temporary objects should 2425a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose /// be included in the CFG. 2435a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose /// 244978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// This is controlled by the 'cfg-temporary-dtors' config option, which 245978869aa6e31a4bc6afdf5446ffb717aad3f7d97Jordan Rose /// accepts the values "true" and "false". 246622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool includeTemporaryDtorsInCFG(); 2475a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose 24881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// Returns whether or not C++ standard library functions may be considered 24981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// for inlining. 25081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// 25181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// This is controlled by the 'c++-stdlib-inlining' config option, which 25281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// accepts the values "true" and "false". 253622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool mayInlineCXXStandardLibrary(); 25481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 25581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// Returns whether or not templated functions may be considered for inlining. 25681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// 25781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// This is controlled by the 'c++-template-inlining' config option, which 25881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose /// accepts the values "true" and "false". 259622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool mayInlineTemplateFunctions(); 26081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose 261b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// Returns whether or not paths that go through null returns should be 262b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// suppressed. 263b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// 264b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// This is a heuristic for avoiding bug reports with paths that go through 265b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// inlined functions that are more defensive than their callers. 266b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// 267b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// This is controlled by the 'suppress-null-return-paths' config option, 268b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose /// which accepts the values "true" and "false". 269622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool shouldPruneNullReturnPaths(); 270b9d4e5e3bb235f1149e99d3c833ff7cb3474c9f1Jordan Rose 2716a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// Returns whether a bug report should \em not be suppressed if its path 2726a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// includes a call with a null argument, even if that call has a null return. 2736a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// 2746a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// This option has no effect when #shouldPruneNullReturnPaths() is false. 2756a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// 2766a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// This is a counter-heuristic to avoid false negatives. 2776a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// 2786a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// This is controlled by the 'avoid-suppressing-null-argument-paths' config 2796a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose /// option, which accepts the values "true" and "false". 2806a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose bool shouldAvoidSuppressingNullArgumentPaths(); 2816a329ee7567cf3267ffab2bc755ea8c773d967e7Jordan Rose 2827229d0011766c174beffe6a846d78f448f845b39Anna Zaks // Returns the size of the functions (in basic blocks), which should be 2837229d0011766c174beffe6a846d78f448f845b39Anna Zaks // considered to be small enough to always inline. 2847229d0011766c174beffe6a846d78f448f845b39Anna Zaks // 2857229d0011766c174beffe6a846d78f448f845b39Anna Zaks // This is controlled by "ipa-always-inline-size" analyzer-config option. 28694bb74cef72a33d77c5d6739abfc0840c781eb8eTed Kremenek unsigned getAlwaysInlineSize(); 287a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 288a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// Returns true if the analyzer engine should synthesize fake bodies 289a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek /// for well-known functions. 290622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek bool shouldSynthesizeBodies(); 2917229d0011766c174beffe6a846d78f448f845b39Anna Zaks 2924d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// Returns how often nodes in the ExplodedGraph should be recycled to save 2934d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// memory. 2944d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// 2954d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// This is controlled by the 'graph-trim-interval' config option. To disable 2964d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose /// node reclamation, set the option to "0". 2974d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose unsigned getGraphTrimInterval(); 2984d9e497a2b1eab3b1214848216050c64fc3acfd6Jordan Rose 2997959671d456c916706a5f61af609d8f1fc95decfAnna Zaks /// Returns the maximum times a large function could be inlined. 3007959671d456c916706a5f61af609d8f1fc95decfAnna Zaks /// 3017959671d456c916706a5f61af609d8f1fc95decfAnna Zaks /// This is controlled by the 'max-times-inline-large' config option. 3027959671d456c916706a5f61af609d8f1fc95decfAnna Zaks unsigned getMaxTimesInlineLarge(); 3037959671d456c916706a5f61af609d8f1fc95decfAnna Zaks 304918ac48e315d42fed7fe856a3fce70d9d930cdcdDaniel Dunbarpublic: 305bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalyzerOptions() : 306bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalysisStoreOpt(RegionStoreModel), 307bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalysisConstraintsOpt(RangeConstraintsModel), 308bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalysisDiagOpt(PD_HTML), 309bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalysisPurgeOpt(PurgeStmt), 310bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks ShowCheckerHelp(0), 311bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalyzeAll(0), 312bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalyzerDisplayProgress(0), 313bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks AnalyzeNestedBlocks(0), 314bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks eagerlyAssumeBinOpBifurcation(0), 315bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks TrimGraph(0), 316bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks visualizeExplodedGraphWithGraphViz(0), 317bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks visualizeExplodedGraphWithUbiGraph(0), 318bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks UnoptimizedCFG(0), 319bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks PrintStats(0), 320bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks NoRetryExhausted(0), 3218235f9c9c8b3d1737d1c6bd57f7ba3f616b92392Anna Zaks // Cap the stack depth at 4 calls (5 stack frames, base + 4 calls). 322bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks InlineMaxStackDepth(5), 323bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks InlineMaxFunctionSize(50), 324bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks InliningMode(NoRedundancy), 325bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks CXXMemberInliningMode() {} 326bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks 327e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman}; 32845796b10d11869e86c6b85e24df165410536b313Ted Kremenek 329cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenkotypedef IntrusiveRefCntPtr<AnalyzerOptions> AnalyzerOptionsRef; 33045796b10d11869e86c6b85e24df165410536b313Ted Kremenek 331e1718aff224e7da84720beb42a39362199ca83f3Eli Friedman} 3325746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar 3335746f1ff6286f5e5bd7fc28e5e2031f18e4676c9Daniel Dunbar#endif 334