14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H 15 #define LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H 20 #include "llvm/Support/Casting.h" 28 template <
typename DECL>
30 template <
typename CHECKER>
33 ((
const CHECKER *)checker)->checkASTDecl(cast<DECL>(D), mgr, BR);
36 static bool _handlesDecl(
const Decl *D) {
40 template <
typename CHECKER>
49 template <
typename CHECKER>
52 ((
const CHECKER *)checker)->checkASTCodeBody(D, mgr, BR);
56 template <
typename CHECKER>
59 _checkBody<CHECKER>));
64 template <
typename CHECKER>
65 static void _checkEndOfTranslationUnit(
void *checker,
69 ((
const CHECKER *)checker)->checkEndOfTranslationUnit(TU, mgr, BR);
73 template <
typename CHECKER>
77 _checkEndOfTranslationUnit<CHECKER>));
81 template <
typename STMT>
83 template <
typename CHECKER>
85 ((
const CHECKER *)checker)->checkPreStmt(cast<STMT>(S), C);
88 static bool _handlesStmt(
const Stmt *S) {
92 template <
typename CHECKER>
100 template <
typename STMT>
102 template <
typename CHECKER>
104 ((
const CHECKER *)checker)->checkPostStmt(cast<STMT>(S), C);
107 static bool _handlesStmt(
const Stmt *S) {
111 template <
typename CHECKER>
114 _checkStmt<CHECKER>),
120 template <
typename CHECKER>
121 static void _checkObjCMessage(
void *checker,
const ObjCMethodCall &msg,
123 ((
const CHECKER *)checker)->checkPreObjCMessage(msg, C);
127 template <
typename CHECKER>
135 template <
typename CHECKER>
136 static void _checkObjCMessage(
void *checker,
const ObjCMethodCall &msg,
138 ((
const CHECKER *)checker)->checkObjCMessageNil(msg, C);
142 template <
typename CHECKER>
150 template <
typename CHECKER>
151 static void _checkObjCMessage(
void *checker,
const ObjCMethodCall &msg,
153 ((
const CHECKER *)checker)->checkPostObjCMessage(msg, C);
157 template <
typename CHECKER>
165 template <
typename CHECKER>
166 static void _checkCall(
void *checker,
const CallEvent &msg,
168 ((
const CHECKER *)checker)->checkPreCall(msg, C);
172 template <
typename CHECKER>
180 template <
typename CHECKER>
181 static void _checkCall(
void *checker,
const CallEvent &msg,
183 ((
const CHECKER *)checker)->checkPostCall(msg, C);
187 template <
typename CHECKER>
195 template <
typename CHECKER>
196 static void _checkLocation(
void *checker,
197 const SVal &location,
bool isLoad,
const Stmt *S,
199 ((
const CHECKER *)checker)->checkLocation(location, isLoad, S, C);
203 template <
typename CHECKER>
211 template <
typename CHECKER>
212 static void _checkBind(
void *checker,
215 ((
const CHECKER *)checker)->checkBind(location, val, S, C);
219 template <
typename CHECKER>
227 template <
typename CHECKER>
228 static void _checkEndAnalysis(
void *checker,
ExplodedGraph &G,
230 ((
const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
234 template <
typename CHECKER>
242 template <
typename CHECKER>
243 static void _checkBeginFunction(
void *checker,
CheckerContext &C) {
244 ((
const CHECKER *)checker)->checkBeginFunction(C);
248 template <
typename CHECKER>
251 checker, _checkBeginFunction<CHECKER>));
256 template <
typename CHECKER>
257 static void _checkEndFunction(
void *checker,
259 ((
const CHECKER *)checker)->checkEndFunction(C);
263 template <
typename CHECKER>
271 template <
typename CHECKER>
272 static void _checkBranchCondition(
void *checker,
const Stmt *Condition,
274 ((
const CHECKER *)checker)->checkBranchCondition(Condition, C);
278 template <
typename CHECKER>
282 _checkBranchCondition<CHECKER>));
287 template <
typename CHECKER>
290 ((
const CHECKER *)checker)->checkLiveSymbols(state, SR);
294 template <
typename CHECKER>
302 template <
typename CHECKER>
303 static void _checkDeadSymbols(
void *checker,
305 ((
const CHECKER *)checker)->checkDeadSymbols(SR, C);
309 template <
typename CHECKER>
317 template <
typename CHECKER>
319 _checkRegionChanges(
void *checker,
326 return ((
const CHECKER *) checker)->checkRegionChanges(state, invalidated,
332 template <
typename CHECKER>
336 _checkRegionChanges<CHECKER>));
341 template <
typename CHECKER>
343 _checkPointerEscape(
void *
Checker,
351 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
357 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
358 E = Escaped.end(); I != E; ++I)
363 RegularEscape.insert(*I);
365 if (RegularEscape.empty())
368 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
375 template <
typename CHECKER>
379 _checkPointerEscape<CHECKER>));
384 template <
typename CHECKER>
386 _checkConstPointerEscape(
void *
Checker,
397 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
398 E = Escaped.end(); I != E; ++I)
403 ConstEscape.insert(*I);
405 if (ConstEscape.empty())
408 return ((
const CHECKER *)Checker)->checkConstPointerEscape(State,
415 template <
typename CHECKER>
419 _checkConstPointerEscape<CHECKER>));
424 template <
typename EVENT>
426 template <
typename CHECKER>
427 static void _checkEvent(
void *checker,
const void *event) {
428 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
431 template <
typename CHECKER>
443 template <
typename CHECKER>
448 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
452 template <
typename CHECKER>
460 template <
typename CHECKER>
462 return ((
const CHECKER *)checker)->evalCall(CE, C);
466 template <
typename CHECKER>
477 friend class ::clang::ento::CheckerManager;
480 StringRef getTagDescription()
const override;
485 const char *NL,
const char *Sep)
const { }
499 template <
typename CHECK1,
typename... CHECKs>
502 template <
typename CHECKER>
504 CHECK1::_register(checker, mgr);
509 template <
typename CHECK1>
512 template <
typename CHECKER>
514 CHECK1::_register(checker, mgr);
518 template <
typename EVENT>
524 template <
typename CHECKER>
554 operator bool&() {
return val; }
555 operator const bool&()
const {
return val; }
Suppress pointer-escaping of a region.
bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const
void _dispatchEvent(const EVENT &event) const
void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn)
Stmt - This represents one statement.
Information about invalidation for a particular region/symbol.
A helper class which wraps a boolean value set to false by default.
Decl - This represents one declaration (or definition), e.g.
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForBeginFunction(CheckEndFunctionFunc checkfn)
void _registerForRegionChanges(CheckRegionChangesFunc checkfn)
void _registerForObjCMessageNil(CheckObjCMessageFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForPreCall(CheckCallFunc checkfn)
DefaultBool & operator=(bool b)
static void _register(CHECKER *checker, CheckerManager &mgr)
i32 captured_struct **param SharedsTy A type which contains references the shared variables *param Shareds Context with the list of shared variables from the p *TaskFunction *param Data Additional data for task generation like final * state
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForEndOfTranslationUnit(CheckEndOfTranslationUnit checkfn)
#define CHECKER(FULLNAME, CLASS, DESCFILE, HELPTEXT, GROUPINDEX, HIDDEN)
Represents any expression that calls an Objective-C method.
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForLiveSymbols(CheckLiveSymbolsFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
We dereferenced a location that may be null.
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForBody(CheckDeclFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn)
void _registerForLocation(CheckLocationFunc checkfn)
void _registerForPointerEscape(CheckPointerEscapeFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForPostCall(CheckCallFunc checkfn)
BugReporter is a utility class for generating PathDiagnostics for analysis.
void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn)
void _registerListenerForEvent(CheckEventFunc checkfn)
ProgramPoints can be "tagged" as representing points specific to a given analysis entity...
static void _register(CHECKER *checker, CheckerManager &mgr)
SVal - This represents a symbolic expression, which can be either an L-value or an R-value...
void _registerForBranchCondition(CheckBranchConditionFunc checkfn)
A class responsible for cleaning up unused symbols.
void _registerDispatcherForEvent()
static void _register(CHECKER *checker, CheckerManager &mgr)
Tells that a region's contents is not changed.
CheckerFn< void(const void *event)> CheckEventFunc
Dataflow Directional Tag Classes.
raw_ostream & operator<<(raw_ostream &Out, const CheckerBase &Checker)
Dump checker name to stream.
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn)
void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn)
Represents an abstract call to a function or method along a particular path.
void _registerForEndFunction(CheckEndFunctionFunc checkfn)
void _registerForEvalAssume(EvalAssumeFunc checkfn)
void _registerForPostStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
PointerEscapeKind
Describes the different reasons a pointer escapes during analysis.
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForEvalCall(EvalCallFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
TranslationUnitDecl - The top declaration context.
void dispatchEvent(const EVENT &event) const
void _registerForPreStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
static void _register(CHECKER *checker, CheckerManager &mgr)
Tag that can use a checker name as a message provider (see SimpleProgramPointTag).
void _registerForBind(CheckBindFunc checkfn)
virtual void printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const
See CheckerManager::runCheckersForPrintState.
static void _register(CHECKER *checker, CheckerManager &mgr)