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 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ANALYSISMANAGER_H 17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 181309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Analysis/AnalysisContext.h" 19987695a5ddd78beca784d4e503ffbc2dc879181aTed Kremenek#include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" 209b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h" 219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h" 22c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h" 23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 24fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang { 25fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass CodeInjector; 27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 289ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento { 2943dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis class CheckerManager; 305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 31fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData { 3299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 331d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContextManager AnaCtxMgr; 34fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 35fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ASTContext &Ctx; 36d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie DiagnosticsEngine &Diags; 374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &LangOpts; 38c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek PathDiagnosticConsumers PathConsumers; 39d07a0d0279c09d1017f8450fce575a94dc9703c0Zhongxing Xu 40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu // Configurable components creators. 41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator CreateStoreMgr; 42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator CreateConstraintMgr; 43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 4443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis CheckerManager *CheckerMgr; 4543dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 46fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic: 47622b6fb0a1d280c16e135c7e427b79cafffbde1fTed Kremenek AnalyzerOptions &options; 487b73e0832b20af1f43601a3d19e76d02d9f4dce5Ted Kremenek 49c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek AnalysisManager(ASTContext &ctx,DiagnosticsEngine &diags, 50c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek const LangOptions &lang, 51c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek const PathDiagnosticConsumers &Consumers, 52fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator storemgr, 53c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu ConstraintManagerCreator constraintmgr, 5443dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis CheckerManager *checkerMgr, 55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines AnalyzerOptions &Options, 56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines CodeInjector* injector = nullptr); 574fed22cdd8bb7d98127853ebb3f42be66bf2ce59Ted Kremenek 5833337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar ~AnalysisManager() override; 5933337ca4d89605025818daf83390ab4271d598d9Pirama Arumuga Nainar 6058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek void ClearContexts() { 6158f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek AnaCtxMgr.clear(); 6258f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek } 639b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek 641d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContextManager& getAnalysisDeclContextManager() { 659b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek return AnaCtxMgr; 669b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek } 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu StoreManagerCreator getStoreManagerCreator() { 69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateStoreMgr; 707177dee8aee4b432911c91f1b788963bec0cac9fDaniel Dunbar } 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines AnalyzerOptions& getAnalyzerOptions() override { 73d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks return options; 74d95b70175646829c26344d5f0bda1ec3009f2a5bAnna Zaks } 75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu ConstraintManagerCreator getConstraintManagerCreator() { 77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return CreateConstraintMgr; 78fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 8043dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis CheckerManager *getCheckerManager() const { return CheckerMgr; } 8143dee220252ef0b42c5f8a3bb1eca97f84f2565fArgyrios Kyrtzidis 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTContext &getASTContext() override { 83fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Ctx; 84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines SourceManager &getSourceManager() override { 875032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu return getASTContext().getSourceManager(); 88fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DiagnosticsEngine &getDiagnostic() override { 91fda7832b000ff8927386f093b52c067641679469Zhongxing Xu return Diags; 92fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie const LangOptions &getLangOpts() const { 954e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie return LangOpts; 96fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ArrayRef<PathDiagnosticConsumer*> getPathDiagnosticConsumers() override { 99c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek return PathConsumers; 100b01f06ca72362d527bb65fbf018ac53df575ded1Ted Kremenek } 10118c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 102c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek void FlushDiagnostics(); 103c4bac8e376b98d633bb00ee5f510d5e58449753cTed Kremenek 104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu bool shouldVisualize() const { 1053b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek return options.visualizeExplodedGraphWithGraphViz || 1063b8a04004afa46057a9af4afbd086be71d619793Ted Kremenek options.visualizeExplodedGraphWithUbiGraph; 107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu } 108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 109255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek bool shouldInlineCall() const { 110bfa9ab8183e2fdc74f8633d758cb0c6201314320Anna Zaks return options.getIPAMode() != IPAK_None; 111255d4d4226b24036ceb11228fbb74286e58620f7Ted Kremenek } 1127b99d12b4ca67fccdf5090761ba257732e954e75Zhongxing Xu 113b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu CFG *getCFG(Decl const *D) { 114b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu return AnaCtxMgr.getContext(D)->getCFG(); 115b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu } 116b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu 117a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek template <typename T> 118a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek T *getAnalysis(Decl const *D) { 119a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek return AnaCtxMgr.getContext(D)->getAnalysis<T>(); 120b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu } 121b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu 122b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu ParentMap &getParentMap(Decl const *D) { 123b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu return AnaCtxMgr.getContext(D)->getParentMap(); 124b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu } 125b317f8f5ca8737a5bbad97a3f7566a2dbd2ed61bZhongxing Xu 1261d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *getAnalysisDeclContext(const Decl *D) { 127c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu return AnaCtxMgr.getContext(D); 128c6238d2786cfd961b94580b3d3675a1b3ff0721cZhongxing Xu } 129fda7832b000ff8927386f093b52c067641679469Zhongxing Xu}; 130fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 131b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} // enAnaCtxMgrspace 1325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis 1335a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end clang namespace 134fda7832b000ff8927386f093b52c067641679469Zhongxing Xu 135fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif 136