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() { }