13#ifndef LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H
14#define LLVM_CLANG_STATICANALYZER_CORE_CHECKER_H
20#include "llvm/Support/Casting.h"
28template <
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>));
81template <
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>
100template <
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,
SVal location,
bool isLoad,
198 ((
const CHECKER *)checker)->checkLocation(location, isLoad, S,
C);
202 template <
typename CHECKER>
210 template <
typename CHECKER>
211 static void _checkBind(
void *checker,
SVal location,
SVal val,
const Stmt *S,
213 ((
const CHECKER *)checker)->checkBind(location, val, S, AtDeclInit,
C);
217 template <
typename CHECKER>
225 template <
typename CHECKER>
226 static void _checkBlockEntrance(
void *
Checker,
233 template <
typename CHECKER>
236 checker, _checkBlockEntrance<CHECKER>));
241 template <
typename CHECKER>
242 static void _checkEndAnalysis(
void *checker,
ExplodedGraph &G,
244 ((
const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
248 template <
typename CHECKER>
256 template <
typename CHECKER>
258 ((
const CHECKER *)checker)->checkBeginFunction(
C);
262 template <
typename CHECKER>
265 checker, _checkBeginFunction<CHECKER>));
270 template <
typename CHECKER>
271 static void _checkEndFunction(
void *checker,
const ReturnStmt *RS,
273 ((
const CHECKER *)checker)->checkEndFunction(RS,
C);
277 template <
typename CHECKER>
285 template <
typename CHECKER>
286 static void _checkBranchCondition(
void *checker,
const Stmt *
Condition,
292 template <
typename CHECKER>
296 _checkBranchCondition<CHECKER>));
301 template <
typename CHECKER>
308 template <
typename CHECKER>
312 _checkNewAllocator<CHECKER>));
317 template <
typename CHECKER>
320 ((
const CHECKER *)checker)->checkLiveSymbols(state, SR);
324 template <
typename CHECKER>
332 template <
typename CHECKER>
333 static void _checkDeadSymbols(
void *checker,
335 ((
const CHECKER *)checker)->checkDeadSymbols(SR,
C);
339 template <
typename CHECKER>
347 template <
typename CHECKER>
349 _checkRegionChanges(
void *checker,
356 return ((
const CHECKER *) checker)->checkRegionChanges(state, invalidated,
362 template <
typename CHECKER>
366 _checkRegionChanges<CHECKER>));
371 template <
typename CHECKER>
373 _checkPointerEscape(
void *
Checker,
392 RegularEscape.insert(Sym);
394 if (RegularEscape.empty())
404 template <
typename CHECKER>
408 _checkPointerEscape<CHECKER>));
413 template <
typename CHECKER>
415 _checkConstPointerEscape(
void *
Checker,
431 ConstEscape.insert(Sym);
434 if (ConstEscape.empty())
444 template <
typename CHECKER>
448 _checkConstPointerEscape<CHECKER>));
453template <
typename EVENT>
455 template <
typename CHECKER>
456 static void _checkEvent(
void *checker,
const void *event) {
457 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
460 template <
typename CHECKER>
472 template <
typename CHECKER>
474 SVal cond,
bool assumption) {
475 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
479 template <
typename CHECKER>
487 template <
typename CHECKER>
494 template <
typename CHECKER>
516 std::optional<CheckerNameRef> Name;
520 assert(!Name &&
"Checker part registered twice!");
537 const char *NL,
const char *Sep)
const;
552template <
typename... CHECKs>
557 template <
typename CHECKER>
559 (CHECKs::_register(Chk, Mgr), ...);
583template <
typename... CHECKs>
588 template <
typename CHECKER>
590 (CHECKs::_register(Chk, Mgr), ...);
594template <
typename EVENT>
600 template <
typename CHECKER>
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
Defines the clang::LangOptions interface.
Decl - This represents one declaration (or definition), e.g.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
ProgramPoints can be "tagged" as representing points specific to a given analysis entity.
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Stmt - This represents one statement.
The top declaration context.
BugReporter is a utility class for generating PathDiagnostics for analysis.
Represents the memory allocation call in a C++ new-expression.
Represents an abstract call to a function or method along a particular path.
CheckerBackend is an abstract base class that serves as the common ancestor of all the Checker<....
virtual void printState(raw_ostream &Out, ProgramStateRef State, const char *NL, const char *Sep) const
Debug state dump callback, see CheckerManager::runCheckersForPrintState.
The non-templated common ancestor of all the simple Checker<...> classes.
StringRef getDebugTag() const override
Attached to nodes created by this checker class when the ExplodedGraph is dumped for debugging.
Checker families (where a single backend class implements multiple related frontends) should derive f...
static void _register(CHECKER *Chk, CheckerManager &Mgr)
A CheckerFrontend instance is what the user recognizes as "one checker": it has a public canonical na...
CheckerNameRef getName() const
void enable(CheckerManager &Mgr)
void _registerForLiveSymbols(CheckLiveSymbolsFunc checkfn)
void _registerForEndOfTranslationUnit(CheckEndOfTranslationUnit checkfn)
void _registerForBeginFunction(CheckBeginFunctionFunc checkfn)
void _registerForNewAllocator(CheckNewAllocatorFunc checkfn)
void _registerForPreCall(CheckCallFunc checkfn)
void _registerForObjCMessageNil(CheckObjCMessageFunc checkfn)
void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn)
void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn)
CheckerFn< void(const void *event)> CheckEventFunc
void _registerListenerForEvent(CheckEventFunc checkfn)
void _registerForEvalAssume(EvalAssumeFunc checkfn)
void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn)
void _registerForBody(CheckDeclFunc checkfn)
void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn)
void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn)
void _registerForRegionChanges(CheckRegionChangesFunc checkfn)
void _registerForBind(CheckBindFunc checkfn)
void _registerForPointerEscape(CheckPointerEscapeFunc checkfn)
void _registerForPreStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
void _registerForPostStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
void _registerForBranchCondition(CheckBranchConditionFunc checkfn)
void _dispatchEvent(const EVENT &event) const
void _registerForEvalCall(EvalCallFunc checkfn)
void _registerForEndFunction(CheckEndFunctionFunc checkfn)
void _registerForBlockEntrance(CheckBlockEntranceFunc checkfn)
void _registerDispatcherForEvent()
CheckerNameRef getCurrentCheckerName() const
void _registerForLocation(CheckLocationFunc checkfn)
void _registerForPostCall(CheckCallFunc 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.
static void _register(CHECKER *Chk, CheckerManager &Mgr)
EventDispatcher()=default
static void _register(CHECKER *checker, CheckerManager &mgr)
void dispatchEvent(const EVENT &event) const
Represents any expression that calls an Objective-C method.
Information about invalidation for a particular region/symbol.
@ TK_PreserveContents
Tells that a region's contents is not changed.
@ TK_SuppressEscape
Suppress pointer-escaping of a region.
bool hasTrait(SymbolRef Sym, InvalidationKinds IK) const
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
A class responsible for cleaning up unused symbols.
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)
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)
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)
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)
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)
static void _register(CHECKER *checker, CheckerManager &mgr)
PointerEscapeKind
Describes the different reasons a pointer escapes during analysis.
llvm::DenseSet< SymbolRef > InvalidatedSymbols
The JSON file list parser is used to communicate input to InstallAPI.
We dereferenced a location that may be null.