[analyzer]
[clang.git] / include / clang / StaticAnalyzer / Core / CheckerManager.h
blob1efc1ae352c6d9ff2ac79635eff157adb316a814
1 //===--- CheckerManager.h - Static Analyzer Checker Manager -----*- C++ -*-===//
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.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_SA_CORE_CHECKERMANAGER_H
15 #define LLVM_CLANG_SA_CORE_CHECKERMANAGER_H
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/DenseMap.h"
19 #include <vector>
21 namespace clang {
22 class Decl;
24 namespace ento {
25 class ExprEngine;
26 class AnalysisManager;
27 class BugReporter;
29 class CheckerManager {
30 public:
31 ~CheckerManager();
33 typedef void *CheckerRef;
35 //===----------------------------------------------------------------------===//
36 // registerChecker
37 //===----------------------------------------------------------------------===//
39 /// \brief Used to register checkers.
40 template <typename CHECKER>
41 void registerChecker() {
42 CHECKER *checker = new CHECKER();
43 Checkers.push_back(std::make_pair(checker, destruct<CHECKER>));
44 CHECKER::_register(checker, *this);
47 typedef void (*RegisterToEngFunc)(ExprEngine &Eng);
48 void addCheckerRegisterFunction(RegisterToEngFunc fn) {
49 Funcs.push_back(fn);
52 //===----------------------------------------------------------------------===//
53 // Functions for running checkers.
54 //===----------------------------------------------------------------------===//
56 /// \brief Run checkers handling Decls.
57 void runCheckersOnASTDecl(const Decl *D, AnalysisManager& mgr,
58 BugReporter &BR);
60 /// \brief Run checkers handling Decls containing a Stmt body.
61 void runCheckersOnASTBody(const Decl *D, AnalysisManager& mgr,
62 BugReporter &BR);
64 //===----------------------------------------------------------------------===//
65 // Internal registration functions.
66 //===----------------------------------------------------------------------===//
68 // Functions used by the registration mechanism, checkers should not touch
69 // these directly.
71 typedef void (*CheckDeclFunc)(CheckerRef checker, const Decl *D,
72 AnalysisManager& mgr, BugReporter &BR);
73 typedef bool (*HandlesDeclFunc)(const Decl *D);
74 void _registerForDecl(CheckerRef checker, CheckDeclFunc checkfn,
75 HandlesDeclFunc isForDeclFn);
77 void _registerForBody(CheckerRef checker, CheckDeclFunc checkfn);
79 void registerCheckersToEngine(ExprEngine &eng);
81 private:
82 template <typename CHECKER>
83 static void destruct(void *obj) { delete static_cast<CHECKER *>(obj); }
85 std::vector<RegisterToEngFunc> Funcs;
87 struct DeclCheckerInfo {
88 CheckerRef Checker;
89 CheckDeclFunc CheckFn;
90 HandlesDeclFunc IsForDeclFn;
92 std::vector<DeclCheckerInfo> DeclCheckers;
94 std::vector<std::pair<CheckerRef, CheckDeclFunc> > BodyCheckers;
96 typedef void (*Dtor)(void *);
97 std::vector<std::pair<CheckerRef, Dtor> > Checkers;
99 typedef llvm::SmallVector<std::pair<CheckerRef, CheckDeclFunc>, 4>
100 CachedDeclCheckers;
101 typedef llvm::DenseMap<unsigned, CachedDeclCheckers> CachedDeclCheckersMapTy;
102 CachedDeclCheckersMapTy CachedDeclCheckersMap;
105 } // end ento namespace
107 } // end clang namespace
109 #endif