clang 23.0.0git
Checker.h
Go to the documentation of this file.
1//== Checker.h - Registration mechanism for checkers -------------*- C++ -*--=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines Checker, used to create and register checkers.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H
14#define LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H
15
20#include "llvm/Support/Casting.h"
21
22namespace clang {
23namespace ento {
24 class BugReporter;
25
26namespace check {
27
28template <typename DECL>
29class ASTDecl {
30 template <typename CHECKER>
31 static void _checkDecl(void *checker, const Decl *D, AnalysisManager& mgr,
32 BugReporter &BR) {
33 ((const CHECKER *)checker)->checkASTDecl(cast<DECL>(D), mgr, BR);
34 }
35
36 static bool _handlesDecl(const Decl *D) {
37 return isa<DECL>(D);
38 }
39public:
40 template <typename CHECKER>
41 static void _register(CHECKER *checker, CheckerManager &mgr) {
43 _checkDecl<CHECKER>),
44 _handlesDecl);
45 }
46};
47
49 template <typename CHECKER>
50 static void _checkBody(void *checker, const Decl *D, AnalysisManager& mgr,
51 BugReporter &BR) {
52 ((const CHECKER *)checker)->checkASTCodeBody(D, mgr, BR);
53 }
54
55public:
56 template <typename CHECKER>
57 static void _register(CHECKER *checker, CheckerManager &mgr) {
59 _checkBody<CHECKER>));
60 }
61};
62
64 template <typename CHECKER>
65 static void _checkEndOfTranslationUnit(void *checker,
66 const TranslationUnitDecl *TU,
67 AnalysisManager& mgr,
68 BugReporter &BR) {
69 ((const CHECKER *)checker)->checkEndOfTranslationUnit(TU, mgr, BR);
70 }
71
72public:
73 template <typename CHECKER>
74 static void _register(CHECKER *checker, CheckerManager &mgr){
77 _checkEndOfTranslationUnit<CHECKER>));
78 }
79};
80
81template <typename STMT>
82class PreStmt {
83 template <typename CHECKER>
84 static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) {
85 ((const CHECKER *)checker)->checkPreStmt(cast<STMT>(S), C);
86 }
87
88 static bool _handlesStmt(const Stmt *S) {
89 return isa<STMT>(S);
90 }
91public:
92 template <typename CHECKER>
93 static void _register(CHECKER *checker, CheckerManager &mgr) {
95 _checkStmt<CHECKER>),
96 _handlesStmt);
97 }
98};
99
100template <typename STMT>
101class PostStmt {
102 template <typename CHECKER>
103 static void _checkStmt(void *checker, const Stmt *S, CheckerContext &C) {
104 ((const CHECKER *)checker)->checkPostStmt(cast<STMT>(S), C);
105 }
106
107 static bool _handlesStmt(const Stmt *S) {
108 return isa<STMT>(S);
109 }
110public:
111 template <typename CHECKER>
112 static void _register(CHECKER *checker, CheckerManager &mgr) {
114 _checkStmt<CHECKER>),
115 _handlesStmt);
116 }
117};
118
120 template <typename CHECKER>
121 static void _checkObjCMessage(void *checker, const ObjCMethodCall &msg,
122 CheckerContext &C) {
123 ((const CHECKER *)checker)->checkPreObjCMessage(msg, C);
124 }
125
126public:
127 template <typename CHECKER>
128 static void _register(CHECKER *checker, CheckerManager &mgr) {
130 CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage<CHECKER>));
131 }
132};
133
135 template <typename CHECKER>
136 static void _checkObjCMessage(void *checker, const ObjCMethodCall &msg,
137 CheckerContext &C) {
138 ((const CHECKER *)checker)->checkObjCMessageNil(msg, C);
139 }
140
141public:
142 template <typename CHECKER>
143 static void _register(CHECKER *checker, CheckerManager &mgr) {
145 CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage<CHECKER>));
146 }
147};
148
150 template <typename CHECKER>
151 static void _checkObjCMessage(void *checker, const ObjCMethodCall &msg,
152 CheckerContext &C) {
153 ((const CHECKER *)checker)->checkPostObjCMessage(msg, C);
154 }
155
156public:
157 template <typename CHECKER>
158 static void _register(CHECKER *checker, CheckerManager &mgr) {
160 CheckerManager::CheckObjCMessageFunc(checker, _checkObjCMessage<CHECKER>));
161 }
162};
163
164class PreCall {
165 template <typename CHECKER>
166 static void _checkCall(void *checker, const CallEvent &msg,
167 CheckerContext &C) {
168 ((const CHECKER *)checker)->checkPreCall(msg, C);
169 }
170
171public:
172 template <typename CHECKER>
173 static void _register(CHECKER *checker, CheckerManager &mgr) {
175 CheckerManager::CheckCallFunc(checker, _checkCall<CHECKER>));
176 }
177};
178
179class PostCall {
180 template <typename CHECKER>
181 static void _checkCall(void *checker, const CallEvent &msg,
182 CheckerContext &C) {
183 ((const CHECKER *)checker)->checkPostCall(msg, C);
184 }
185
186public:
187 template <typename CHECKER>
188 static void _register(CHECKER *checker, CheckerManager &mgr) {
190 CheckerManager::CheckCallFunc(checker, _checkCall<CHECKER>));
191 }
192};
193
194class Location {
195 template <typename CHECKER>
196 static void _checkLocation(void *checker, SVal location, bool isLoad,
197 const Stmt *S, CheckerContext &C) {
198 ((const CHECKER *)checker)->checkLocation(location, isLoad, S, C);
199 }
200
201public:
202 template <typename CHECKER>
203 static void _register(CHECKER *checker, CheckerManager &mgr) {
205 CheckerManager::CheckLocationFunc(checker, _checkLocation<CHECKER>));
206 }
207};
208
210 template <typename CHECKER>
211 static void _checkLifetimeEnd(void *checker, const VarDecl *D,
212 CheckerContext &C) {
213 ((const CHECKER *)checker)->checkLifetimeEnd(D, C);
214 }
215
216public:
217 template <typename CHECKER>
218 static void _register(CHECKER *checker, CheckerManager &mgr) {
220 checker, _checkLifetimeEnd<CHECKER>));
221 }
222};
223
224class Bind {
225 template <typename CHECKER>
226 static void _checkBind(void *checker, SVal location, SVal val, const Stmt *S,
227 bool AtDeclInit, CheckerContext &C) {
228 ((const CHECKER *)checker)->checkBind(location, val, S, AtDeclInit, C);
229 }
230
231public:
232 template <typename CHECKER>
233 static void _register(CHECKER *checker, CheckerManager &mgr) {
235 CheckerManager::CheckBindFunc(checker, _checkBind<CHECKER>));
236 }
237};
238
240 template <typename CHECKER>
241 static void _checkBlockEntrance(void *Checker,
242 const clang::BlockEntrance &Entrance,
243 CheckerContext &C) {
244 ((const CHECKER *)Checker)->checkBlockEntrance(Entrance, C);
245 }
246
247public:
248 template <typename CHECKER>
249 static void _register(CHECKER *checker, CheckerManager &mgr) {
251 checker, _checkBlockEntrance<CHECKER>));
252 }
253};
254
256 template <typename CHECKER>
257 static void _checkEndAnalysis(void *checker, ExplodedGraph &G,
258 BugReporter &BR, ExprEngine &Eng) {
259 ((const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
260 }
261
262public:
263 template <typename CHECKER>
264 static void _register(CHECKER *checker, CheckerManager &mgr) {
266 CheckerManager::CheckEndAnalysisFunc(checker, _checkEndAnalysis<CHECKER>));
267 }
268};
269
271 template <typename CHECKER>
272 static void _checkBeginFunction(void *checker, CheckerContext &C) {
273 ((const CHECKER *)checker)->checkBeginFunction(C);
274 }
275
276public:
277 template <typename CHECKER>
278 static void _register(CHECKER *checker, CheckerManager &mgr) {
280 checker, _checkBeginFunction<CHECKER>));
281 }
282};
283
285 template <typename CHECKER>
286 static void _checkEndFunction(void *checker, const ReturnStmt *RS,
287 CheckerContext &C) {
288 ((const CHECKER *)checker)->checkEndFunction(RS, C);
289 }
290
291public:
292 template <typename CHECKER>
293 static void _register(CHECKER *checker, CheckerManager &mgr) {
295 CheckerManager::CheckEndFunctionFunc(checker, _checkEndFunction<CHECKER>));
296 }
297};
298
300 template <typename CHECKER>
301 static void _checkBranchCondition(void *checker, const Stmt *Condition,
302 CheckerContext & C) {
303 ((const CHECKER *)checker)->checkBranchCondition(Condition, C);
304 }
305
306public:
307 template <typename CHECKER>
308 static void _register(CHECKER *checker, CheckerManager &mgr) {
311 _checkBranchCondition<CHECKER>));
312 }
313};
314
316 template <typename CHECKER>
317 static void _checkNewAllocator(void *checker, const CXXAllocatorCall &Call,
318 CheckerContext &C) {
319 ((const CHECKER *)checker)->checkNewAllocator(Call, C);
320 }
321
322public:
323 template <typename CHECKER>
324 static void _register(CHECKER *checker, CheckerManager &mgr) {
327 _checkNewAllocator<CHECKER>));
328 }
329};
330
332 template <typename CHECKER>
333 static void _checkLiveSymbols(void *checker, ProgramStateRef state,
334 SymbolReaper &SR) {
335 ((const CHECKER *)checker)->checkLiveSymbols(state, SR);
336 }
337
338public:
339 template <typename CHECKER>
340 static void _register(CHECKER *checker, CheckerManager &mgr) {
342 CheckerManager::CheckLiveSymbolsFunc(checker, _checkLiveSymbols<CHECKER>));
343 }
344};
345
347 template <typename CHECKER>
348 static void _checkDeadSymbols(void *checker,
350 ((const CHECKER *)checker)->checkDeadSymbols(SR, C);
351 }
352
353public:
354 template <typename CHECKER>
355 static void _register(CHECKER *checker, CheckerManager &mgr) {
357 CheckerManager::CheckDeadSymbolsFunc(checker, _checkDeadSymbols<CHECKER>));
358 }
359};
360
362 template <typename CHECKER>
363 static ProgramStateRef
364 _checkRegionChanges(void *checker, ProgramStateRef state,
365 const InvalidatedSymbols *invalidated,
367 ArrayRef<const MemRegion *> Regions, const StackFrame *SF,
368 const CallEvent *Call) {
369 return ((const CHECKER *)checker)
370 ->checkRegionChanges(state, invalidated, Explicits, Regions, SF, Call);
371 }
372
373public:
374 template <typename CHECKER>
375 static void _register(CHECKER *checker, CheckerManager &mgr) {
378 _checkRegionChanges<CHECKER>));
379 }
380};
381
383 template <typename CHECKER>
384 static ProgramStateRef
385 _checkPointerEscape(void *Checker,
386 ProgramStateRef State,
387 const InvalidatedSymbols &Escaped,
388 const CallEvent *Call,
391
392 if (!ETraits)
393 return ((const CHECKER *)Checker)->checkPointerEscape(State,
394 Escaped,
395 Call,
396 Kind);
397
398 InvalidatedSymbols RegularEscape;
399 for (SymbolRef Sym : Escaped)
400 if (!ETraits->hasTrait(
402 !ETraits->hasTrait(
404 RegularEscape.insert(Sym);
405
406 if (RegularEscape.empty())
407 return State;
408
409 return ((const CHECKER *)Checker)->checkPointerEscape(State,
410 RegularEscape,
411 Call,
412 Kind);
413 }
414
415public:
416 template <typename CHECKER>
417 static void _register(CHECKER *checker, CheckerManager &mgr) {
420 _checkPointerEscape<CHECKER>));
421 }
422};
423
425 template <typename CHECKER>
426 static ProgramStateRef
427 _checkConstPointerEscape(void *Checker,
428 ProgramStateRef State,
429 const InvalidatedSymbols &Escaped,
430 const CallEvent *Call,
433
434 if (!ETraits)
435 return State;
436
437 InvalidatedSymbols ConstEscape;
438 for (SymbolRef Sym : Escaped) {
439 if (ETraits->hasTrait(
441 !ETraits->hasTrait(
443 ConstEscape.insert(Sym);
444 }
445
446 if (ConstEscape.empty())
447 return State;
448
449 return ((const CHECKER *)Checker)->checkConstPointerEscape(State,
450 ConstEscape,
451 Call,
452 Kind);
453 }
454
455public:
456 template <typename CHECKER>
457 static void _register(CHECKER *checker, CheckerManager &mgr) {
460 _checkConstPointerEscape<CHECKER>));
461 }
462};
463
464
465template <typename EVENT>
466class Event {
467 template <typename CHECKER>
468 static void _checkEvent(void *checker, const void *event) {
469 ((const CHECKER *)checker)->checkEvent(*(const EVENT *)event);
470 }
471public:
472 template <typename CHECKER>
473 static void _register(CHECKER *checker, CheckerManager &mgr) {
474 mgr._registerListenerForEvent<EVENT>(
475 CheckerManager::CheckEventFunc(checker, _checkEvent<CHECKER>));
476 }
477};
478
479} // end check namespace
480
481namespace eval {
482
483class Assume {
484 template <typename CHECKER>
485 static ProgramStateRef _evalAssume(void *checker, ProgramStateRef state,
486 SVal cond, bool assumption) {
487 return ((const CHECKER *)checker)->evalAssume(state, cond, assumption);
488 }
489
490public:
491 template <typename CHECKER>
492 static void _register(CHECKER *checker, CheckerManager &mgr) {
494 CheckerManager::EvalAssumeFunc(checker, _evalAssume<CHECKER>));
495 }
496};
497
498class Call {
499 template <typename CHECKER>
500 static bool _evalCall(void *checker, const CallEvent &Call,
501 CheckerContext &C) {
502 return ((const CHECKER *)checker)->evalCall(Call, C);
503 }
504
505public:
506 template <typename CHECKER>
507 static void _register(CHECKER *checker, CheckerManager &mgr) {
509 CheckerManager::EvalCallFunc(checker, _evalCall<CHECKER>));
510 }
511};
512
513} // end eval namespace
514
515/// A `CheckerFrontend` instance is what the user recognizes as "one checker":
516/// it has a public canonical name (injected from the `CheckerManager`), can be
517/// enabled or disabled, can have associated checker options and can be printed
518/// as the "source" of bug reports.
519/// The singleton instance of a simple `Checker<...>` is-a `CheckerFrontend`
520/// (for historical reasons, to preserve old straightforward code), while the
521/// singleton instance of a `CheckerFamily<...>` class owns multiple
522/// `CheckerFrontend` instances as data members.
523/// Modeling checkers that are hidden from the user but can be enabled or
524/// disabled separately (as dependencies of other checkers) are also considered
525/// to be `CheckerFrontend`s.
527 /// The `Name` is nullopt if and only if the checker is disabled.
528 std::optional<CheckerNameRef> Name;
529
530public:
532 assert(!Name && "Checker part registered twice!");
533 Name = Mgr.getCurrentCheckerName();
534 }
535 bool isEnabled() const { return Name.has_value(); }
536 CheckerNameRef getName() const { return *Name; }
537};
538
539/// `CheckerBackend` is an abstract base class that serves as the common
540/// ancestor of all the `Checker<...>` and `CheckerFamily<...>` classes which
541/// can create `ExplodedNode`s (by acting as a `ProgramPointTag`) and can be
542/// registered to handle various checker callbacks. (Moreover the debug
543/// callback `printState` is also introduced here.)
545public:
546 /// Debug state dump callback, see CheckerManager::runCheckersForPrintState.
547 /// Default implementation does nothing.
548 virtual void printState(raw_ostream &Out, ProgramStateRef State,
549 const char *NL, const char *Sep) const;
550};
551
552/// The non-templated common ancestor of all the simple `Checker<...>` classes.
554public:
555 /// Attached to nodes created by this checker class when the ExplodedGraph is
556 /// dumped for debugging.
557 StringRef getDebugTag() const override;
558};
559
560/// Simple checker classes that implement one frontend (i.e. checker name)
561/// should derive from this template and specify all the implemented callbacks
562/// (i.e. classes like `check::PreStmt` or `eval::Call`) as template arguments
563/// of `Checker`.
564template <typename... CHECKs>
565class Checker : public CheckerBase, public CHECKs... {
566public:
568
569 template <typename CHECKER>
570 static void _register(CHECKER *Chk, CheckerManager &Mgr) {
571 (CHECKs::_register(Chk, Mgr), ...);
572 }
573};
574
575/// Checker families (where a single backend class implements multiple related
576/// frontends) should derive from this template and specify all the implemented
577/// callbacks (i.e. classes like `check::PreStmt` or `eval::Call`) as template
578/// arguments of `FamilyChecker.`
579///
580/// NOTE: Classes deriving from `CheckerFamily` must implement the pure virtual
581/// method `StringRef getDebugTag()` which is inherited from `ProgramPointTag`
582/// and should return the name of the class as a string.
583///
584/// Obviously, this boilerplate is not a good thing, but unfortunately there is
585/// no portable way to stringify the name of a type (e.g. class), so any
586/// portable implementation of `getDebugTag` would need to take the name of
587/// the class from *somewhere* where it's present as a string -- and then
588/// directly placing it in a method override is much simpler than loading it
589/// from `Checkers.td`.
590///
591/// Note that the existing `CLASS` field in `Checkers.td` is not suitable for
592/// our goals, because instead of storing the same class name for each
593/// frontend, in fact each frontendchecker needs to have its own unique value
594/// there (to ensure that the names of the register methods are all unique).
595template <typename... CHECKs>
596class CheckerFamily : public CheckerBackend, public CHECKs... {
597public:
599
600 template <typename CHECKER>
601 static void _register(CHECKER *Chk, CheckerManager &Mgr) {
602 (CHECKs::_register(Chk, Mgr), ...);
603 }
604};
605
606template <typename EVENT>
608 CheckerManager *Mgr = nullptr;
609public:
610 EventDispatcher() = default;
611
612 template <typename CHECKER>
613 static void _register(CHECKER *checker, CheckerManager &mgr) {
614 mgr._registerDispatcherForEvent<EVENT>();
615 static_cast<EventDispatcher<EVENT> *>(checker)->Mgr = &mgr;
616 }
617
618 void dispatchEvent(const EVENT &event) const {
619 Mgr->_dispatchEvent(event);
620 }
621};
622
623/// We dereferenced a location that may be null.
626 bool IsLoad;
629 // When true, the dereference is in the source code directly. When false, the
630 // dereference might happen later (for example pointer passed to a parameter
631 // that is marked with nonnull attribute.)
633
634 static int Tag;
635};
636
637} // end ento namespace
638
639} // end clang namespace
640
641#endif
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)
Defines the clang::LangOptions interface.
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
ProgramPointTag(void *tagKind=nullptr)
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3170
It represents a stack frame of the call stack.
Stmt - This represents one statement.
Definition Stmt.h:86
The top declaration context.
Definition Decl.h:105
Represents a variable declaration or definition.
Definition Decl.h:924
BugReporter is a utility class for generating PathDiagnostics for analysis.
Represents the memory allocation call in a C++ new-expression.
Definition CallEvent.h:1122
Represents an abstract call to a function or method along a particular path.
Definition CallEvent.h:152
CheckerBackend is an abstract base class that serves as the common ancestor of all the Checker<....
Definition Checker.h:544
virtual void printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const
Debug state dump callback, see CheckerManager::runCheckersForPrintState.
Definition Checker.cpp:22
The non-templated common ancestor of all the simple Checker<...> classes.
Definition Checker.h:553
StringRef getDebugTag() const override
Attached to nodes created by this checker class when the ExplodedGraph is dumped for debugging.
Definition Checker.cpp:20
Checker families (where a single backend class implements multiple related frontends) should derive f...
Definition Checker.h:596
static void _register(CHECKER *Chk, CheckerManager &Mgr)
Definition Checker.h:601
clang::BlockEntrance BlockEntrance
Definition Checker.h:598
A CheckerFrontend instance is what the user recognizes as "one checker": it has a public canonical na...
Definition Checker.h:526
CheckerNameRef getName() const
Definition Checker.h:536
void enable(CheckerManager &Mgr)
Definition Checker.h:531
void _registerForLiveSymbols(CheckLiveSymbolsFunc checkfn)
void _registerForEndOfTranslationUnit(CheckEndOfTranslationUnit checkfn)
void _registerForBeginFunction(CheckBeginFunctionFunc checkfn)
void _registerForNewAllocator(CheckNewAllocatorFunc checkfn)
CheckerFn< void(const Decl *, AnalysisManager &, BugReporter &)> CheckDeclFunc
void _registerForPreCall(CheckCallFunc checkfn)
CheckerFn< ProgramStateRef(ProgramStateRef, SVal cond, bool assumption)> EvalAssumeFunc
void _registerForObjCMessageNil(CheckObjCMessageFunc checkfn)
CheckerFn< ProgramStateRef(ProgramStateRef, const InvalidatedSymbols &Escaped, const CallEvent *Call, PointerEscapeKind Kind, RegionAndSymbolInvalidationTraits *ITraits)> CheckPointerEscapeFunc
void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn)
CheckerFn< void(const ReturnStmt *, CheckerContext &)> CheckEndFunctionFunc
CheckerFn< void(const Stmt *, CheckerContext &)> CheckBranchConditionFunc
void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn)
CheckerFn< bool(const CallEvent &, CheckerContext &)> EvalCallFunc
CheckerFn< void(CheckerContext &)> CheckBeginFunctionFunc
CheckerFn< void(const void *event)> CheckEventFunc
void _registerListenerForEvent(CheckEventFunc checkfn)
CheckerFn< void(ExplodedGraph &, BugReporter &, ExprEngine &)> CheckEndAnalysisFunc
void _registerForEvalAssume(EvalAssumeFunc checkfn)
void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn)
void _registerForBody(CheckDeclFunc checkfn)
CheckerFn< void(const Stmt *, CheckerContext &)> CheckStmtFunc
CheckerFn< void(SVal location, SVal val, const Stmt *S, bool AtDeclInit, CheckerContext &)> CheckBindFunc
CheckerFn< void(const CXXAllocatorCall &Call, CheckerContext &)> CheckNewAllocatorFunc
CheckerFn< void(const VarDecl *, CheckerContext &)> CheckLifetimeEndFunc
void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn)
void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn)
void _registerForRegionChanges(CheckRegionChangesFunc checkfn)
void _registerForBind(CheckBindFunc checkfn)
void _registerForPointerEscape(CheckPointerEscapeFunc checkfn)
CheckerFn< void(const TranslationUnitDecl *, AnalysisManager &, BugReporter &)> CheckEndOfTranslationUnit
void _registerForPreStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
void _registerForPostStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
CheckerFn< void(const CallEvent &, CheckerContext &)> CheckCallFunc
void _registerForBranchCondition(CheckBranchConditionFunc checkfn)
CheckerFn< void(SymbolReaper &, CheckerContext &)> CheckDeadSymbolsFunc
CheckerFn< void(SVal location, bool isLoad, const Stmt *S, CheckerContext &)> CheckLocationFunc
void _registerForEvalCall(EvalCallFunc checkfn)
void _registerForEndFunction(CheckEndFunctionFunc checkfn)
void _registerForBlockEntrance(CheckBlockEntranceFunc checkfn)
CheckerFn< ProgramStateRef( ProgramStateRef, const InvalidatedSymbols *symbols, ArrayRef< const MemRegion * > ExplicitRegions, ArrayRef< const MemRegion * > Regions, const StackFrame *SF, const CallEvent *Call)> CheckRegionChangesFunc
CheckerNameRef getCurrentCheckerName() const
CheckerFn< void(const ObjCMethodCall &, CheckerContext &)> CheckObjCMessageFunc
void _registerForLocation(CheckLocationFunc checkfn)
CheckerFn< void(const BlockEntrance &, CheckerContext &)> CheckBlockEntranceFunc
CheckerFn< void(ProgramStateRef, SymbolReaper &)> CheckLiveSymbolsFunc
void _registerForPostCall(CheckCallFunc checkfn)
void _registerForLifetimeEnd(CheckLifetimeEndFunc checkfn)
This wrapper is used to ensure that only StringRefs originating from the CheckerRegistry are used as ...
Simple checker classes that implement one frontend (i.e.
Definition Checker.h:565
clang::BlockEntrance BlockEntrance
Definition Checker.h:567
static void _register(CHECKER *Chk, CheckerManager &Mgr)
Definition Checker.h:570
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:613
void dispatchEvent(const EVENT &event) const
Definition Checker.h:618
Represents any expression that calls an Objective-C method.
Definition CallEvent.h:1251
Information about invalidation for a particular region/symbol.
Definition MemRegion.h:1656
@ TK_PreserveContents
Tells that a region's contents is not changed.
Definition MemRegion.h:1671
@ TK_SuppressEscape
Suppress pointer-escaping of a region.
Definition MemRegion.h:1674
bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
Definition SVals.h:56
A class responsible for cleaning up unused symbols.
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:57
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:41
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:278
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:233
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:249
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:308
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:457
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:355
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:264
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:293
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:74
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:473
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:218
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:340
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:203
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:324
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:143
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:417
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:188
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:158
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:112
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:173
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:128
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:93
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:375
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:492
static void _register(CHECKER *checker, CheckerManager &mgr)
Definition Checker.h:507
PointerEscapeKind
Describes the different reasons a pointer escapes during analysis.
llvm::DenseSet< SymbolRef > InvalidatedSymbols
Definition Store.h:50
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
const SymExpr * SymbolRef
Definition SymExpr.h:133
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
Definition Address.h:330
U cast(CodeGen::Address addr)
Definition Address.h:327
We dereferenced a location that may be null.
Definition Checker.h:624