//== CheckerV2.h - Registration mechanism for checkers -----------*- C++ -*--=// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines CheckerV2, used to create and register checkers. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SA_CORE_CHECKERV2 #define LLVM_CLANG_SA_CORE_CHECKERV2 #include "clang/StaticAnalyzer/Core/CheckerManager.h" #include "llvm/Support/Casting.h" namespace clang { namespace ento { class BugReporter; namespace check { struct _VoidCheck { static void _register(void *checker, CheckerManager &mgr) { } }; template class ASTDecl { template static void _checkDecl(void *checker, const Decl *D, AnalysisManager& mgr, BugReporter &BR) { ((const CHECKER *)checker)->checkASTDecl(llvm::cast(D), mgr, BR); } static bool _handlesDecl(const Decl *D) { return llvm::isa(D); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForDecl(CheckerManager::CheckDeclFunc(checker, _checkDecl), _handlesDecl); } }; class ASTCodeBody { template static void _checkBody(void *checker, const Decl *D, AnalysisManager& mgr, BugReporter &BR) { ((const CHECKER *)checker)->checkASTCodeBody(D, mgr, BR); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForBody(CheckerManager::CheckDeclFunc(checker, _checkBody)); } }; template class PreStmt { template static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) { ((const CHECKER *)checker)->checkPreStmt(llvm::cast(S), C); } static bool _handlesStmt(const Stmt *S) { return llvm::isa(S); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForPreStmt(CheckerManager::CheckStmtFunc(checker, _checkStmt), _handlesStmt); } }; template class PostStmt { template static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) { ((const CHECKER *)checker)->checkPostStmt(llvm::cast(S), C); } static bool _handlesStmt(const Stmt *S) { return llvm::isa(S); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForPostStmt(CheckerManager::CheckStmtFunc(checker, _checkStmt), _handlesStmt); } }; class PreObjCMessage { template static void _checkObjCMessage(void *checker, const ObjCMessage &msg, CheckerContext &C) { ((const CHECKER *)checker)->checkPreObjCMessage(msg, C); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForPreObjCMessage( CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage)); } }; class PostObjCMessage { template static void _checkObjCMessage(void *checker, const ObjCMessage &msg, CheckerContext &C) { ((const CHECKER *)checker)->checkPostObjCMessage(msg, C); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForPostObjCMessage( CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage)); } }; class Location { template static void _checkLocation(void *checker, const SVal &location, bool isLoad, CheckerContext &C) { ((const CHECKER *)checker)->checkLocation(location, isLoad, C); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForLocation( CheckerManager::CheckLocationFunc(checker, _checkLocation)); } }; class EndAnalysis { template static void _checkEndAnalysis(void *checker, ExplodedGraph &G, BugReporter &BR, ExprEngine &Eng) { ((const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForEndAnalysis( CheckerManager::CheckEndAnalysisFunc(checker, _checkEndAnalysis)); } }; class EndPath { template static void _checkEndPath(void *checker, EndOfFunctionNodeBuilder &B, ExprEngine &Eng) { ((const CHECKER *)checker)->checkEndPath(B, Eng); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForEndPath( CheckerManager::CheckEndPathFunc(checker, _checkEndPath)); } }; class LiveSymbols { template static void _checkLiveSymbols(void *checker, const GRState *state, SymbolReaper &SR) { ((const CHECKER *)checker)->checkLiveSymbols(state, SR); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForLiveSymbols( CheckerManager::CheckLiveSymbolsFunc(checker, _checkLiveSymbols)); } }; class DeadSymbols { template static void _checkDeadSymbols(void *checker, SymbolReaper &SR, CheckerContext &C) { ((const CHECKER *)checker)->checkDeadSymbols(SR, C); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForDeadSymbols( CheckerManager::CheckDeadSymbolsFunc(checker, _checkDeadSymbols)); } }; class RegionChanges { template static const GRState *_checkRegionChanges(void *checker, const GRState *state, const MemRegion * const *Begin, const MemRegion * const *End) { return ((const CHECKER *)checker)->checkRegionChanges(state, Begin, End); } template static bool _wantsRegionChangeUpdate(void *checker, const GRState *state) { return ((const CHECKER *)checker)->wantsRegionChangeUpdate(state); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForRegionChanges( CheckerManager::CheckRegionChangesFunc(checker, _checkRegionChanges), CheckerManager::WantsRegionChangeUpdateFunc(checker, _wantsRegionChangeUpdate)); } }; } // end check namespace namespace eval { class Call { template static bool _evalCall(void *checker, const CallExpr *CE, CheckerContext &C) { return ((const CHECKER *)checker)->evalCall(CE, C); } public: template static void _register(CHECKER *checker, CheckerManager &mgr) { mgr._registerForEvalCall( CheckerManager::EvalCallFunc(checker, _evalCall)); } }; } // end eval namespace template class CheckerV2 { public: template static void _register(CHECKER *checker, CheckerManager &mgr) { CHECK1::_register(checker, mgr); CHECK2::_register(checker, mgr); CHECK3::_register(checker, mgr); CHECK4::_register(checker, mgr); CHECK5::_register(checker, mgr); CHECK6::_register(checker, mgr); CHECK7::_register(checker, mgr); CHECK8::_register(checker, mgr); CHECK9::_register(checker, mgr); CHECK10::_register(checker, mgr); CHECK11::_register(checker, mgr); CHECK12::_register(checker, mgr); } }; } // end ento namespace } // end clang namespace #endif