[analyzer]
[clang.git] / lib / StaticAnalyzer / Core / CheckerManager.cpp
blob1989b822ae408ac8bcbbae26a3fa3a8286b35e09
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.
12 //===----------------------------------------------------------------------===//
14 #include "clang/StaticAnalyzer/Core/CheckerManager.h"
15 #include "clang/StaticAnalyzer/Core/CheckerProvider.h"
16 #include "clang/AST/DeclBase.h"
18 using namespace clang;
19 using namespace ento;
21 void CheckerManager::runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr,
22 BugReporter &BR) {
23 assert(D);
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));
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);
49 void CheckerManager::runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr,
50 BugReporter &BR) {
51 assert(D && D->hasBody());
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);
60 void CheckerManager::_registerForDecl(CheckerRef checker, CheckDeclFunc checkfn,
61 HandlesDeclFunc isForDeclFn) {
62 DeclCheckerInfo info = { checker, checkfn, isForDeclFn };
63 DeclCheckers.push_back(info);
66 void CheckerManager::_registerForBody(CheckerRef checker,
67 CheckDeclFunc checkfn) {
68 BodyCheckers.push_back(std::make_pair(checker, checkfn));
71 void CheckerManager::registerCheckersToEngine(ExprEngine &eng) {
72 for (unsigned i = 0, e = Funcs.size(); i != e; ++i)
73 Funcs[i](eng);
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);
84 // Anchor for the vtable.
85 CheckerProvider::~CheckerProvider() { }