diff options
Diffstat (limited to 'lib/StaticAnalyzer/Core/CheckerManager.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/CheckerManager.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/lib/StaticAnalyzer/Core/CheckerManager.cpp b/lib/StaticAnalyzer/Core/CheckerManager.cpp new file mode 100644 index 0000000..1989b82 --- /dev/null +++ b/lib/StaticAnalyzer/Core/CheckerManager.cpp @@ -0,0 +1,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() { } |