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