AnalysisManager.h revision 99ba9e3bd70671f3441fb974895f226a83ce0e66
1bb8e6488bda12b41b32fc22397a44510cacdac50Zhongxing Xu//== AnalysisManager.h - Path sensitive analysis data manager ------*- C++ -*-//
2fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
3fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//                     The LLVM Compiler Infrastructure
4fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
5fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file is distributed under the University of Illinois Open Source
6fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// License. See LICENSE.TXT for details.
7fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
8fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
9fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
10fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file defines the AnalysisManager class that manages the data and policy
11fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// for path sensitive analysis.
12fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
13fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
14fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_ANALYSISMANAGER_H
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_ANALYSISMANAGER_H
17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
181309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Analysis/AnalysisContext.h"
19d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks#include "clang/Frontend/AnalyzerOptions.h"
209b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
22fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
23fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang {
24fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
25c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xunamespace idx {
26c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  class Indexer;
27c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  class TranslationUnit;
28c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu}
29c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
309ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
3143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  class CheckerManager;
325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
33fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData {
3499ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
351d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager AnaCtxMgr;
36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
37fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ASTContext &Ctx;
38d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  DiagnosticsEngine &Diags;
39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &LangInfo;
40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
41ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikie  llvm::OwningPtr<PathDiagnosticConsumer> PD;
42d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu
43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  // Configurable components creators.
44fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator CreateStoreMgr;
45fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator CreateConstraintMgr;
46fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
4743dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *CheckerMgr;
4843dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
49c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// \brief Provide function definitions in other translation units. This is
50c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// NULL if we don't have multiple translation units. AnalysisManager does
51c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  /// not own the Indexer.
52c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  idx::Indexer *Idxer;
53c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
54fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
566362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu  // The maximum number of exploded nodes the analyzer will generate.
57c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu  unsigned MaxNodes;
58c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu
5968625cf3eef2a6948fe42134aeeda91ed15e63d3Tom Care  // The maximum number of times the analyzer visit a block.
6068625cf3eef2a6948fe42134aeeda91ed15e63d3Tom Care  unsigned MaxVisit;
616362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu
62fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGDot;
63fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGUbi;
64d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  AnalysisPurgeMode PurgeDead;
655032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu
665032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  /// EargerlyAssume - A flag indicating how the engine should handle
675032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   expressions such as: 'x = (y != 0)'.  When this flag is true then
685032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   the subexpression 'y != 0' will be eagerly assumed to be true or false,
695032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   thus evaluating it to the integers 0 or 1 respectively.  The upside
705032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   is that this can increase analysis precision until we have a better way
715032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   to lazily evaluate such logic.  The downside is that it eagerly
725032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  //   bifurcates paths.
73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool EagerlyAssume;
74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool TrimGraph;
757b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu  bool InlineCall;
76d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek  bool EagerlyTrimEGraph;
77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
78fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic:
79d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
80ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikie                  const LangOptions &lang, PathDiagnosticConsumer *pd,
81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
82c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  ConstraintManagerCreator constraintmgr,
8343dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis                  CheckerManager *checkerMgr,
84c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu                  idx::Indexer *idxer,
8568625cf3eef2a6948fe42134aeeda91ed15e63d3Tom Care                  unsigned maxnodes, unsigned maxvisit,
86d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks                  bool vizdot, bool vizubi, AnalysisPurgeMode purge,
87d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks                  bool eager, bool trim,
889121ba232903ebe61e7bbe14ca294cf0f07dfa96Marcin Swiderski                  bool inlinecall, bool useUnoptimizedCFG,
89d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek                  bool addImplicitDtors, bool addInitializers,
904fed22cdd8bb7d98127853ebb3f42be66bf2ce59Ted Kremenek                  bool eagerlyTrimEGraph);
914fed22cdd8bb7d98127853ebb3f42be66bf2ce59Ted Kremenek
92d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  /// Construct a clone of the given AnalysisManager with the given ASTContext
93d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  /// and DiagnosticsEngine.
94d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
95d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks                  AnalysisManager &ParentAM);
96d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks
97b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  ~AnalysisManager() { FlushDiagnostics(); }
98b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek
9958f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  void ClearContexts() {
10058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek    AnaCtxMgr.clear();
10158f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek  }
1029b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek
1031d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContextManager& getAnalysisDeclContextManager() {
1049b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek    return AnaCtxMgr;
1059b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek  }
1061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator getStoreManagerCreator() {
108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateStoreMgr;
1097177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar  }
110fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
111fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
112fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
113fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis  CheckerManager *getCheckerManager() const { return CheckerMgr; }
11643dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis
1172ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  idx::Indexer *getIndexer() const { return Idxer; }
1182ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu
1195032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu  virtual ASTContext &getASTContext() {
120fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
121fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual SourceManager &getSourceManager() {
1245032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    return getASTContext().getSourceManager();
125fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
127d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  virtual DiagnosticsEngine &getDiagnostic() {
128fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
129fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
131fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &getLangOptions() const {
132fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return LangInfo;
133fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
1341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
135ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikie  virtual PathDiagnosticConsumer *getPathDiagnosticConsumer() {
1361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return PD.get();
137fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
138b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek
139b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  void FlushDiagnostics() {
140b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek    if (PD.get())
141b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek      PD->FlushDiagnostics();
142b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek  }
14318c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu
144c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu  unsigned getMaxNodes() const { return MaxNodes; }
145c09289d104b8e01ecd998e3f08b2b0561049e1dcZhongxing Xu
14668625cf3eef2a6948fe42134aeeda91ed15e63d3Tom Care  unsigned getMaxVisit() const { return MaxVisit; }
1476362b893731ccf4480a96527db9e55e04b801503Zhongxing Xu
148fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
149fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
150fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
151fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
152fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
153fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return VisualizeEGDot || VisualizeEGUbi;
154fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
155fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
156d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek  bool shouldEagerlyTrimExplodedGraph() const { return EagerlyTrimEGraph; }
157d767d81290288c030f3be0be1d3e62b9c8df51dcTed Kremenek
158fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldTrimGraph() const { return TrimGraph; }
159fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
160d30952838421ddfb9f7e346b2ba8213889a5f789Anna Zaks  AnalysisPurgeMode getPurgeMode() const { return PurgeDead; }
161fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
162fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldEagerlyAssume() const { return EagerlyAssume; }
163fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
1647b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu  bool shouldInlineCall() const { return InlineCall; }
1657b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu
166c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  bool hasIndexer() const { return Idxer != 0; }
167c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
1681d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContextInAnotherTU(const Decl *D);
169c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
170b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  CFG *getCFG(Decl const *D) {
171b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getCFG();
172b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
173b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
174a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  template <typename T>
175a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek  T *getAnalysis(Decl const *D) {
176a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek    return AnaCtxMgr.getContext(D)->getAnalysis<T>();
177b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
178b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
179b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  ParentMap &getParentMap(Decl const *D) {
180b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu    return AnaCtxMgr.getContext(D)->getParentMap();
181b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu  }
182b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu
1831d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) {
184c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu    return AnaCtxMgr.getContext(D);
185c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu  }
186c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu
1871d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek  AnalysisDeclContext *getAnalysisDeclContext(const Decl *D, idx::TranslationUnit *TU) {
1882ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    return AnaCtxMgr.getContext(D, TU);
1892ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu  }
1902ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu
191fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
192fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
193b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} // enAnaCtxMgrspace
1945a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
1955a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end clang namespace
196fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
197fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
198