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 _checkLifetimeEnd(
void *checker,
const VarDecl *D,
213 ((
const CHECKER *)checker)->checkLifetimeEnd(D,
C);
217 template <
typename CHECKER>
220 checker, _checkLifetimeEnd<CHECKER>));
225 template <
typename CHECKER>
226 static void _checkBind(
void *checker,
SVal location,
SVal val,
const Stmt *S,
228 ((
const CHECKER *)checker)->checkBind(location, val, S, AtDeclInit,
C);
232 template <
typename CHECKER>
240 template <
typename CHECKER>
241 static void _checkBlockEntrance(
void *
Checker,
248 template <
typename CHECKER>
251 checker, _checkBlockEntrance<CHECKER>));
256 template <
typename CHECKER>
257 static void _checkEndAnalysis(
void *checker,
ExplodedGraph &G,
259 ((
const CHECKER *)checker)->checkEndAnalysis(G, BR, Eng);
263 template <
typename CHECKER>
271 template <
typename CHECKER>
273 ((
const CHECKER *)checker)->checkBeginFunction(
C);
277 template <
typename CHECKER>
280 checker, _checkBeginFunction<CHECKER>));
285 template <
typename CHECKER>
286 static void _checkEndFunction(
void *checker,
const ReturnStmt *RS,
288 ((
const CHECKER *)checker)->checkEndFunction(RS,
C);
292 template <
typename CHECKER>
300 template <
typename CHECKER>
301 static void _checkBranchCondition(
void *checker,
const Stmt *
Condition,
307 template <
typename CHECKER>
311 _checkBranchCondition<CHECKER>));
316 template <
typename CHECKER>
323 template <
typename CHECKER>
327 _checkNewAllocator<CHECKER>));
332 template <
typename CHECKER>
335 ((
const CHECKER *)checker)->checkLiveSymbols(state, SR);
339 template <
typename CHECKER>
347 template <
typename CHECKER>
348 static void _checkDeadSymbols(
void *checker,
350 ((
const CHECKER *)checker)->checkDeadSymbols(SR,
C);
354 template <
typename CHECKER>
362 template <
typename CHECKER>
369 return ((
const CHECKER *)checker)
370 ->checkRegionChanges(state, invalidated, Explicits, Regions, SF,
Call);
374 template <
typename CHECKER>
378 _checkRegionChanges<CHECKER>));
383 template <
typename CHECKER>
385 _checkPointerEscape(
void *
Checker,
404 RegularEscape.insert(Sym);
406 if (RegularEscape.empty())
416 template <
typename CHECKER>
420 _checkPointerEscape<CHECKER>));
425 template <
typename CHECKER>
427 _checkConstPointerEscape(
void *
Checker,
443 ConstEscape.insert(Sym);
446 if (ConstEscape.empty())
456 template <
typename CHECKER>
460 _checkConstPointerEscape<CHECKER>));
465template <
typename EVENT>
467 template <
typename CHECKER>
468 static void _checkEvent(
void *checker,
const void *event) {
469 ((
const CHECKER *)checker)->checkEvent(*(
const EVENT *)event);
472 template <
typename CHECKER>
484 template <
typename CHECKER>
486 SVal cond,
bool assumption) {
487 return ((
const CHECKER *)checker)->evalAssume(state, cond, assumption);
491 template <
typename CHECKER>
499 template <
typename CHECKER>
506 template <
typename CHECKER>
528 std::optional<CheckerNameRef> Name;
532 assert(!Name &&
"Checker part registered twice!");
549 const char *NL,
const char *Sep)
const;
564template <
typename... CHECKs>
569 template <
typename CHECKER>
571 (CHECKs::_register(Chk, Mgr), ...);
595template <
typename... CHECKs>
600 template <
typename CHECKER>
602 (CHECKs::_register(Chk, Mgr), ...);
606template <
typename EVENT>
612 template <
typename CHECKER>
619 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.
ProgramPointTag(void *tagKind=nullptr)
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
It represents a stack frame of the call stack.
Stmt - This represents one statement.
The top declaration context.
Represents a variable declaration or definition.
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)
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)
void _registerDispatcherForEvent()
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.
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)
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.