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