mirror of
https://github.com/opnsense/src.git
synced 2026-02-27 11:50:47 -05:00
85 lines
2.8 KiB
C++
85 lines
2.8 KiB
C++
//===--- 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() { }
|