26#include "llvm/ADT/SmallVector.h" 
   27#include "llvm/Support/ErrorHandling.h" 
   28#include "llvm/Support/FormatVariadic.h" 
   29#include "llvm/Support/TimeProfiler.h" 
   38  const auto IfAnyAreNonEmpty = [](
const auto &... Callbacks) -> 
bool {
 
   39    return (!Callbacks.empty() || ...);
 
   41  return IfAnyAreNonEmpty(
 
   42      StmtCheckers, PreObjCMessageCheckers, ObjCMessageNilCheckers,
 
   43      PostObjCMessageCheckers, PreCallCheckers, PostCallCheckers,
 
   44      LocationCheckers, BindCheckers, BlockEntranceCheckers,
 
   45      EndAnalysisCheckers, BeginFunctionCheckers, EndFunctionCheckers,
 
   46      BranchConditionCheckers, NewAllocatorCheckers, LiveSymbolsCheckers,
 
   47      DeadSymbolsCheckers, RegionChangesCheckers, PointerEscapeCheckers,
 
   48      EvalAssumeCheckers, EvalCallCheckers, EndOfTranslationUnitCheckers);
 
 
   53    StringRef ExpectedValueDesc)
 const {
 
 
   68  unsigned DeclKind = D->
getKind();
 
   69  auto [CCI, Inserted] = CachedDeclCheckersMap.try_emplace(DeclKind);
 
   70  CachedDeclCheckers *checkers = &(CCI->second);
 
   73    for (
const auto &info : DeclCheckers)
 
   74      if (info.IsForDeclFn(D))
 
   75        checkers->push_back(info.CheckFn);
 
   79  for (
const auto &checker : *checkers)
 
 
   87  for (
const auto &BodyChecker : BodyCheckers)
 
   88    BodyChecker(D, mgr, BR);
 
 
   95template <
typename CHECK_CTX>
 
  103  typename CHECK_CTX::CheckersTy::const_iterator
 
  104      I = checkCtx.checkers_begin(), E = checkCtx.checkers_end();
 
  113  for (; I != E; ++I) {
 
  118      CurrSet = (PrevSet == &Tmp1) ? &Tmp2 : &Tmp1;
 
  123    for (
const auto &NI : *PrevSet)
 
  124      checkCtx.runChecker(*I, B, NI);
 
  127    if (CurrSet->
empty())
 
 
  138  if (!llvm::timeTraceProfilerEnabled())
 
  141  return (Name + 
":" + CheckerTag).str();
 
  144  struct CheckStmtContext {
 
  145    using CheckersTy = SmallVectorImpl<CheckerManager::CheckStmtFunc>;
 
  148    const CheckersTy &Checkers;
 
  153    CheckStmtContext(
bool isPreVisit, 
const CheckersTy &checkers,
 
  154                     const Stmt *
s, ExprEngine &eng, 
bool wasInlined = 
false)
 
  155        : IsPreVisit(isPreVisit), Checkers(checkers), S(
s), Eng(eng),
 
  156          WasInlined(wasInlined) {}
 
  158    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  159    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  162                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  163      llvm::TimeTraceScope TimeScope(checkerScopeName(
"Stmt", checkFn.Checker));
 
  169      CheckerContext 
C(Bldr, Eng, Pred, L, WasInlined);
 
  183  CheckStmtContext 
C(isPreVisit, getCachedStmtCheckersFor(S, isPreVisit),
 
  185  llvm::TimeTraceScope TimeScope(
 
  186      isPreVisit ? 
"CheckerManager::runCheckersForStmt (Pre)" 
  187                 : 
"CheckerManager::runCheckersForStmt (Post)");
 
 
  193  struct CheckObjCMessageContext {
 
  194    using CheckersTy = std::vector<CheckerManager::CheckObjCMessageFunc>;
 
  198    const CheckersTy &Checkers;
 
  203                            const CheckersTy &checkers,
 
  206        : Kind(visitKind), WasInlined(wasInlined), Checkers(checkers), Msg(msg),
 
  209    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  210    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  213                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  214      llvm::TimeTraceScope TimeScope(
 
  215          checkerScopeName(
"ObjCMsg", checkFn.Checker));
 
  219        case ObjCMessageVisitKind::Pre:
 
  222        case ObjCMessageVisitKind::MessageNil:
 
  223        case ObjCMessageVisitKind::Post:
 
  229      CheckerContext 
C(Bldr, Eng, Pred, L, WasInlined);
 
  244  const auto &checkers = getObjCMessageCheckers(visitKind);
 
  245  CheckObjCMessageContext 
C(visitKind, checkers, msg, Eng, WasInlined);
 
  246  llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForObjCMessage");
 
 
  250const std::vector<CheckerManager::CheckObjCMessageFunc> &
 
  254    return PreObjCMessageCheckers;
 
  257    return PostObjCMessageCheckers;
 
  259    return ObjCMessageNilCheckers;
 
  261  llvm_unreachable(
"Unknown Kind");
 
  268  struct CheckCallContext {
 
  269    using CheckersTy = std::vector<CheckerManager::CheckCallFunc>;
 
  271    bool IsPreVisit, WasInlined;
 
  272    const CheckersTy &Checkers;
 
  276    CheckCallContext(
bool isPreVisit, 
const CheckersTy &checkers,
 
  279        : IsPreVisit(isPreVisit), WasInlined(wasInlined), Checkers(checkers),
 
  280          Call(call), Eng(eng) {}
 
  282    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  283    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  286                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  287      llvm::TimeTraceScope TimeScope(checkerScopeName(
"Call", checkFn.Checker));
 
  289      CheckerContext 
C(Bldr, Eng, Pred, L, WasInlined);
 
  304  CheckCallContext 
C(isPreVisit,
 
  305                     isPreVisit ? PreCallCheckers
 
  307                     Call, Eng, WasInlined);
 
  308  llvm::TimeTraceScope TimeScope(
 
  309      isPreVisit ? 
"CheckerManager::runCheckersForCallEvent (Pre)" 
  310                 : 
"CheckerManager::runCheckersForCallEvent (Post)");
 
 
  316  struct CheckLocationContext {
 
  317    using CheckersTy = std::vector<CheckerManager::CheckLocationFunc>;
 
  319    const CheckersTy &Checkers;
 
  326    CheckLocationContext(
const CheckersTy &checkers,
 
  330        : Checkers(checkers), 
Loc(
loc), IsLoad(isLoad), NodeEx(NodeEx),
 
  331          BoundEx(BoundEx), Eng(eng) {}
 
  333    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  334    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  337                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  338      llvm::TimeTraceScope TimeScope(checkerScopeName(
"Loc", checkFn.Checker));
 
  345      CheckerContext 
C(Bldr, Eng, Pred, L);
 
  346      checkFn(Loc, IsLoad, BoundEx, 
C);
 
  356                                            SVal location, 
bool isLoad,
 
  360  CheckLocationContext 
C(LocationCheckers, location, isLoad, NodeEx,
 
  362  llvm::TimeTraceScope TimeScope(
 
  363      isLoad ? 
"CheckerManager::runCheckersForLocation (Load)" 
  364             : 
"CheckerManager::runCheckersForLocation (Store)");
 
 
  370  struct CheckBindContext {
 
  371    using CheckersTy = std::vector<CheckerManager::CheckBindFunc>;
 
  373    const CheckersTy &Checkers;
 
  381    CheckBindContext(
const CheckersTy &checkers, 
SVal loc, 
SVal val,
 
  384        : Checkers(checkers), 
Loc(
loc), Val(val), S(
s), Eng(eng), PP(pp),
 
  385          AtDeclInit(AtDeclInit) {}
 
  387    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  388    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  391                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  392      llvm::TimeTraceScope TimeScope(checkerScopeName(
"Bind", checkFn.Checker));
 
  394      CheckerContext 
C(Bldr, Eng, Pred, L);
 
  396      checkFn(Loc, Val, S, AtDeclInit, 
C);
 
  400  llvm::TimeTraceMetadata getTimeTraceBindMetadata(
SVal Val) {
 
  401    assert(llvm::timeTraceProfilerEnabled());
 
  403    llvm::raw_string_ostream 
OS(Name);
 
  405    return llvm::TimeTraceMetadata{
OS.str(), 
""};
 
  416  CheckBindContext 
C(BindCheckers, location, val, S, AtDeclInit, Eng, PP);
 
  417  llvm::TimeTraceScope TimeScope{
 
  418      "CheckerManager::runCheckersForBind",
 
  419      [&val]() { 
return getTimeTraceBindMetadata(val); }};
 
 
  424struct CheckBlockEntranceContext {
 
  426  using CheckersTy = std::vector<CheckBlockEntranceFunc>;
 
  428  const CheckersTy &Checkers;
 
  432  CheckBlockEntranceContext(
const CheckersTy &Checkers,
 
  434      : Checkers(Checkers), Entrance(Entrance), Eng(Eng) {}
 
  436  auto checkers_begin()
 const { 
return Checkers.begin(); }
 
  437  auto checkers_end()
 const { 
return Checkers.end(); }
 
  439  void runChecker(CheckBlockEntranceFunc CheckFn, NodeBuilder &Bldr,
 
  440                  ExplodedNode *Pred) {
 
  441    llvm::TimeTraceScope TimeScope(
 
  442        checkerScopeName(
"BlockEntrance", CheckFn.Checker));
 
  443    CheckerContext 
C(Bldr, Eng, Pred, Entrance.
withTag(CheckFn.Checker));
 
  444    CheckFn(Entrance, 
C);
 
  454  CheckBlockEntranceContext 
C(BlockEntranceCheckers, Entrance, Eng);
 
  455  llvm::TimeTraceScope TimeScope{
"CheckerManager::runCheckersForBlockEntrance"};
 
 
  462  for (
const auto &EndAnalysisChecker : EndAnalysisCheckers)
 
  463    EndAnalysisChecker(G, BR, Eng);
 
 
  468struct CheckBeginFunctionContext {
 
  469  using CheckersTy = std::vector<CheckerManager::CheckBeginFunctionFunc>;
 
  471  const CheckersTy &Checkers;
 
  475  CheckBeginFunctionContext(
const CheckersTy &Checkers, 
ExprEngine &Eng,
 
  477      : Checkers(Checkers), Eng(Eng), PP(PP) {}
 
  479  CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  480  CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  483                  NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  484    llvm::TimeTraceScope TimeScope(checkerScopeName(
"Begin", checkFn.Checker));
 
  486    CheckerContext 
C(Bldr, Eng, Pred, L);
 
  500  CheckBeginFunctionContext 
C(BeginFunctionCheckers, Eng, L);
 
  501  llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForBeginFunction");
 
 
  517  for (
const auto &checkFn : EndFunctionCheckers) {
 
  521    llvm::TimeTraceScope TimeScope(checkerScopeName(
"End", checkFn.Checker));
 
 
  528  struct CheckBranchConditionContext {
 
  529    using CheckersTy = std::vector<CheckerManager::CheckBranchConditionFunc>;
 
  531    const CheckersTy &Checkers;
 
  535    CheckBranchConditionContext(
const CheckersTy &checkers,
 
  539    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  540    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  543                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  544      llvm::TimeTraceScope TimeScope(
 
  545          checkerScopeName(
"BranchCond", checkFn.Checker));
 
  548      CheckerContext 
C(Bldr, Eng, Pred, L);
 
  562  CheckBranchConditionContext 
C(BranchConditionCheckers, 
Condition, Eng);
 
  563  llvm::TimeTraceScope TimeScope(
 
  564      "CheckerManager::runCheckersForBranchCondition");
 
 
  570  struct CheckNewAllocatorContext {
 
  571    using CheckersTy = std::vector<CheckerManager::CheckNewAllocatorFunc>;
 
  573    const CheckersTy &Checkers;
 
  578    CheckNewAllocatorContext(
const CheckersTy &Checkers,
 
  581        : Checkers(Checkers), 
Call(
Call), WasInlined(WasInlined), Eng(Eng) {}
 
  583    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  584    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  587                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  588      llvm::TimeTraceScope TimeScope(
 
  589          checkerScopeName(
"Allocator", checkFn.Checker));
 
  592      CheckerContext 
C(Bldr, Eng, Pred, L, WasInlined);
 
  607  CheckNewAllocatorContext 
C(NewAllocatorCheckers, 
Call, WasInlined, Eng);
 
  608  llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForNewAllocator");
 
 
  615  for (
const auto &LiveSymbolsChecker : LiveSymbolsCheckers)
 
  616    LiveSymbolsChecker(state, SymReaper);
 
 
  621  struct CheckDeadSymbolsContext {
 
  622    using CheckersTy = std::vector<CheckerManager::CheckDeadSymbolsFunc>;
 
  624    const CheckersTy &Checkers;
 
  630    CheckDeadSymbolsContext(
const CheckersTy &checkers, 
SymbolReaper &sr,
 
  633        : Checkers(checkers), SR(sr), S(
s), Eng(eng), ProgarmPointKind(K) {}
 
  635    CheckersTy::const_iterator checkers_begin() { 
return Checkers.begin(); }
 
  636    CheckersTy::const_iterator checkers_end() { 
return Checkers.end(); }
 
  639                    NodeBuilder &Bldr, ExplodedNode *Pred) {
 
  640      llvm::TimeTraceScope TimeScope(
 
  641          checkerScopeName(
"DeadSymbols", checkFn.Checker));
 
  644      CheckerContext 
C(Bldr, Eng, Pred, L);
 
  662  CheckDeadSymbolsContext 
C(DeadSymbolsCheckers, SymReaper, S, Eng, K);
 
  663  llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForDeadSymbols");
 
 
  675  for (
const auto &RegionChangesChecker : RegionChangesCheckers) {
 
  680    state = RegionChangesChecker(state, invalidated, ExplicitRegions, Regions,
 
 
  693  assert((
Call != 
nullptr ||
 
  696         "Call must not be NULL when escaping on call");
 
  697  for (
const auto &PointerEscapeChecker : PointerEscapeCheckers) {
 
  702    State = PointerEscapeChecker(State, Escaped, 
Call, Kind, ETraits);
 
 
  711  for (
const auto &EvalAssumeChecker : EvalAssumeCheckers) {
 
  716    state = EvalAssumeChecker(state, 
Cond, Assumption);
 
 
  728  for (
auto *
const Pred : Src) {
 
  729    std::optional<StringRef> evaluatorChecker;
 
  738    for (
const auto &EvalCallChecker : EvalCallCheckers) {
 
  744      bool evaluated = 
false;
 
  749        evaluated = EvalCallChecker(*UpdatedCall, 
C);
 
  752      if (evaluated && evaluatorChecker) {
 
  755          llvm::raw_string_ostream 
OS(Buf);
 
  759        std::string AssertionMessage = llvm::formatv(
 
  760            "The '{0}' call has been already evaluated by the {1} checker, " 
  761            "while the {2} checker also tried to evaluate the same call. At " 
  762            "most one checker supposed to evaluate a call.",
 
  764            EvalCallChecker.Checker->getDebugTag());
 
  765        llvm_unreachable(AssertionMessage.c_str());
 
  769        evaluatorChecker = EvalCallChecker.Checker->getDebugTag();
 
  778    if (!evaluatorChecker) {
 
 
  790  for (
const auto &EndOfTranslationUnitChecker : EndOfTranslationUnitCheckers)
 
  791    EndOfTranslationUnitChecker(TU, mgr, BR);
 
 
  799  Indent(Out, Space, IsDot) << 
"\"checker_messages\": ";
 
  803  llvm::raw_svector_ostream TempOut(TempBuf);
 
  804  unsigned int InnerSpace = Space + 2;
 
  808  llvm::raw_svector_ostream NLOut(NewLine);
 
  809  NLOut << 
"\", " << NL;                     
 
  810  Indent(NLOut, InnerSpace, IsDot) << 
"\"";  
 
  813  bool HasMessage = 
false;
 
  816  const void *LastCT = 
nullptr;
 
  817  for (
const auto &CT : CheckerTags) {
 
  819    CT.second->printState(TempOut, State, NewLine.c_str(), 
"");
 
  833  for (
const auto &CT : CheckerTags) {
 
  835    CT.second->printState(TempOut, State, NewLine.c_str(), 
"");
 
  840    Indent(Out, Space, IsDot) << 
"{ \"checker\": \"" << CT.second->getDebugTag()
 
  841                              << 
"\", \"messages\": [" << NL;
 
  842    Indent(Out, InnerSpace, IsDot)
 
  843        << 
'\"' << TempBuf.str().trim() << 
'\"' << NL;
 
  844    Indent(Out, Space, IsDot) << 
"]}";
 
  855    Indent(Out, --Space, IsDot) << 
"]";
 
 
  868  DeclCheckerInfo info = { checkfn, isForDeclFn };
 
  869  DeclCheckers.push_back(info);
 
 
  873  BodyCheckers.push_back(checkfn);
 
 
  882  StmtCheckerInfo info = { checkfn, isForStmtFn, 
true };
 
  883  StmtCheckers.push_back(info);
 
 
  888  StmtCheckerInfo info = { checkfn, isForStmtFn, 
false };
 
  889  StmtCheckers.push_back(info);
 
 
  893  PreObjCMessageCheckers.push_back(checkfn);
 
 
  897  ObjCMessageNilCheckers.push_back(checkfn);
 
 
  901  PostObjCMessageCheckers.push_back(checkfn);
 
 
  905  PreCallCheckers.push_back(checkfn);
 
 
  908  PostCallCheckers.push_back(checkfn);
 
 
  912  LocationCheckers.push_back(checkfn);
 
 
  916  BindCheckers.push_back(checkfn);
 
 
  920  BlockEntranceCheckers.push_back(checkfn);
 
 
  924  EndAnalysisCheckers.push_back(checkfn);
 
 
  928  BeginFunctionCheckers.push_back(checkfn);
 
 
  932  EndFunctionCheckers.push_back(checkfn);
 
 
  937  BranchConditionCheckers.push_back(checkfn);
 
 
  941  NewAllocatorCheckers.push_back(checkfn);
 
 
  945  LiveSymbolsCheckers.push_back(checkfn);
 
 
  949  DeadSymbolsCheckers.push_back(checkfn);
 
 
  953  RegionChangesCheckers.push_back(checkfn);
 
 
  957  PointerEscapeCheckers.push_back(checkfn);
 
 
  962  PointerEscapeCheckers.push_back(checkfn);
 
 
  966  EvalAssumeCheckers.push_back(checkfn);
 
 
  970  EvalCallCheckers.push_back(checkfn);
 
 
  975  EndOfTranslationUnitCheckers.push_back(checkfn);
 
 
  982const CheckerManager::CachedStmtCheckers &
 
  983CheckerManager::getCachedStmtCheckersFor(
const Stmt *S, 
bool isPreVisit) {
 
  987  auto [CCI, Inserted] = CachedStmtCheckersMap.try_emplace(Key);
 
  988  CachedStmtCheckers &Checkers = CCI->second;
 
  991    for (
const auto &Info : StmtCheckers)
 
  992      if (Info.IsPreVisit == isPreVisit && Info.IsForStmtFn(S))
 
  993        Checkers.push_back(Info.CheckFn);
 
static void expandGraphWithCheckers(CHECK_CTX checkCtx, ExplodedNodeSet &Dst, const ExplodedNodeSet &Src)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
__device__ __2f16 float __ockl_bool s
Decl - This represents one declaration (or definition), e.g.
virtual bool hasBody() const
Returns true if this Decl represents a declaration for a body of code, such as a function or method d...
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
static ProgramPoint getProgramPoint(const Stmt *S, ProgramPoint::Kind K, const LocationContext *LC, const ProgramPointTag *tag)
ProgramPoint withTag(const ProgramPointTag *tag) const
Create a new ProgramPoint object that is the same as the original except for using the specified tag ...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Stmt - This represents one statement.
StmtClass getStmtClass() const
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.
CallEventRef< T > cloneWithState(ProgramStateRef NewState) const
Returns a copy of this CallEvent, but using the given state.
ProgramPoint getProgramPoint(bool IsPreVisit=false, const ProgramPointTag *Tag=nullptr) const
Returns an appropriate ProgramPoint for this call.
CheckerBackend is an abstract base class that serves as the common ancestor of all the Checker<....
StringRef getDebugTag() const override
Attached to nodes created by this checker class when the ExplodedGraph is dumped for debugging.
A CheckerFrontend instance is what the user recognizes as "one checker": it has a public canonical na...
CheckerNameRef getName() const
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
bool(*)(const Decl *D) HandlesDeclFunc
void runCheckersForObjCMessage(ObjCMessageVisitKind visitKind, ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const ObjCMethodCall &msg, ExprEngine &Eng, bool wasInlined=false)
Run checkers for visiting obj-c messages.
void runCheckersOnASTDecl(const Decl *D, AnalysisManager &mgr, BugReporter &BR)
Run checkers handling Decls.
void _registerForDecl(CheckDeclFunc checkfn, HandlesDeclFunc isForDeclFn)
CheckerFn< void(const ReturnStmt *, CheckerContext &)> CheckEndFunctionFunc
CheckerFn< void(const Stmt *, CheckerContext &)> CheckBranchConditionFunc
void _registerForPreObjCMessage(CheckObjCMessageFunc checkfn)
void runCheckersOnEndOfTranslationUnit(const TranslationUnitDecl *TU, AnalysisManager &mgr, BugReporter &BR)
Run checkers for the entire Translation Unit.
CheckerFn< bool(const CallEvent &, CheckerContext &)> EvalCallFunc
void runCheckersForEndFunction(NodeBuilderContext &BC, ExplodedNodeSet &Dst, ExplodedNode *Pred, ExprEngine &Eng, const ReturnStmt *RS)
Run checkers on end of function.
CheckerFn< void(CheckerContext &)> CheckBeginFunctionFunc
CheckerFn< void(ExplodedGraph &, BugReporter &, ExprEngine &)> CheckEndAnalysisFunc
void _registerForEvalAssume(EvalAssumeFunc checkfn)
void _registerForEndAnalysis(CheckEndAnalysisFunc checkfn)
void _registerForBody(CheckDeclFunc checkfn)
DiagnosticsEngine & getDiagnostics() const
void runCheckersForLocation(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, SVal location, bool isLoad, const Stmt *NodeEx, const Stmt *BoundEx, ExprEngine &Eng)
Run checkers for load/store of a location.
CheckerFn< void(const Stmt *, CheckerContext &)> CheckStmtFunc
CheckerFn< void(SVal location, SVal val, const Stmt *S, bool AtDeclInit, CheckerContext &)> CheckBindFunc
void runCheckersForBind(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, SVal location, SVal val, const Stmt *S, bool AtDeclInit, ExprEngine &Eng, const ProgramPoint &PP)
Run checkers for binding of a value to a location.
void reportInvalidCheckerOptionValue(const CheckerFrontend *Checker, StringRef OptionName, StringRef ExpectedValueDesc) const
Emits an error through a DiagnosticsEngine about an invalid user supplied checker option value.
void runCheckersForEndAnalysis(ExplodedGraph &G, BugReporter &BR, ExprEngine &Eng)
Run checkers for end of analysis.
CheckerFn< void(const CXXAllocatorCall &Call, CheckerContext &)> CheckNewAllocatorFunc
void runCheckersForPrintStateJson(raw_ostream &Out, ProgramStateRef State, const char *NL="\n", unsigned int Space=0, bool IsDot=false) const
Run checkers for debug-printing a ProgramState.
void _registerForDeadSymbols(CheckDeadSymbolsFunc checkfn)
void runCheckersForDeadSymbols(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, SymbolReaper &SymReaper, const Stmt *S, ExprEngine &Eng, ProgramPoint::Kind K)
Run checkers for dead symbols.
ProgramStateRef runCheckersForRegionChanges(ProgramStateRef state, const InvalidatedSymbols *invalidated, ArrayRef< const MemRegion * > ExplicitRegions, ArrayRef< const MemRegion * > Regions, const LocationContext *LCtx, const CallEvent *Call)
Run checkers for region changes.
void _registerForPostObjCMessage(CheckObjCMessageFunc checkfn)
void _registerForRegionChanges(CheckRegionChangesFunc checkfn)
bool hasPathSensitiveCheckers() const
void _registerForBind(CheckBindFunc checkfn)
void runCheckersForLiveSymbols(ProgramStateRef state, SymbolReaper &SymReaper)
Run checkers for live symbols.
void _registerForPointerEscape(CheckPointerEscapeFunc checkfn)
CheckerFn< void(const TranslationUnitDecl *, AnalysisManager &, BugReporter &)> CheckEndOfTranslationUnit
void _registerForPreStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
void runCheckersForEvalCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const CallEvent &CE, ExprEngine &Eng, const EvalCallOptions &CallOpts)
Run checkers for evaluating a call.
void _registerForPostStmt(CheckStmtFunc checkfn, HandlesStmtFunc isForStmtFn)
void runCheckersForBeginFunction(ExplodedNodeSet &Dst, const BlockEdge &L, ExplodedNode *Pred, ExprEngine &Eng)
Run checkers on beginning of function.
void runCheckersForNewAllocator(const CXXAllocatorCall &Call, ExplodedNodeSet &Dst, ExplodedNode *Pred, ExprEngine &Eng, bool wasInlined=false)
Run checkers between C++ operator new and constructor calls.
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 runCheckersForBlockEntrance(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const BlockEntrance &Entrance, ExprEngine &Eng) const
Run checkers after taking a control flow edge.
void runCheckersForStmt(bool isPreVisit, ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const Stmt *S, ExprEngine &Eng, bool wasInlined=false)
Run checkers for visiting Stmts.
void _registerForEvalCall(EvalCallFunc checkfn)
void _registerForEndFunction(CheckEndFunctionFunc checkfn)
void _registerForBlockEntrance(CheckBlockEntranceFunc checkfn)
void runCheckersForBranchCondition(const Stmt *condition, ExplodedNodeSet &Dst, ExplodedNode *Pred, ExprEngine &Eng)
Run checkers for branch condition.
CheckerFn< void(const ObjCMethodCall &, CheckerContext &)> CheckObjCMessageFunc
void _registerForLocation(CheckLocationFunc checkfn)
ProgramStateRef runCheckersForPointerEscape(ProgramStateRef State, const InvalidatedSymbols &Escaped, const CallEvent *Call, PointerEscapeKind Kind, RegionAndSymbolInvalidationTraits *ITraits)
Run checkers when pointers escape.
void _registerForConstPointerEscape(CheckPointerEscapeFunc checkfn)
CheckerFn< void(const BlockEntrance &, CheckerContext &)> CheckBlockEntranceFunc
CheckerFn< void(ProgramStateRef, SymbolReaper &)> CheckLiveSymbolsFunc
void runCheckersForCallEvent(bool isPreVisit, ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const CallEvent &Call, ExprEngine &Eng, bool wasInlined=false)
Run checkers for visiting obj-c messages.
bool(*)(const Stmt *D) HandlesStmtFunc
void _registerForPostCall(CheckCallFunc checkfn)
void runCheckersOnASTBody(const Decl *D, AnalysisManager &mgr, BugReporter &BR)
Run checkers handling Decls containing a Stmt body.
ProgramStateRef runCheckersForEvalAssume(ProgramStateRef state, SVal Cond, bool Assumption)
Run checkers for handling assumptions on symbolic values.
Simple checker classes that implement one frontend (i.e.
void insert(const ExplodedNodeSet &S)
const ProgramStateRef & getState() const
const LocationContext * getLocationContext() const
void defaultEvalCall(NodeBuilder &B, ExplodedNode *Pred, const CallEvent &Call, const EvalCallOptions &CallOpts={})
Default implementation of call evaluation.
const NodeBuilderContext & getBuilderContext()
This is the simplest builder which generates nodes in the ExplodedGraph.
Represents any expression that calls an Objective-C method.
Information about invalidation for a particular region/symbol.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
void dumpToStream(raw_ostream &OS) const
A class responsible for cleaning up unused symbols.
PointerEscapeKind
Describes the different reasons a pointer escapes during analysis.
@ PSK_DirectEscapeOnCall
The pointer has been passed to a function call directly.
@ PSK_IndirectEscapeOnCall
The pointer has been passed to a function indirectly.
llvm::DenseSet< SymbolRef > InvalidatedSymbols
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
const Fact * ProgramPoint
A ProgramPoint identifies a location in the CFG by pointing to a specific Fact.
The JSON file list parser is used to communicate input to InstallAPI.
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
U cast(CodeGen::Address addr)
Hints for figuring out of a call should be inlined during evalCall().