1 //===-- AnalysisManager.cpp -------------------------------------*- 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 #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h" 10 11 using namespace clang; 12 using namespace ento; 13 14 void AnalysisManager::anchor() { } 15 16 AnalysisManager::AnalysisManager(ASTContext &ASTCtx, Preprocessor &PP, 17 const PathDiagnosticConsumers &PDC, 18 StoreManagerCreator storemgr, 19 ConstraintManagerCreator constraintmgr, 20 CheckerManager *checkerMgr, 21 AnalyzerOptions &Options, 22 CodeInjector *injector) 23 : AnaCtxMgr( 24 ASTCtx, Options.UnoptimizedCFG, 25 Options.ShouldIncludeImplicitDtorsInCFG, 26 /*addInitializers=*/true, 27 Options.ShouldIncludeTemporaryDtorsInCFG, 28 Options.ShouldIncludeLifetimeInCFG, 29 // Adding LoopExit elements to the CFG is a requirement for loop 30 // unrolling. 31 Options.ShouldIncludeLoopExitInCFG || 32 Options.ShouldUnrollLoops, 33 Options.ShouldIncludeScopesInCFG, 34 Options.ShouldSynthesizeBodies, 35 Options.ShouldConditionalizeStaticInitializers, 36 /*addCXXNewAllocator=*/true, 37 Options.ShouldIncludeRichConstructorsInCFG, 38 Options.ShouldElideConstructors, 39 /*addVirtualBaseBranches=*/true, 40 injector), 41 Ctx(ASTCtx), PP(PP), LangOpts(ASTCtx.getLangOpts()), 42 PathConsumers(PDC), CreateStoreMgr(storemgr), 43 CreateConstraintMgr(constraintmgr), CheckerMgr(checkerMgr), 44 options(Options) { 45 AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd(); 46 AnaCtxMgr.getCFGBuildOptions().OmitImplicitValueInitializers = true; 47 AnaCtxMgr.getCFGBuildOptions().AddCXXDefaultInitExprInAggregates = 48 Options.ShouldIncludeDefaultInitForAggregates; 49 } 50 51 AnalysisManager::~AnalysisManager() { 52 FlushDiagnostics(); 53 for (PathDiagnosticConsumer *Consumer : PathConsumers) { 54 delete Consumer; 55 } 56 } 57 58 void AnalysisManager::FlushDiagnostics() { 59 PathDiagnosticConsumer::FilesMade filesMade; 60 for (PathDiagnosticConsumer *Consumer : PathConsumers) { 61 Consumer->FlushDiagnostics(&filesMade); 62 } 63 } 64