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 11using namespace clang; 12using namespace ento; 13 14void AnalysisManager::anchor() { } 15 16AnalysisManager::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 51AnalysisManager::~AnalysisManager() { 52 FlushDiagnostics(); 53 for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(), 54 E = PathConsumers.end(); I != E; ++I) { 55 delete *I; 56 } 57} 58 59void AnalysisManager::FlushDiagnostics() { 60 PathDiagnosticConsumer::FilesMade filesMade; 61 for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(), 62 E = PathConsumers.end(); 63 I != E; ++I) { 64 (*I)->FlushDiagnostics(&filesMade); 65 } 66} 67