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,
325 return ((
const CHECKER *)checker)->checkRegionChanges(state, invalidated,
326 Explicits, Regions, Call);
328 template <
typename CHECKER>
329 static bool _wantsRegionChangeUpdate(
void *checker,
331 return ((
const CHECKER *)checker)->wantsRegionChangeUpdate(state);
335 template <
typename CHECKER>
339 _checkRegionChanges<CHECKER>),
341 _wantsRegionChangeUpdate<CHECKER>));
346 template <
typename CHECKER>
348 _checkPointerEscape(
void *
Checker,
356 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
362 for (InvalidatedSymbols::const_iterator
I = Escaped.begin(),
363 E = Escaped.end();
I !=
E; ++
I)
368 RegularEscape.insert(*
I);
370 if (RegularEscape.empty())
373 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
380 template <
typename CHECKER>
384 _checkPointerEscape<CHECKER>));
389 template <
typename CHECKER>
391 _checkConstPointerEscape(
void *
Checker,
402 for (InvalidatedSymbols::const_iterator
I = Escaped.begin(),
403 E = Escaped.end();
I !=
E; ++
I)
408 ConstEscape.insert(*
I);
410 if (ConstEscape.empty())
413 return ((
const CHECKER *)Checker)->checkConstPointerEscape(State,
420 template <
typename CHECKER>
424 _checkConstPointerEscape<CHECKER>));
429 template <
typename EVENT>
431 template <
typename CHECKER>
432 static void _checkEvent(
void *checker,
const void *event) {
433 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
436 template <
typename CHECKER>
448 template <
typename CHECKER>
453 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
457 template <
typename CHECKER>
465 template <
typename CHECKER>
467 return ((
const CHECKER *)checker)->evalCall(CE, C);
471 template <
typename CHECKER>
482 friend class ::clang::ento::CheckerManager;
490 const char *NL,
const char *Sep)
const { }
494 raw_ostream&
operator<<(raw_ostream &Out,
const CheckerBase &Checker);
504 template <
typename CHECK1,
typename... CHECKs>
507 template <
typename CHECKER>
509 CHECK1::_register(checker, mgr);
514 template <
typename CHECK1>
517 template <
typename CHECKER>
519 CHECK1::_register(checker, mgr);
523 template <
typename EVENT>
529 template <
typename CHECKER>
559 operator bool&() {
return val; }
560 operator const bool&()
const {
return val; }
Suppress pointer-escaping of a region.
void _registerForRegionChanges(CheckRegionChangesFunc checkfn, WantsRegionChangeUpdateFunc wantUpdateFn)
void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn)
Information about invalidation for a particular region/symbol.
A helper class which wraps a boolean value set to false by default.
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForBeginFunction(CheckEndFunctionFunc 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.
StringRef getTagDescription() const override
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)
detail::InMemoryDirectory::const_iterator I
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)
bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const
CheckName getCheckName() const
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)
CheckerProgramPointTag(StringRef CheckerName, StringRef Msg)
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
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)
detail::InMemoryDirectory::const_iterator E
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)
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)
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]).
void dispatchEvent(const EVENT &event) const
static void _register(CHECKER *checker, CheckerManager &mgr)
static void _register(CHECKER *checker, CheckerManager &mgr)
TranslationUnitDecl - The top declaration context.
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)
void _dispatchEvent(const EVENT &event) const
static void _register(CHECKER *checker, CheckerManager &mgr)