1 //===--- CheckerManager.cpp - Static Analyzer Checker Manager -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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;
21 void CheckerManager::runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr,
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);
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));
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,
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)
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;
84 // Anchor for the vtable.
85 CheckerProvider::~CheckerProvider() { }