13 #ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H 14 #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,
const ReturnStmt *RS,
259 ((
const CHECKER *)checker)->checkEndFunction(RS, 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>
288 static void _checkNewAllocator(
void *checker,
const CXXNewExpr *NE,
290 ((
const CHECKER *)checker)->checkNewAllocator(NE, Target, C);
294 template <
typename CHECKER>
298 _checkNewAllocator<CHECKER>));
303 template <
typename CHECKER>
306 ((
const CHECKER *)checker)->checkLiveSymbols(state, SR);
310 template <
typename CHECKER>
318 template <
typename CHECKER>
319 static void _checkDeadSymbols(
void *checker,
321 ((
const CHECKER *)checker)->checkDeadSymbols(SR, C);
325 template <
typename CHECKER>
333 template <
typename CHECKER>
335 _checkRegionChanges(
void *checker,
342 return ((
const CHECKER *) checker)->checkRegionChanges(state, invalidated,
348 template <
typename CHECKER>
352 _checkRegionChanges<CHECKER>));
357 template <
typename CHECKER>
359 _checkPointerEscape(
void *
Checker,
367 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
373 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
374 E = Escaped.end(); I != E; ++I)
379 RegularEscape.insert(*I);
381 if (RegularEscape.empty())
384 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
391 template <
typename CHECKER>
395 _checkPointerEscape<CHECKER>));
400 template <
typename CHECKER>
402 _checkConstPointerEscape(
void *
Checker,
413 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
414 E = Escaped.end(); I != E; ++I)
419 ConstEscape.insert(*I);
421 if (ConstEscape.empty())
424 return ((
const CHECKER *)Checker)->checkConstPointerEscape(State,
431 template <
typename CHECKER>
435 _checkConstPointerEscape<CHECKER>));
440 template <
typename EVENT>
442 template <
typename CHECKER>
443 static void _checkEvent(
void *checker,
const void *event) {
444 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
447 template <
typename CHECKER>
459 template <
typename CHECKER>
464 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
468 template <
typename CHECKER>
476 template <
typename CHECKER>
479 return ((
const CHECKER *)checker)->evalCall(Call, C);
483 template <
typename CHECKER>
494 friend class ::clang::ento::CheckerManager;
497 StringRef getTagDescription()
const override;
502 const char *NL,
const char *Sep)
const { }
516 template <
typename CHECK1,
typename... CHECKs>
519 template <
typename CHECKER>
521 CHECK1::_register(checker, mgr);
526 template <
typename CHECK1>
529 template <
typename CHECKER>
531 CHECK1::_register(checker, mgr);
535 template <
typename EVENT>
541 template <
typename CHECKER>
573 operator bool&() {
return val; }
574 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.
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)
static void _register(CHECKER *checker, CheckerManager &mgr)
Decl - This represents one declaration (or definition), e.g.
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
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)
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)
Defines the clang::LangOptions interface.
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)
ReturnStmt - This represents a return, optionally of an expression: return; return 4;...
CheckerFn< void(const void *event)> CheckEventFunc
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)
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)"...
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.
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.
void _registerForNewAllocator(CheckNewAllocatorFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForBeginFunction(CheckBeginFunctionFunc checkfn)
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)
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
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)