Checker.h revision 23111dcd66ee242bb5caf1ecab01bd930ee42c4c
1ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis//== Checker.h - Registration mechanism for checkers -------------*- C++ -*--=//
29fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//
39fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
49fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//
59fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
69fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
79fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//
89fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
99fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//
10ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis//  This file defines Checker, used to create and register checkers.
119fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//
129fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
139fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
14ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis#ifndef LLVM_CLANG_SA_CORE_CHECKER
15ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis#define LLVM_CLANG_SA_CORE_CHECKER
169fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
17ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek#include "clang/Analysis/ProgramPoint.h"
189fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/CheckerManager.h"
19b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
209fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#include "llvm/Support/Casting.h"
219fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
229fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisnamespace clang {
239fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisnamespace ento {
249fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  class BugReporter;
259fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
269fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisnamespace check {
279fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
289fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisstruct _VoidCheck {
299fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _register(void *checker, CheckerManager &mgr) { }
309fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis};
319fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
329fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidistemplate <typename DECL>
339fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisclass ASTDecl {
349fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
359fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _checkDecl(void *checker, const Decl *D, AnalysisManager& mgr,
369fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis                         BugReporter &BR) {
379fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkASTDecl(llvm::cast<DECL>(D), mgr, BR);
389fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
399fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
409fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static bool _handlesDecl(const Decl *D) {
419fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis    return llvm::isa<DECL>(D);
429fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
439fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidispublic:
449fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
459fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
46769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForDecl(CheckerManager::CheckDeclFunc(checker,
47769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                                       _checkDecl<CHECKER>),
48769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                         _handlesDecl);
499fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
509fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis};
519fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
529fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidisclass ASTCodeBody {
539fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
549fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _checkBody(void *checker, const Decl *D, AnalysisManager& mgr,
559fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis                         BugReporter &BR) {
569fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkASTCodeBody(D, mgr, BR);
579fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
589fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
599fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidispublic:
609fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
619fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
62769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForBody(CheckerManager::CheckDeclFunc(checker,
63769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                                       _checkBody<CHECKER>));
64769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
65769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis};
66769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
679be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenekclass EndOfTranslationUnit {
689be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  template <typename CHECKER>
699be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  static void _checkEndOfTranslationUnit(void *checker,
709be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek                                         const TranslationUnitDecl *TU,
719be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek                                         AnalysisManager& mgr,
729be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek                                         BugReporter &BR) {
739be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek    ((const CHECKER *)checker)->checkEndOfTranslationUnit(TU, mgr, BR);
749be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  }
759be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek
769be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenekpublic:
779be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  template <typename CHECKER>
789be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  static void _register(CHECKER *checker, CheckerManager &mgr){
799be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek    mgr._registerForEndOfTranslationUnit(
809be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek                              CheckerManager::CheckEndOfTranslationUnit(checker,
819be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek                                          _checkEndOfTranslationUnit<CHECKER>));
829be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek  }
839be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek};
849be6e7ce5788e50c62d40c59b0bbc2ea423683f7Ted Kremenek
85769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidistemplate <typename STMT>
86769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisclass PreStmt {
87769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
88769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) {
89769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkPreStmt(llvm::cast<STMT>(S), C);
90769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
91769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
92769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static bool _handlesStmt(const Stmt *S) {
93769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    return llvm::isa<STMT>(S);
94769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
95769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic:
96769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
97769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
98769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForPreStmt(CheckerManager::CheckStmtFunc(checker,
99769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                                          _checkStmt<CHECKER>),
100769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                            _handlesStmt);
101769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
102769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis};
103769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
104769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidistemplate <typename STMT>
105769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisclass PostStmt {
106769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
107769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) {
108769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkPostStmt(llvm::cast<STMT>(S), C);
109769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
110769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
111769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static bool _handlesStmt(const Stmt *S) {
112769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    return llvm::isa<STMT>(S);
113769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
114769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic:
115769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
116769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
117769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForPostStmt(CheckerManager::CheckStmtFunc(checker,
118769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                                           _checkStmt<CHECKER>),
119769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                             _handlesStmt);
120769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
121769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis};
122769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
123769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisclass PreObjCMessage {
124769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
125769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _checkObjCMessage(void *checker, const ObjCMessage &msg,
126769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                CheckerContext &C) {
127769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkPreObjCMessage(msg, C);
128769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
129769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
130769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic:
131769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
132769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
133769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForPreObjCMessage(
134769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis     CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage<CHECKER>));
135769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
136769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis};
137769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
138769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisclass PostObjCMessage {
139769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
140769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _checkObjCMessage(void *checker, const ObjCMessage &msg,
141769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                                CheckerContext &C) {
142769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkPostObjCMessage(msg, C);
143769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
144769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
145769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic:
146769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
147769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
148769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForPostObjCMessage(
149769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis     CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage<CHECKER>));
150769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
151769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis};
152769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
153769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidisclass Location {
154769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
155390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks  static void _checkLocation(void *checker,
156390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks                             const SVal &location, bool isLoad, const Stmt *S,
157769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis                             CheckerContext &C) {
158390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks    ((const CHECKER *)checker)->checkLocation(location, isLoad, S, C);
159769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  }
160769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis
161769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidispublic:
162769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  template <typename CHECKER>
163769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
164769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis    mgr._registerForLocation(
165769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis           CheckerManager::CheckLocationFunc(checker, _checkLocation<CHECKER>));
1669fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
1679fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis};
1689fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
169312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidisclass Bind {
170312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  template <typename CHECKER>
171390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks  static void _checkBind(void *checker,
172390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks                         const SVal &location, const SVal &val, const Stmt *S,
173312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis                         CheckerContext &C) {
174390909c89c98ab1807e15e033a72e975f866fb23Anna Zaks    ((const CHECKER *)checker)->checkBind(location, val, S, C);
175312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  }
176312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis
177312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidispublic:
178312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  template <typename CHECKER>
179312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
180312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis    mgr._registerForBind(
181312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis           CheckerManager::CheckBindFunc(checker, _checkBind<CHECKER>));
182312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  }
183312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis};
184312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis
18530726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidisclass EndAnalysis {
18630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  template <typename CHECKER>
18730726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  static void _checkEndAnalysis(void *checker, ExplodedGraph &G,
18830726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis                                BugReporter &BR, ExprEngine &Eng) {
18930726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
19030726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  }
19130726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis
19230726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidispublic:
19330726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  template <typename CHECKER>
19430726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
19530726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis    mgr._registerForEndAnalysis(
19630726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis     CheckerManager::CheckEndAnalysisFunc(checker, _checkEndAnalysis<CHECKER>));
19730726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis  }
19830726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis};
19930726c6baee1417307236e854f1474fdb3cedb98Argyrios Kyrtzidis
200af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidisclass EndPath {
201af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  template <typename CHECKER>
202af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks  static void _checkEndPath(void *checker,
203af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks                            CheckerContext &C) {
204af498a28797c075c48d7e943df5f5a8e78ed8eb0Anna Zaks    ((const CHECKER *)checker)->checkEndPath(C);
205af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  }
206af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis
207af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidispublic:
208af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  template <typename CHECKER>
209af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
210af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis    mgr._registerForEndPath(
211af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis     CheckerManager::CheckEndPathFunc(checker, _checkEndPath<CHECKER>));
212af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  }
213af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis};
214af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis
215cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidisclass BranchCondition {
216cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  template <typename CHECKER>
217f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks  static void _checkBranchCondition(void *checker, const Stmt *Condition,
218f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks                                    CheckerContext & C) {
219f236b6503a4dbc44c1fccb8756bd57c9d0efdf05Anna Zaks    ((const CHECKER *)checker)->checkBranchCondition(Condition, C);
220cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  }
221cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis
222cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidispublic:
223cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  template <typename CHECKER>
224cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
225cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis    mgr._registerForBranchCondition(
226cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis      CheckerManager::CheckBranchConditionFunc(checker,
227cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis                                               _checkBranchCondition<CHECKER>));
228cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  }
229cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis};
230cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis
231183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidisclass LiveSymbols {
232183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
23323111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek  static void _checkLiveSymbols(void *checker, ProgramStateRef state,
234183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis                                SymbolReaper &SR) {
235183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkLiveSymbols(state, SR);
236183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
237183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
238183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidispublic:
239183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
240183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
241183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    mgr._registerForLiveSymbols(
242183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis     CheckerManager::CheckLiveSymbolsFunc(checker, _checkLiveSymbols<CHECKER>));
243183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
244183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis};
245183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
246183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidisclass DeadSymbols {
247183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
248183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  static void _checkDeadSymbols(void *checker,
249183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis                                SymbolReaper &SR, CheckerContext &C) {
250183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkDeadSymbols(SR, C);
251183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
252183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
253183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidispublic:
254183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
255183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
256183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    mgr._registerForDeadSymbols(
257183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis     CheckerManager::CheckDeadSymbolsFunc(checker, _checkDeadSymbols<CHECKER>));
258183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
259183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis};
260183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
261183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidisclass RegionChanges {
262183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
26323111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek  static ProgramStateRef
26418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  _checkRegionChanges(void *checker,
26523111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek                      ProgramStateRef state,
26618c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                      const StoreManager::InvalidatedSymbols *invalidated,
267537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose                      ArrayRef<const MemRegion *> Explicits,
268537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose                      ArrayRef<const MemRegion *> Regions) {
26935bdbf40624beba3fc00cb72ab444659939c1a6bTed Kremenek    return ((const CHECKER *)checker)->checkRegionChanges(state, invalidated,
270537716ad8dd10f984b6cfe6985afade1185c5e3cJordy Rose                                                          Explicits, Regions);
271183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
272183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
27318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  static bool _wantsRegionChangeUpdate(void *checker,
27423111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek                                       ProgramStateRef state) {
275183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    return ((const CHECKER *)checker)->wantsRegionChangeUpdate(state);
276183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
277183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
278183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidispublic:
279183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  template <typename CHECKER>
280183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
281183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis    mgr._registerForRegionChanges(
282183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis          CheckerManager::CheckRegionChangesFunc(checker,
283183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis                                                 _checkRegionChanges<CHECKER>),
284183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis          CheckerManager::WantsRegionChangeUpdateFunc(checker,
285183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis                                            _wantsRegionChangeUpdate<CHECKER>));
286183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis  }
287183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis};
288183ff98f425d470c2a0276880aaf43496c9dad14Argyrios Kyrtzidis
289deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <typename EVENT>
290deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidisclass Event {
291deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  template <typename CHECKER>
292deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _checkEvent(void *checker, const void *event) {
293deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkEvent(*(const EVENT *)event);
294deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
295deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidispublic:
296deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  template <typename CHECKER>
297deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
298deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    mgr._registerListenerForEvent<EVENT>(
299deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis                 CheckerManager::CheckEventFunc(checker, _checkEvent<CHECKER>));
300deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
301deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis};
302deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
3039fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis} // end check namespace
3049fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
305e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidisnamespace eval {
306e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis
307312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidisclass Assume {
308312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  template <typename CHECKER>
30923111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek  static ProgramStateRef _evalAssume(void *checker,
31023111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek                                         ProgramStateRef state,
31118c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                         const SVal &cond,
31218c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                         bool assumption) {
313312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis    return ((const CHECKER *)checker)->evalAssume(state, cond, assumption);
314312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  }
315312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis
316312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidispublic:
317312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  template <typename CHECKER>
318312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
319312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis    mgr._registerForEvalAssume(
320312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis                 CheckerManager::EvalAssumeFunc(checker, _evalAssume<CHECKER>));
321312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis  }
322312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis};
323312dbec867f6b8d6b86fd562c53352cd4db27468Argyrios Kyrtzidis
324e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidisclass Call {
325e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  template <typename CHECKER>
326e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  static bool _evalCall(void *checker, const CallExpr *CE, CheckerContext &C) {
327e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis    return ((const CHECKER *)checker)->evalCall(CE, C);
328e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  }
329e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis
330e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidispublic:
331e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  template <typename CHECKER>
332e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
333e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis    mgr._registerForEvalCall(
334e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis                     CheckerManager::EvalCallFunc(checker, _evalCall<CHECKER>));
335e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis  }
336e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis};
337e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis
338dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaksclass InlineCall {
339dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  template <typename CHECKER>
340dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  static bool _inlineCall(void *checker, const CallExpr *CE,
341dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks                                         ExprEngine &Eng,
342dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks                                         ExplodedNode *Pred,
343dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks                                         ExplodedNodeSet &Dst) {
344dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks    return ((const CHECKER *)checker)->inlineCall(CE, Eng, Pred, Dst);
345dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  }
346dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks
347dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zakspublic:
348dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  template <typename CHECKER>
349dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  static void _register(CHECKER *checker, CheckerManager &mgr) {
350dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks    mgr._registerForInlineCall(
351dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks                 CheckerManager::InlineCallFunc(checker, _inlineCall<CHECKER>));
352dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks  }
353dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks};
354dff6ef903ff4fcb43b5ea292ecd772e381393b5dAnna Zaks
355e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis} // end eval namespace
356e1bfb7ae0dd0762c88e1fd94746e973c37f2e04eArgyrios Kyrtzidis
357ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenekclass CheckerBase : public ProgramPointTag {
358ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenekpublic:
359ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek  StringRef getTagDescription() const;
360dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose
361dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose  /// See CheckerManager::runCheckersForPrintState.
36223111dcd66ee242bb5caf1ecab01bd930ee42c4cTed Kremenek  virtual void printState(raw_ostream &Out, ProgramStateRef State,
363dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose                          const char *NL, const char *Sep) const { }
364ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek};
365ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek
3669fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidistemplate <typename CHECK1, typename CHECK2=check::_VoidCheck,
3679fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis          typename CHECK3=check::_VoidCheck, typename CHECK4=check::_VoidCheck,
3689fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis          typename CHECK5=check::_VoidCheck, typename CHECK6=check::_VoidCheck,
3699fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis          typename CHECK7=check::_VoidCheck, typename CHECK8=check::_VoidCheck,
3709fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis          typename CHECK9=check::_VoidCheck, typename CHECK10=check::_VoidCheck,
371321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK11=check::_VoidCheck,typename CHECK12=check::_VoidCheck,
372321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK13=check::_VoidCheck,typename CHECK14=check::_VoidCheck,
373d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks          typename CHECK15=check::_VoidCheck,typename CHECK16=check::_VoidCheck,
374d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks          typename CHECK17=check::_VoidCheck,typename CHECK18=check::_VoidCheck>
375ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker;
376deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
377deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <>
378ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker<check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
379deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
380deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
381321d70fbde6a0d584a05845f605744889193e70bJordy Rose                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
382321d70fbde6a0d584a05845f605744889193e70bJordy Rose                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
383d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck>
384ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek  : public CheckerBase
385ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek{
38699ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
387deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidispublic:
388deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _register(void *checker, CheckerManager &mgr) { }
389deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis};
390deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
391deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <typename CHECK1, typename CHECK2, typename CHECK3, typename CHECK4,
392deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis          typename CHECK5, typename CHECK6, typename CHECK7, typename CHECK8,
393321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK9, typename CHECK10,typename CHECK11,typename CHECK12,
394d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks          typename CHECK13,typename CHECK14,typename CHECK15,typename CHECK16,
395d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks          typename CHECK17,typename CHECK18>
396ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker
397deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    : public CHECK1,
398ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis      public Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, CHECK8,
399321d70fbde6a0d584a05845f605744889193e70bJordy Rose                     CHECK9, CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,
400d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks                     CHECK16,CHECK17,CHECK18> {
4019fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidispublic:
4029fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
4039fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
4049fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis    CHECK1::_register(checker, mgr);
405321d70fbde6a0d584a05845f605744889193e70bJordy Rose    Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, CHECK8,
406321d70fbde6a0d584a05845f605744889193e70bJordy Rose            CHECK9, CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,
407d699ade396154238d2fa89bb09fdcfb79e5587d2Anna Zaks            CHECK16,CHECK17,CHECK18>::_register(checker, mgr);
408deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
409deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis};
410deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
411deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <typename EVENT>
412deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidisclass EventDispatcher {
413deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  CheckerManager *Mgr;
414deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidispublic:
415deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  EventDispatcher() : Mgr(0) { }
416deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
417deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  template <typename CHECKER>
418deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
419deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    mgr._registerDispatcherForEvent<EVENT>();
420deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    static_cast<EventDispatcher<EVENT> *>(checker)->Mgr = &mgr;
421deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
422deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
423deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  void dispatchEvent(const EVENT &event) const {
424deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    Mgr->_dispatchEvent(event);
4259fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
4269fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis};
4279fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
428b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis/// \brief We dereferenced a location that may be null.
429b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidisstruct ImplicitNullDerefEvent {
430b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  SVal Location;
431b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  bool IsLoad;
432b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  ExplodedNode *SinkNode;
433b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  BugReporter *BR;
434b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis};
435b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis
4369fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis} // end ento namespace
4379fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
4389fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis} // end clang namespace
4399fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
4409fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#endif
441