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: &filesMade); |
62 | } |
63 | } |
64 | |