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 LifetimeEndCheckers, LocationCheckers, BindCheckers,
45 BlockEntranceCheckers, EndAnalysisCheckers, BeginFunctionCheckers,
46 EndFunctionCheckers, BranchConditionCheckers, NewAllocatorCheckers,
47 LiveSymbolsCheckers, DeadSymbolsCheckers, RegionChangesCheckers,
48 PointerEscapeCheckers, EvalAssumeCheckers, EvalCallCheckers,
49 EndOfTranslationUnitCheckers);
54 StringRef ExpectedValueDesc)
const {
69 unsigned DeclKind = D->
getKind();
70 auto [CCI, Inserted] = CachedDeclCheckersMap.try_emplace(DeclKind);
71 CachedDeclCheckers *checkers = &(CCI->second);
74 for (
const auto &info : DeclCheckers)
75 if (info.IsForDeclFn(D))
76 checkers->push_back(info.CheckFn);
80 for (
const auto &checker : *checkers)
88 for (
const auto &BodyChecker : BodyCheckers)
89 BodyChecker(D, mgr, BR);
96template <
typename CHECK_CTX>
104 typename CHECK_CTX::CheckersTy::const_iterator
105 I = checkCtx.checkers_begin(), E = checkCtx.checkers_end();
114 for (; I != E; ++I) {
119 CurrSet = (PrevSet == &Tmp1) ? &Tmp2 : &Tmp1;
124 for (
const auto &NI : *PrevSet)
125 checkCtx.runChecker(*I, B, NI);
128 if (CurrSet->
empty())
139 if (!llvm::timeTraceProfilerEnabled())
142 return (Name +
":" + CheckerTag).str();
145 struct CheckStmtContext {
146 using CheckersTy = SmallVectorImpl<CheckerManager::CheckStmtFunc>;
149 const CheckersTy &Checkers;
154 CheckStmtContext(
bool isPreVisit,
const CheckersTy &checkers,
155 const Stmt *s, ExprEngine &eng,
bool wasInlined =
false)
156 : IsPreVisit(isPreVisit), Checkers(checkers), S(s), Eng(eng),
157 WasInlined(wasInlined) {}
159 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
160 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
163 NodeBuilder &Bldr, ExplodedNode *Pred) {
164 llvm::TimeTraceScope TimeScope(checkerScopeName(
"Stmt", checkFn.Checker));
170 CheckerContext
C(Bldr, Eng, Pred, L, WasInlined);
184 CheckStmtContext
C(isPreVisit, getCachedStmtCheckersFor(S, isPreVisit),
186 llvm::TimeTraceScope TimeScope(
187 isPreVisit ?
"CheckerManager::runCheckersForStmt (Pre)"
188 :
"CheckerManager::runCheckersForStmt (Post)");
194 struct CheckObjCMessageContext {
195 using CheckersTy = std::vector<CheckerManager::CheckObjCMessageFunc>;
199 const CheckersTy &Checkers;
204 const CheckersTy &checkers,
207 : Kind(visitKind), WasInlined(wasInlined), Checkers(checkers), Msg(msg),
210 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
211 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
214 NodeBuilder &Bldr, ExplodedNode *Pred) {
215 llvm::TimeTraceScope TimeScope(
216 checkerScopeName(
"ObjCMsg", checkFn.Checker));
220 case ObjCMessageVisitKind::Pre:
223 case ObjCMessageVisitKind::MessageNil:
224 case ObjCMessageVisitKind::Post:
230 CheckerContext
C(Bldr, Eng, Pred, L, WasInlined);
245 const auto &checkers = getObjCMessageCheckers(visitKind);
246 CheckObjCMessageContext
C(visitKind, checkers, msg, Eng, WasInlined);
247 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForObjCMessage");
251const std::vector<CheckerManager::CheckObjCMessageFunc> &
255 return PreObjCMessageCheckers;
258 return PostObjCMessageCheckers;
260 return ObjCMessageNilCheckers;
262 llvm_unreachable(
"Unknown Kind");
269 struct CheckCallContext {
270 using CheckersTy = std::vector<CheckerManager::CheckCallFunc>;
272 bool IsPreVisit, WasInlined;
273 const CheckersTy &Checkers;
277 CheckCallContext(
bool isPreVisit,
const CheckersTy &checkers,
280 : IsPreVisit(isPreVisit), WasInlined(wasInlined), Checkers(checkers),
281 Call(call), Eng(eng) {}
283 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
284 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
287 NodeBuilder &Bldr, ExplodedNode *Pred) {
288 llvm::TimeTraceScope TimeScope(checkerScopeName(
"Call", checkFn.Checker));
290 CheckerContext
C(Bldr, Eng, Pred, L, WasInlined);
305 CheckCallContext
C(isPreVisit,
306 isPreVisit ? PreCallCheckers
308 Call, Eng, WasInlined);
309 llvm::TimeTraceScope TimeScope(
310 isPreVisit ?
"CheckerManager::runCheckersForCallEvent (Pre)"
311 :
"CheckerManager::runCheckersForCallEvent (Post)");
317struct CheckLifetimeEndContext {
318 using CheckersTy = std::vector<CheckerManager::CheckLifetimeEndFunc>;
320 const CheckersTy &Checkers;
324 CheckLifetimeEndContext(
const CheckersTy &checkers,
const VarDecl *
decl,
326 : Checkers(checkers),
Decl(
decl), Eng(eng) {}
328 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
329 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
332 NodeBuilder &Bldr, ExplodedNode *Pred) {
335 CheckerContext
C(Bldr, Eng, Pred, L);
347 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForLifetimeEnd");
348 CheckLifetimeEndContext
C(LifetimeEndCheckers,
Decl, Eng);
354 struct CheckLocationContext {
355 using CheckersTy = std::vector<CheckerManager::CheckLocationFunc>;
357 const CheckersTy &Checkers;
364 CheckLocationContext(
const CheckersTy &checkers,
368 : Checkers(checkers),
Loc(
loc), IsLoad(isLoad), NodeEx(NodeEx),
369 BoundEx(BoundEx), Eng(eng) {}
371 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
372 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
375 NodeBuilder &Bldr, ExplodedNode *Pred) {
376 llvm::TimeTraceScope TimeScope(checkerScopeName(
"Loc", checkFn.Checker));
381 CheckerContext
C(Bldr, Eng, Pred, L);
382 checkFn(Loc, IsLoad, BoundEx,
C);
392 SVal location,
bool isLoad,
396 CheckLocationContext
C(LocationCheckers, location, isLoad, NodeEx,
398 llvm::TimeTraceScope TimeScope(
399 isLoad ?
"CheckerManager::runCheckersForLocation (Load)"
400 :
"CheckerManager::runCheckersForLocation (Store)");
406 struct CheckBindContext {
407 using CheckersTy = std::vector<CheckerManager::CheckBindFunc>;
409 const CheckersTy &Checkers;
417 CheckBindContext(
const CheckersTy &checkers,
SVal loc,
SVal val,
420 : Checkers(checkers),
Loc(
loc), Val(val), S(s), Eng(eng), PP(pp),
421 AtDeclInit(AtDeclInit) {}
423 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
424 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
427 NodeBuilder &Bldr, ExplodedNode *Pred) {
428 llvm::TimeTraceScope TimeScope(checkerScopeName(
"Bind", checkFn.Checker));
430 CheckerContext
C(Bldr, Eng, Pred, L);
432 checkFn(Loc, Val, S, AtDeclInit,
C);
436 llvm::TimeTraceMetadata getTimeTraceBindMetadata(
SVal Val) {
437 assert(llvm::timeTraceProfilerEnabled());
439 llvm::raw_string_ostream
OS(Name);
441 return llvm::TimeTraceMetadata{
OS.str(),
""};
452 CheckBindContext
C(BindCheckers, location, val, S, AtDeclInit, Eng, PP);
453 llvm::TimeTraceScope TimeScope{
454 "CheckerManager::runCheckersForBind",
455 [&val]() {
return getTimeTraceBindMetadata(val); }};
460struct CheckBlockEntranceContext {
462 using CheckersTy = std::vector<CheckBlockEntranceFunc>;
464 const CheckersTy &Checkers;
468 CheckBlockEntranceContext(
const CheckersTy &Checkers,
470 : Checkers(Checkers), Entrance(Entrance), Eng(Eng) {}
472 auto checkers_begin()
const {
return Checkers.begin(); }
473 auto checkers_end()
const {
return Checkers.end(); }
475 void runChecker(CheckBlockEntranceFunc CheckFn, NodeBuilder &Bldr,
476 ExplodedNode *Pred) {
477 llvm::TimeTraceScope TimeScope(
478 checkerScopeName(
"BlockEntrance", CheckFn.Checker));
479 CheckerContext
C(Bldr, Eng, Pred, Entrance.
withTag(CheckFn.Checker));
480 CheckFn(Entrance,
C);
490 CheckBlockEntranceContext
C(BlockEntranceCheckers, Entrance, Eng);
491 llvm::TimeTraceScope TimeScope{
"CheckerManager::runCheckersForBlockEntrance"};
498 for (
const auto &EndAnalysisChecker : EndAnalysisCheckers)
499 EndAnalysisChecker(G, BR, Eng);
504struct CheckBeginFunctionContext {
505 using CheckersTy = std::vector<CheckerManager::CheckBeginFunctionFunc>;
507 const CheckersTy &Checkers;
511 CheckBeginFunctionContext(
const CheckersTy &Checkers,
ExprEngine &Eng,
513 : Checkers(Checkers), Eng(Eng), PP(PP) {}
515 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
516 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
519 NodeBuilder &Bldr, ExplodedNode *Pred) {
520 llvm::TimeTraceScope TimeScope(checkerScopeName(
"Begin", checkFn.Checker));
522 CheckerContext
C(Bldr, Eng, Pred, L);
536 CheckBeginFunctionContext
C(BeginFunctionCheckers, Eng, L);
537 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForBeginFunction");
552 for (
const auto &checkFn : EndFunctionCheckers) {
556 llvm::TimeTraceScope TimeScope(checkerScopeName(
"End", checkFn.Checker));
563 struct CheckBranchConditionContext {
564 using CheckersTy = std::vector<CheckerManager::CheckBranchConditionFunc>;
566 const CheckersTy &Checkers;
570 CheckBranchConditionContext(
const CheckersTy &checkers,
574 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
575 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
578 NodeBuilder &Bldr, ExplodedNode *Pred) {
579 llvm::TimeTraceScope TimeScope(
580 checkerScopeName(
"BranchCond", checkFn.Checker));
583 CheckerContext
C(Bldr, Eng, Pred, L);
597 CheckBranchConditionContext
C(BranchConditionCheckers,
Condition, Eng);
598 llvm::TimeTraceScope TimeScope(
599 "CheckerManager::runCheckersForBranchCondition");
605 struct CheckNewAllocatorContext {
606 using CheckersTy = std::vector<CheckerManager::CheckNewAllocatorFunc>;
608 const CheckersTy &Checkers;
613 CheckNewAllocatorContext(
const CheckersTy &Checkers,
616 : Checkers(Checkers),
Call(
Call), WasInlined(WasInlined), Eng(Eng) {}
618 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
619 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
622 NodeBuilder &Bldr, ExplodedNode *Pred) {
623 llvm::TimeTraceScope TimeScope(
624 checkerScopeName(
"Allocator", checkFn.Checker));
627 CheckerContext
C(Bldr, Eng, Pred, L, WasInlined);
642 CheckNewAllocatorContext
C(NewAllocatorCheckers,
Call, WasInlined, Eng);
643 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForNewAllocator");
650 for (
const auto &LiveSymbolsChecker : LiveSymbolsCheckers)
651 LiveSymbolsChecker(state, SymReaper);
656 struct CheckDeadSymbolsContext {
657 using CheckersTy = std::vector<CheckerManager::CheckDeadSymbolsFunc>;
659 const CheckersTy &Checkers;
665 CheckDeadSymbolsContext(
const CheckersTy &checkers,
SymbolReaper &sr,
668 : Checkers(checkers), SR(sr), S(s), Eng(eng), ProgarmPointKind(K) {}
670 CheckersTy::const_iterator checkers_begin() {
return Checkers.begin(); }
671 CheckersTy::const_iterator checkers_end() {
return Checkers.end(); }
674 NodeBuilder &Bldr, ExplodedNode *Pred) {
675 llvm::TimeTraceScope TimeScope(
676 checkerScopeName(
"DeadSymbols", checkFn.Checker));
678 S, ProgarmPointKind, Pred->
getStackFrame(), checkFn.Checker);
679 CheckerContext
C(Bldr, Eng, Pred, L);
697 CheckDeadSymbolsContext
C(DeadSymbolsCheckers, SymReaper, S, Eng, K);
698 llvm::TimeTraceScope TimeScope(
"CheckerManager::runCheckersForDeadSymbols");
708 for (
const auto &RegionChangesChecker : RegionChangesCheckers) {
713 state = RegionChangesChecker(state, invalidated, ExplicitRegions, Regions,
726 assert((
Call !=
nullptr ||
729 "Call must not be NULL when escaping on call");
730 for (
const auto &PointerEscapeChecker : PointerEscapeCheckers) {
735 State = PointerEscapeChecker(State, Escaped,
Call, Kind, ETraits);
744 for (
const auto &EvalAssumeChecker : EvalAssumeCheckers) {
749 state = EvalAssumeChecker(state,
Cond, Assumption);
761 for (
auto *
const Pred : Src) {
762 std::optional<StringRef> evaluatorChecker;
771 for (
const auto &EvalCallChecker : EvalCallCheckers) {
777 bool evaluated =
false;
782 evaluated = EvalCallChecker(*UpdatedCall,
C);
785 if (evaluated && evaluatorChecker) {
788 llvm::raw_string_ostream
OS(Buf);
792 std::string AssertionMessage = llvm::formatv(
793 "The '{0}' call has been already evaluated by the {1} checker, "
794 "while the {2} checker also tried to evaluate the same call. At "
795 "most one checker supposed to evaluate a call.",
797 EvalCallChecker.Checker->getDebugTag());
798 llvm_unreachable(AssertionMessage.c_str());
802 evaluatorChecker = EvalCallChecker.Checker->getDebugTag();
811 if (!evaluatorChecker) {
823 for (
const auto &EndOfTranslationUnitChecker : EndOfTranslationUnitCheckers)
824 EndOfTranslationUnitChecker(TU, mgr, BR);
832 Indent(Out, Space, IsDot) <<
"\"checker_messages\": ";
836 llvm::raw_svector_ostream TempOut(TempBuf);
837 unsigned int InnerSpace = Space + 2;
841 llvm::raw_svector_ostream NLOut(NewLine);
842 NLOut <<
"\", " << NL;
843 Indent(NLOut, InnerSpace, IsDot) <<
"\"";
846 bool HasMessage =
false;
849 const void *LastCT =
nullptr;
850 for (
const auto &CT : CheckerTags) {
852 CT.second->printState(TempOut, State, NewLine.c_str(),
"");
866 for (
const auto &CT : CheckerTags) {
868 CT.second->printState(TempOut, State, NewLine.c_str(),
"");
873 Indent(Out, Space, IsDot) <<
"{ \"checker\": \"" << CT.second->getDebugTag()
874 <<
"\", \"messages\": [" << NL;
875 Indent(Out, InnerSpace, IsDot)
876 <<
'\"' << TempBuf.str().trim() <<
'\"' << NL;
877 Indent(Out, Space, IsDot) <<
"]}";
888 Indent(Out, --Space, IsDot) <<
"]";
901 DeclCheckerInfo info = { checkfn, isForDeclFn };
902 DeclCheckers.push_back(info);
906 BodyCheckers.push_back(checkfn);
915 StmtCheckerInfo info = { checkfn, isForStmtFn,
true };
916 StmtCheckers.push_back(info);
921 StmtCheckerInfo info = { checkfn, isForStmtFn,
false };
922 StmtCheckers.push_back(info);
926 PreObjCMessageCheckers.push_back(checkfn);
930 ObjCMessageNilCheckers.push_back(checkfn);
934 PostObjCMessageCheckers.push_back(checkfn);
938 PreCallCheckers.push_back(checkfn);
941 PostCallCheckers.push_back(checkfn);
945 LifetimeEndCheckers.push_back(checkfn);
949 LocationCheckers.push_back(checkfn);
953 BindCheckers.push_back(checkfn);
957 BlockEntranceCheckers.push_back(checkfn);
961 EndAnalysisCheckers.push_back(checkfn);
965 BeginFunctionCheckers.push_back(checkfn);
969 EndFunctionCheckers.push_back(checkfn);
974 BranchConditionCheckers.push_back(checkfn);
978 NewAllocatorCheckers.push_back(checkfn);
982 LiveSymbolsCheckers.push_back(checkfn);
986 DeadSymbolsCheckers.push_back(checkfn);
990 RegionChangesCheckers.push_back(checkfn);
994 PointerEscapeCheckers.push_back(checkfn);
999 PointerEscapeCheckers.push_back(checkfn);
1003 EvalAssumeCheckers.push_back(checkfn);
1007 EvalCallCheckers.push_back(checkfn);
1012 EndOfTranslationUnitCheckers.push_back(checkfn);
1019const CheckerManager::CachedStmtCheckers &
1020CheckerManager::getCachedStmtCheckersFor(
const Stmt *S,
bool isPreVisit) {
1024 auto [CCI, Inserted] = CachedStmtCheckersMap.try_emplace(Key);
1025 CachedStmtCheckers &Checkers = CCI->second;
1028 for (
const auto &Info : StmtCheckers)
1029 if (Info.IsPreVisit == isPreVisit && Info.IsForStmtFn(S))
1030 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.
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 StackFrame *SF, 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 ...
std::optional< T > getAs() const
Convert to the specified ProgramPoint type, returning std::nullopt if this ProgramPoint is not of the...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
It represents a stack frame of the call stack.
Stmt - This represents one statement.
StmtClass getStmtClass() const
The top declaration context.
Represents a variable declaration or definition.
BugReporter is a utility class for generating PathDiagnostics for analysis.
Represents the memory allocation call in a C++ new-expression.
Represents an abstract call to a function or method along a particular path.
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)
ProgramStateRef runCheckersForRegionChanges(ProgramStateRef state, const InvalidatedSymbols *invalidated, ArrayRef< const MemRegion * > ExplicitRegions, ArrayRef< const MemRegion * > Regions, const StackFrame *SF, const CallEvent *Call)
Run checkers for region changes.
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
CheckerFn< void(const VarDecl *, CheckerContext &)> CheckLifetimeEndFunc
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.
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)
CheckerFn< ProgramStateRef( ProgramStateRef, const InvalidatedSymbols *symbols, ArrayRef< const MemRegion * > ExplicitRegions, ArrayRef< const MemRegion * > Regions, const StackFrame *SF, const CallEvent *Call)> CheckRegionChangesFunc
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.
void runCheckersForLifetimeEnd(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const VarDecl *Decl, ExprEngine &Eng)
Run checkers for the end of a variable's lifetime.
void _registerForLifetimeEnd(CheckLifetimeEndFunc checkfn)
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
ProgramPoint getLocation() const
getLocation - Returns the edge associated with the given node.
const StackFrame * getStackFrame() 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.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
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().