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>
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>
88 static bool _handlesStmt(
const Stmt *S) {
92 template <
typename CHECKER>
100template <
typename STMT>
102 template <
typename CHECKER>
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>
607 Mgr->_dispatchEvent(event);
#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI, IS_HIDDEN)
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 ...
ProgramPointTag(void *tagKind=nullptr)
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)
clang::BlockEntrance BlockEntrance
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)
CheckerFn< ProgramStateRef(ProgramStateRef, const InvalidatedSymbols *symbols, ArrayRef< const MemRegion * > ExplicitRegions, ArrayRef< const MemRegion * > Regions, const LocationContext *LCtx, const CallEvent *Call)> CheckRegionChangesFunc
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
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)
void _registerDispatcherForEvent()
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)
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.
clang::BlockEntrance BlockEntrance
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
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
const SymExpr * SymbolRef
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
U cast(CodeGen::Address addr)
We dereferenced a location that may be null.