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.