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)->checkPostObjCMessage(msg, C);
142 template <
typename CHECKER>
150 template <
typename CHECKER>
151 static void _checkCall(
void *checker,
const CallEvent &msg,
153 ((
const CHECKER *)checker)->checkPreCall(msg, C);
157 template <
typename CHECKER>
165 template <
typename CHECKER>
166 static void _checkCall(
void *checker,
const CallEvent &msg,
168 ((
const CHECKER *)checker)->checkPostCall(msg, C);
172 template <
typename CHECKER>
180 template <
typename CHECKER>
181 static void _checkLocation(
void *checker,
182 const SVal &location,
bool isLoad,
const Stmt *
S,
184 ((
const CHECKER *)checker)->checkLocation(location, isLoad, S, C);
188 template <
typename CHECKER>
196 template <
typename CHECKER>
197 static void _checkBind(
void *checker,
200 ((
const CHECKER *)checker)->checkBind(location, val, S, C);
204 template <
typename CHECKER>
212 template <
typename CHECKER>
213 static void _checkEndAnalysis(
void *checker,
ExplodedGraph &G,
215 ((
const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
219 template <
typename CHECKER>
227 template <
typename CHECKER>
228 static void _checkEndFunction(
void *checker,
230 ((
const CHECKER *)checker)->checkEndFunction(C);
234 template <
typename CHECKER>
242 template <
typename CHECKER>
243 static void _checkBranchCondition(
void *checker,
const Stmt *Condition,
245 ((
const CHECKER *)checker)->checkBranchCondition(Condition, C);
249 template <
typename CHECKER>
253 _checkBranchCondition<CHECKER>));
258 template <
typename CHECKER>
261 ((
const CHECKER *)checker)->checkLiveSymbols(state, SR);
265 template <
typename CHECKER>
273 template <
typename CHECKER>
274 static void _checkDeadSymbols(
void *checker,
276 ((
const CHECKER *)checker)->checkDeadSymbols(SR, C);
280 template <
typename CHECKER>
288 template <
typename CHECKER>
290 _checkRegionChanges(
void *checker,
296 return ((
const CHECKER *)checker)->checkRegionChanges(state, invalidated,
297 Explicits, Regions, Call);
299 template <
typename CHECKER>
300 static bool _wantsRegionChangeUpdate(
void *checker,
302 return ((
const CHECKER *)checker)->wantsRegionChangeUpdate(state);
306 template <
typename CHECKER>
310 _checkRegionChanges<CHECKER>),
312 _wantsRegionChangeUpdate<CHECKER>));
317 template <
typename CHECKER>
319 _checkPointerEscape(
void *
Checker,
327 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
333 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
334 E = Escaped.end(); I != E; ++I)
339 RegularEscape.insert(*I);
341 if (RegularEscape.empty())
344 return ((
const CHECKER *)Checker)->checkPointerEscape(State,
351 template <
typename CHECKER>
355 _checkPointerEscape<CHECKER>));
360 template <
typename CHECKER>
362 _checkConstPointerEscape(
void *
Checker,
373 for (InvalidatedSymbols::const_iterator I = Escaped.begin(),
374 E = Escaped.end(); I != E; ++I)
379 ConstEscape.insert(*I);
381 if (ConstEscape.empty())
384 return ((
const CHECKER *)Checker)->checkConstPointerEscape(State,
391 template <
typename CHECKER>
395 _checkConstPointerEscape<CHECKER>));
400 template <
typename EVENT>
402 template <
typename CHECKER>
403 static void _checkEvent(
void *checker,
const void *event) {
404 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
407 template <
typename CHECKER>
419 template <
typename CHECKER>
424 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
428 template <
typename CHECKER>
436 template <
typename CHECKER>
438 return ((
const CHECKER *)checker)->evalCall(CE, C);
442 template <
typename CHECKER>
453 friend class ::clang::ento::CheckerManager;
461 const char *NL,
const char *Sep)
const { }
465 raw_ostream&
operator<<(raw_ostream &Out,
const CheckerBase &Checker);
475 template <
typename CHECK1,
typename... CHECKs>
478 template <
typename CHECKER>
480 CHECK1::_register(checker, mgr);
485 template <
typename CHECK1>
488 template <
typename CHECKER>
490 CHECK1::_register(checker, mgr);
494 template <
typename EVENT>
500 template <
typename CHECKER>
526 operator bool&() {
return val; }
527 operator const bool&()
const {
return val; }
Suppress pointer-escaping of a region.
bool hasTrait(SymbolRef Sym, InvalidationKinds IK)
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)
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForPreCall(CheckCallFunc checkfn)
DefaultBool & operator=(bool b)
static void _register(CHECKER *checker, CheckerManager &mgr)
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)
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)
CheckName getCheckName() const
static void _register(CHECKER *checker, CheckerManager &mgr)
void _registerForPostCall(CheckCallFunc checkfn)
void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn)
void _registerListenerForEvent(CheckEventFunc checkfn)
static void _register(CHECKER *checker, CheckerManager &mgr)
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)
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 _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)
void dispatchEvent(const EVENT &event) const
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)
void _registerForBind(CheckBindFunc checkfn)
void _dispatchEvent(const EVENT &event) const
static void _register(CHECKER *checker, CheckerManager &mgr)