AnalysisManager.cpp revision 360784
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,
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), 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