Checker.h revision 390909c89c98ab1807e15e033a72e975f866fb23
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>
202af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis  static void _checkEndPath(void *checker, EndOfFunctionNodeBuilder &B,
203af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis                            ExprEngine &Eng) {
204af5800a1e287990bb547e052f257adeeae5ab476Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkEndPath(B, Eng);
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>
217cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis  static void _checkBranchCondition(void *checker, const Stmt *condition,
218cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis                                    BranchNodeBuilder &B, ExprEngine &Eng) {
219cc05d511b26ac6dc80fcbcc78ac305d2755aa0b9Argyrios Kyrtzidis    ((const CHECKER *)checker)->checkBranchCondition(condition, B, Eng);
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>
23318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  static void _checkLiveSymbols(void *checker, const ProgramState *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>
26318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  static const ProgramState *
26418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  _checkRegionChanges(void *checker,
26518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                      const ProgramState *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,
27418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                       const ProgramState *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>
30918c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  static const ProgramState *_evalAssume(void *checker,
31018c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                         const ProgramState *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.
362dbd658e139b3e0bf084f75feaea8d844af9e319fJordy Rose  virtual void printState(raw_ostream &Out, const ProgramState *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,
373321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK15=check::_VoidCheck,typename CHECK16=check::_VoidCheck>
374ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker;
375deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
376deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <>
377ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker<check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
378deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
379deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
380321d70fbde6a0d584a05845f605744889193e70bJordy Rose                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
381321d70fbde6a0d584a05845f605744889193e70bJordy Rose                check::_VoidCheck, check::_VoidCheck, check::_VoidCheck,
382321d70fbde6a0d584a05845f605744889193e70bJordy Rose                check::_VoidCheck>
383ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek  : public CheckerBase
384ca804539d908d3a0e8c72a0df5f1f571d29490bbTed Kremenek{
385deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidispublic:
386deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _register(void *checker, CheckerManager &mgr) { }
387deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis};
388deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
389deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <typename CHECK1, typename CHECK2, typename CHECK3, typename CHECK4,
390deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis          typename CHECK5, typename CHECK6, typename CHECK7, typename CHECK8,
391321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK9, typename CHECK10,typename CHECK11,typename CHECK12,
392321d70fbde6a0d584a05845f605744889193e70bJordy Rose          typename CHECK13,typename CHECK14,typename CHECK15,typename CHECK16>
393ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidisclass Checker
394deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    : public CHECK1,
395ec8605f1d7ec846dbf51047bfd5c56d32d1ff91cArgyrios Kyrtzidis      public Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, CHECK8,
396321d70fbde6a0d584a05845f605744889193e70bJordy Rose                     CHECK9, CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,
397321d70fbde6a0d584a05845f605744889193e70bJordy Rose                     CHECK16> {
3989fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidispublic:
3999fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  template <typename CHECKER>
4009fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
4019fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis    CHECK1::_register(checker, mgr);
402321d70fbde6a0d584a05845f605744889193e70bJordy Rose    Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, CHECK8,
403321d70fbde6a0d584a05845f605744889193e70bJordy Rose            CHECK9, CHECK10,CHECK11,CHECK12,CHECK13,CHECK14,CHECK15,
404321d70fbde6a0d584a05845f605744889193e70bJordy Rose            CHECK16>::_register(checker, mgr);
405deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
406deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis};
407deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
408deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidistemplate <typename EVENT>
409deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidisclass EventDispatcher {
410deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  CheckerManager *Mgr;
411deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidispublic:
412deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  EventDispatcher() : Mgr(0) { }
413deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
414deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  template <typename CHECKER>
415deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  static void _register(CHECKER *checker, CheckerManager &mgr) {
416deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    mgr._registerDispatcherForEvent<EVENT>();
417deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    static_cast<EventDispatcher<EVENT> *>(checker)->Mgr = &mgr;
418deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  }
419deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis
420deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis  void dispatchEvent(const EVENT &event) const {
421deb6447d0029bdb122397fafb5fa2a4e76f2e555Argyrios Kyrtzidis    Mgr->_dispatchEvent(event);
4229fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis  }
4239fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis};
4249fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
425b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis/// \brief We dereferenced a location that may be null.
426b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidisstruct ImplicitNullDerefEvent {
427b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  SVal Location;
428b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  bool IsLoad;
429b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  ExplodedNode *SinkNode;
430b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis  BugReporter *BR;
431b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis};
432b3d74da3e1620c9a7a378afb5f244e4987e6713eArgyrios Kyrtzidis
4339fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis} // end ento namespace
4349fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
4359fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis} // end clang namespace
4369fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis
4379fb9474c5b267400d4abfbff63c8b39f378235d4Argyrios Kyrtzidis#endif
438