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.
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 if a call should be inlined during evalCall().