CheckerManager.cpp revision 218887
1//===--- CheckerManager.cpp - Static Analyzer Checker Manager -------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Defines the Static Analyzer Checker Manager.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/StaticAnalyzer/Core/CheckerManager.h"
15#include "clang/StaticAnalyzer/Core/CheckerProvider.h"
16#include "clang/AST/DeclBase.h"
17
18using namespace clang;
19using namespace ento;
20
21void CheckerManager::runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr,
22                                          BugReporter &BR) {
23  assert(D);
24
25  unsigned DeclKind = D->getKind();
26  CachedDeclCheckers *checkers = 0;
27  CachedDeclCheckersMapTy::iterator CCI = CachedDeclCheckersMap.find(DeclKind);
28  if (CCI != CachedDeclCheckersMap.end()) {
29    checkers = &(CCI->second);
30  } else {
31    // Find the checkers that should run for this Decl and cache them.
32    checkers = &CachedDeclCheckersMap[DeclKind];
33    for (unsigned i = 0, e = DeclCheckers.size(); i != e; ++i) {
34      DeclCheckerInfo &info = DeclCheckers[i];
35      if (info.IsForDeclFn(D))
36        checkers->push_back(std::make_pair(info.Checker, info.CheckFn));
37    }
38  }
39
40  assert(checkers);
41  for (CachedDeclCheckers::iterator
42         I = checkers->begin(), E = checkers->end(); I != E; ++I) {
43    CheckerRef checker = I->first;
44    CheckDeclFunc fn = I->second;
45    fn(checker, D, mgr, BR);
46  }
47}
48
49void CheckerManager::runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr,
50                                          BugReporter &BR) {
51  assert(D && D->hasBody());
52
53  for (unsigned i = 0, e = BodyCheckers.size(); i != e; ++i) {
54    CheckerRef checker = BodyCheckers[i].first;
55    CheckDeclFunc fn = BodyCheckers[i].second;
56    fn(checker, D, mgr, BR);
57  }
58}
59
60void CheckerManager::_registerForDecl(CheckerRef checker, CheckDeclFunc checkfn,
61                                      HandlesDeclFunc isForDeclFn) {
62  DeclCheckerInfo info = { checker, checkfn, isForDeclFn };
63  DeclCheckers.push_back(info);
64}
65
66void CheckerManager::_registerForBody(CheckerRef checker,
67                                      CheckDeclFunc checkfn) {
68  BodyCheckers.push_back(std::make_pair(checker, checkfn));
69}
70
71void CheckerManager::registerCheckersToEngine(ExprEngine &eng) {
72  for (unsigned i = 0, e = Funcs.size(); i != e; ++i)
73    Funcs[i](eng);
74}
75
76CheckerManager::~CheckerManager() {
77  for (unsigned i = 0, e = Checkers.size(); i != e; ++i) {
78    CheckerRef checker = Checkers[i].first;
79    Dtor dtor = Checkers[i].second;
80    dtor(checker);
81  }
82}
83
84// Anchor for the vtable.
85CheckerProvider::~CheckerProvider() { }
86