1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
//===--- CheckerManager.cpp - Static Analyzer Checker Manager -------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Defines the Static Analyzer Checker Manager.
//
//===----------------------------------------------------------------------===//
#include "clang/StaticAnalyzer/Core/CheckerManager.h"
#include "clang/StaticAnalyzer/Core/CheckerProvider.h"
#include "clang/AST/DeclBase.h"
using namespace clang;
using namespace ento;
void CheckerManager::runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr,
BugReporter &BR) {
assert(D);
unsigned DeclKind = D->getKind();
CachedDeclCheckers *checkers = 0;
CachedDeclCheckersMapTy::iterator CCI = CachedDeclCheckersMap.find(DeclKind);
if (CCI != CachedDeclCheckersMap.end()) {
checkers = &(CCI->second);
} else {
// Find the checkers that should run for this Decl and cache them.
checkers = &CachedDeclCheckersMap[DeclKind];
for (unsigned i = 0, e = DeclCheckers.size(); i != e; ++i) {
DeclCheckerInfo &info = DeclCheckers[i];
if (info.IsForDeclFn(D))
checkers->push_back(std::make_pair(info.Checker, info.CheckFn));
}
}
assert(checkers);
for (CachedDeclCheckers::iterator
I = checkers->begin(), E = checkers->end(); I != E; ++I) {
CheckerRef checker = I->first;
CheckDeclFunc fn = I->second;
fn(checker, D, mgr, BR);
}
}
void CheckerManager::runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr,
BugReporter &BR) {
assert(D && D->hasBody());
for (unsigned i = 0, e = BodyCheckers.size(); i != e; ++i) {
CheckerRef checker = BodyCheckers[i].first;
CheckDeclFunc fn = BodyCheckers[i].second;
fn(checker, D, mgr, BR);
}
}
void CheckerManager::_registerForDecl(CheckerRef checker, CheckDeclFunc checkfn,
HandlesDeclFunc isForDeclFn) {
DeclCheckerInfo info = { checker, checkfn, isForDeclFn };
DeclCheckers.push_back(info);
}
void CheckerManager::_registerForBody(CheckerRef checker,
CheckDeclFunc checkfn) {
BodyCheckers.push_back(std::make_pair(checker, checkfn));
}
void CheckerManager::registerCheckersToEngine(ExprEngine &eng) {
for (unsigned i = 0, e = Funcs.size(); i != e; ++i)
Funcs[i](eng);
}
CheckerManager::~CheckerManager() {
for (unsigned i = 0, e = Checkers.size(); i != e; ++i) {
CheckerRef checker = Checkers[i].first;
Dtor dtor = Checkers[i].second;
dtor(checker);
}
}
// Anchor for the vtable.
CheckerProvider::~CheckerProvider() { }
|