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");
516 for (
const auto &checkFn : EndFunctionCheckers) {
520 llvm::TimeTraceScope TimeScope(checkerScopeName(
"End", checkFn.Checker));
527 struct CheckBranchConditionContext {
528 using CheckersTy = std::vector<CheckerManager::CheckBranchConditionFunc>;
530 const CheckersTy &Checkers;
534 CheckBranchConditionContext(
const CheckersTy &checkers,
538 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
539 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
542 NodeBuilder &Bldr, ExplodedNode *Pred) {
543 llvm::TimeTraceScope TimeScope(
544 checkerScopeName(
"BranchCond", checkFn.Checker));
547 CheckerContext
C(Bldr, Eng, Pred, L);
561 CheckBranchConditionContext
C(BranchConditionCheckers,
Condition, Eng);
562 llvm::TimeTraceScope TimeScope(
563 "CheckerManager::runCheckersForBranchCondition");
569 struct CheckNewAllocatorContext {
570 using CheckersTy = std::vector<CheckerManager::CheckNewAllocatorFunc>;
572 const CheckersTy &Checkers;
577 CheckNewAllocatorContext(
const CheckersTy &Checkers,
580 : Checkers(Checkers),
Call(
Call), WasInlined(WasInlined), Eng(Eng) {}
582 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
583 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
586 NodeBuilder &Bldr, ExplodedNode *Pred) {
587 llvm::TimeTraceScope TimeScope(
588 checkerScopeName(
"Allocator", checkFn.Checker));
591 CheckerContext
C(Bldr, Eng, Pred, L, WasInlined);
606 CheckNewAllocatorContext
C(NewAllocatorCheckers,
Call, WasInlined, Eng);
607 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForNewAllocator");
614 for (
const auto &LiveSymbolsChecker : LiveSymbolsCheckers)
615 LiveSymbolsChecker(state, SymReaper);
620 struct CheckDeadSymbolsContext {
621 using CheckersTy = std::vector<CheckerManager::CheckDeadSymbolsFunc>;
623 const CheckersTy &Checkers;
629 CheckDeadSymbolsContext(
const CheckersTy &checkers,
SymbolReaper &sr,
632 : Checkers(checkers), SR(sr), S(
s), Eng(eng), ProgarmPointKind(K) {}
634 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
635 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
638 NodeBuilder &Bldr, ExplodedNode *Pred) {
639 llvm::TimeTraceScope TimeScope(
640 checkerScopeName(
"DeadSymbols", checkFn.Checker));
643 CheckerContext
C(Bldr, Eng, Pred, L);
661 CheckDeadSymbolsContext
C(DeadSymbolsCheckers, SymReaper, S, Eng, K);
662 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForDeadSymbols");
674 for (
const auto &RegionChangesChecker : RegionChangesCheckers) {
679 state = RegionChangesChecker(state, invalidated, ExplicitRegions, Regions,
692 assert((
Call !=
nullptr ||
695 "Call must not be NULL when escaping on call");
696 for (
const auto &PointerEscapeChecker : PointerEscapeCheckers) {
701 State = PointerEscapeChecker(State, Escaped,
Call, Kind, ETraits);
710 for (
const auto &EvalAssumeChecker : EvalAssumeCheckers) {
715 state = EvalAssumeChecker(state,
Cond, Assumption);
727 for (
auto *
const Pred : Src) {
728 std::optional<StringRef> evaluatorChecker;
737 for (
const auto &EvalCallChecker : EvalCallCheckers) {
743 bool evaluated =
false;
748 evaluated = EvalCallChecker(*UpdatedCall,
C);
751 if (evaluated && evaluatorChecker) {
754 llvm::raw_string_ostream
OS(Buf);
758 std::string AssertionMessage = llvm::formatv(
759 "The '{0}' call has been already evaluated by the {1} checker, "
760 "while the {2} checker also tried to evaluate the same call. At "
761 "most one checker supposed to evaluate a call.",
763 EvalCallChecker.Checker->getDebugTag());
764 llvm_unreachable(AssertionMessage.c_str());
768 evaluatorChecker = EvalCallChecker.Checker->getDebugTag();
777 if (!evaluatorChecker) {
789 for (
const auto &EndOfTranslationUnitChecker : EndOfTranslationUnitCheckers)
790 EndOfTranslationUnitChecker(TU, mgr, BR);
798 Indent(Out, Space, IsDot) <<
"\"checker_messages\": ";
802 llvm::raw_svector_ostream TempOut(TempBuf);
803 unsigned int InnerSpace = Space + 2;
807 llvm::raw_svector_ostream NLOut(NewLine);
808 NLOut <<
"\", " << NL;
809 Indent(NLOut, InnerSpace, IsDot) <<
"\"";
812 bool HasMessage =
false;
815 const void *LastCT =
nullptr;
816 for (
const auto &CT : CheckerTags) {
818 CT.second->printState(TempOut, State, NewLine.c_str(),
"");
832 for (
const auto &CT : CheckerTags) {
834 CT.second->printState(TempOut, State, NewLine.c_str(),
"");
839 Indent(Out, Space, IsDot) <<
"{ \"checker\": \"" << CT.second->getDebugTag()
840 <<
"\", \"messages\": [" << NL;
841 Indent(Out, InnerSpace, IsDot)
842 <<
'\"' << TempBuf.str().trim() <<
'\"' << NL;
843 Indent(Out, Space, IsDot) <<
"]}";
854 Indent(Out, --Space, IsDot) <<
"]";
867 DeclCheckerInfo info = { checkfn, isForDeclFn };
868 DeclCheckers.push_back(info);
872 BodyCheckers.push_back(checkfn);
881 StmtCheckerInfo info = { checkfn, isForStmtFn,
true };
882 StmtCheckers.push_back(info);
887 StmtCheckerInfo info = { checkfn, isForStmtFn,
false };
888 StmtCheckers.push_back(info);
892 PreObjCMessageCheckers.push_back(checkfn);
896 ObjCMessageNilCheckers.push_back(checkfn);
900 PostObjCMessageCheckers.push_back(checkfn);
904 PreCallCheckers.push_back(checkfn);
907 PostCallCheckers.push_back(checkfn);
911 LocationCheckers.push_back(checkfn);
915 BindCheckers.push_back(checkfn);
919 BlockEntranceCheckers.push_back(checkfn);
923 EndAnalysisCheckers.push_back(checkfn);
927 BeginFunctionCheckers.push_back(checkfn);
931 EndFunctionCheckers.push_back(checkfn);
936 BranchConditionCheckers.push_back(checkfn);
940 NewAllocatorCheckers.push_back(checkfn);
944 LiveSymbolsCheckers.push_back(checkfn);
948 DeadSymbolsCheckers.push_back(checkfn);
952 RegionChangesCheckers.push_back(checkfn);
956 PointerEscapeCheckers.push_back(checkfn);
961 PointerEscapeCheckers.push_back(checkfn);
965 EvalAssumeCheckers.push_back(checkfn);
969 EvalCallCheckers.push_back(checkfn);
974 EndOfTranslationUnitCheckers.push_back(checkfn);
981const CheckerManager::CachedStmtCheckers &
982CheckerManager::getCachedStmtCheckersFor(
const Stmt *S,
bool isPreVisit) {
986 auto [CCI, Inserted] = CachedStmtCheckersMap.try_emplace(Key);
987 CachedStmtCheckers &Checkers = CCI->second;
990 for (
const auto &Info : StmtCheckers)
991 if (Info.IsPreVisit == isPreVisit && Info.IsForStmtFn(S))
992 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
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 runCheckersForEndFunction(ExplodedNodeSet &Dst, ExplodedNode *Pred, ExprEngine &Eng, const ReturnStmt *RS)
Run checkers on end of function.
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 function calls (including methods, constructors, destructors etc.
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.
ExplodedNodeSet is a set of ExplodedNode * elements with the invariant that its elements cannot be nu...
void insert(ExplodedNode *N)
const ProgramStateRef & getState() const
const LocationContext * getLocationContext() const
const NodeBuilderContext & getBuilderContext() const
void defaultEvalCall(NodeBuilder &B, ExplodedNode *Pred, const CallEvent &Call, const EvalCallOptions &CallOpts={})
Default implementation of call evaluation.
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().