]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/StaticAnalyzer/Core/CheckerManager.cpp
Vendor import of clang trunk r126079:
[FreeBSD/FreeBSD.git] / lib / StaticAnalyzer / Core / CheckerManager.cpp
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
18 using namespace clang;
19 using namespace ento;
20
21 void 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
49 void 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
60 void CheckerManager::_registerForDecl(CheckerRef checker, CheckDeclFunc checkfn,
61                                       HandlesDeclFunc isForDeclFn) {
62   DeclCheckerInfo info = { checker, checkfn, isForDeclFn };
63   DeclCheckers.push_back(info);
64 }
65
66 void CheckerManager::_registerForBody(CheckerRef checker,
67                                       CheckDeclFunc checkfn) {
68   BodyCheckers.push_back(std::make_pair(checker, checkfn));
69 }
70
71 void CheckerManager::registerCheckersToEngine(ExprEngine &eng) {
72   for (unsigned i = 0, e = Funcs.size(); i != e; ++i)
73     Funcs[i](eng);
74 }
75
76 CheckerManager::~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.
85 CheckerProvider::~CheckerProvider() { }