25#include "llvm/ADT/STLExtras.h"
26#include "llvm/ADT/Sequence.h"
27#include "llvm/Support/Casting.h"
41 state = createTemporaryRegionIfNeeded(state, LCtx, tempExpr, ME);
50 bool AlwaysReturnsLValue;
53 assert(Ctor->getDecl()->isTrivial());
54 assert(Ctor->getDecl()->isCopyOrMoveConstructor());
55 ThisVal = Ctor->getCXXThisVal();
57 AlwaysReturnsLValue =
false;
64 AlwaysReturnsLValue =
true;
77 const Expr *VExpr =
Call.getArgExpr(0);
81 if (std::optional<Loc> L =
V.getAs<
Loc>())
84 assert(
V.isUnknownOrUndef());
90 evalBind(Dst,
CallExpr, N, ThisVal,
V, !AlwaysReturnsLValue);
99 PostStmt PS(CallExpr, LCtx);
100 for (ExplodedNode *N : Dst) {
102 if (AlwaysReturnsLValue)
103 State = State->BindExpr(CallExpr, LCtx, ThisVal);
111 QualType &Ty,
bool &IsArray,
unsigned Idx) {
112 SValBuilder &SVB = State->getStateManager().getSValBuilder();
117 Ty = AT->getElementType();
118 AT = dyn_cast<ArrayType>(AT->getElementType());
145 const auto *DS = DSCC->getDeclStmt();
148 return makeElementRegion(State, State->getLValue(Var, LCtx), Ty,
154 const auto *
Init = ICC->getCXXCtorInitializer();
157 SVal ThisVal = State->getSVal(ThisPtr);
158 if (
Init->isBaseInitializer()) {
161 Init->getBaseClass()->getAsCXXRecordDecl();
162 const auto *BaseReg =
163 MRMgr.getCXXBaseObjectRegion(BaseClass, ThisReg,
164 Init->isBaseVirtual());
167 if (
Init->isDelegatingInitializer())
172 if (
Init->isIndirectMemberInitializer()) {
173 Field =
Init->getIndirectMember();
174 FieldVal = State->getLValue(
Init->getIndirectMember(), ThisVal);
176 Field =
Init->getMember();
177 FieldVal = State->getLValue(
Init->getMember(), ThisVal);
185 if (AMgr.getAnalyzerOptions().MayInlineCXXAllocator) {
187 const auto *NE = NECC->getCXXNewExpr();
190 dyn_cast_or_null<SubRegion>(
V.getAsRegion())) {
194 auto Ty = NE->getType()->getPointeeType();
195 while (
const auto *AT =
getContext().getAsArrayType(Ty))
196 Ty = AT->getElementType();
198 auto R = MRMgr.getElementRegion(Ty, svalBuilder.makeArrayIndex(Idx),
228 CallerLCtx = CallerLCtx->getParent();
235 RTC->getConstructionContext(), CallOpts);
249 static const int TopLevelSymRegionTag = 0;
250 const Expr *RetE = RCC->getReturnStmt()->getRetValue();
251 assert(RetE &&
"Void returns should not have a construction context");
257 llvm_unreachable(
"Unhandled return value construction context!");
260 assert(AMgr.getAnalyzerOptions().ShouldElideConstructors);
274 TCC->getConstructorAfterElision(), State, NumVisitedCaller, LCtx,
275 TCC->getConstructionContextAfterElision(), CallOpts);
285 CallOpts = PreElideCallOpts;
298 if (!VD->getType()->isReferenceType()) {
309 MRMgr.getCXXStaticLifetimeExtendedObjectRegion(E, VD));
312 MRMgr.getCXXLifetimeExtendedObjectRegion(E, VD, LCtx));
325 MRMgr.getCXXTempObjectRegion(LCC->getInitializer(), LCtx));
327 const auto *CE = dyn_cast_or_null<CXXConstructExpr>(E);
330 Base = State->getLValue(E->
getType(), svalBuilder.makeArrayIndex(Idx),
341 const Expr *E = ACC->getCallLikeExpr();
342 unsigned Idx = ACC->getIndex();
345 auto getArgLoc = [&](
CallEventRef<> Caller) -> std::optional<SVal> {
347 Caller->getCalleeStackFrame(NumVisitedCaller);
366 *Caller->getAdjustedParameterIndex(Idx), NumVisitedCaller);
373 if (
const auto *CE = dyn_cast<CallExpr>(E)) {
376 if (std::optional<SVal>
V = getArgLoc(Caller))
380 }
else if (
const auto *CCE = dyn_cast<CXXConstructExpr>(E)) {
385 if (std::optional<SVal>
V = getArgLoc(Caller))
389 }
else if (
const auto *ME = dyn_cast<ObjCMessageExpr>(E)) {
392 if (std::optional<SVal>
V = getArgLoc(Caller))
418 assert(CC &&
"Computed target region without construction context?");
423 return addObjectUnderConstruction(State, DSCC->getDeclStmt(), LCtx,
V);
428 const auto *
Init = ICC->getCXXCtorInitializer();
430 assert(
Init->isAnyMemberInitializer() &&
431 "Base and delegating initializers should have been handled by"
432 "computeObjectUnderConstruction()");
433 return addObjectUnderConstruction(State,
Init, LCtx,
V);
449 assert(RTC &&
"Could not have had a target region without it");
459 RTC->getConstructionContext(), CallOpts);
462 assert(AMgr.getAnalyzerOptions().ShouldElideConstructors);
466 V, TCC->getConstructorAfterElision(), State, LCtx,
467 TCC->getConstructionContextAfterElision(), CallOpts);
470 State = addObjectUnderConstruction(
471 State, TCC->getConstructorAfterElision(), LCtx,
V);
474 if (
const auto *BTE = TCC->getCXXBindTemporaryExpr())
475 State = elideDestructor(State, BTE, LCtx);
479 if (
const auto *MTE = TCC->getMaterializedTemporaryExpr())
480 State = addObjectUnderConstruction(State, MTE, LCtx,
V);
490 if (
const auto *BTE = TCC->getCXXBindTemporaryExpr())
491 State = addObjectUnderConstruction(State, BTE, LCtx,
V);
493 if (
const auto *MTE = TCC->getMaterializedTemporaryExpr())
494 State = addObjectUnderConstruction(State, MTE, LCtx,
V);
503 if (
const auto *EL = dyn_cast_or_null<ElementRegion>(
V.getAsRegion()))
506 return addObjectUnderConstruction(
507 State, {LCC->getLambdaExpr(), LCC->getIndex()}, LCtx,
V);
511 if (
const auto *BTE = ACC->getCXXBindTemporaryExpr())
512 State = addObjectUnderConstruction(State, BTE, LCtx,
V);
514 return addObjectUnderConstruction(
515 State, {ACC->getCallLikeExpr(), ACC->getIndex()}, LCtx,
V);
518 llvm_unreachable(
"Unhandled construction context!");
536 const auto *SourceArrayRegion =
541 return State->BindExpr(Ctor->getArg(0), LCtx,
545void ExprEngine::handleConstructor(
const Expr *E,
548 const auto *CE = dyn_cast<CXXConstructExpr>(E);
549 const auto *CIE = dyn_cast<CXXInheritedCtorInitExpr>(E);
555 SVal
Target = UnknownVal();
558 if (std::optional<SVal> ElidedTarget =
564 NodeBuilder Bldr(Pred, destNodes, *currBldrCtx);
565 State = finishObjectConstruction(State, CE, LCtx);
566 if (
auto L =
Target.getAs<Loc>())
567 State = State->BindExpr(CE, LCtx, State->getSVal(*L, CE->getType()));
573 EvalCallOptions CallOpts;
576 const ConstructionContext *CC =
C ?
C->getConstructionContext() :
nullptr;
579 CE ? CE->getConstructionKind() : CIE->getConstructionKind();
583 assert(CE && !CIE &&
"A complete constructor is inherited?!");
590 if (CE->getType()->isArrayType() || AILE) {
592 auto isZeroSizeArray = [&] {
595 if (
const auto *CAT = dyn_cast<ConstantArrayType>(CE->getType()))
604 if (isZeroSizeArray()) {
605 NodeBuilder Bldr(Pred, destNodes, *currBldrCtx);
606 static SimpleProgramPointTag T{
"ExprEngine",
607 "Skipping 0 size array construction"};
613 State = setIndexOfElementToConstruct(State, CE, LCtx, Idx + 1);
619 State = setPendingInitLoop(
621 getContext().getArrayInitLoopExprElementCount(AILE));
624 State, AILE, LCtx, svalBuilder.makeArrayIndex(Idx));
629 CE, State, currBldrCtx, LCtx, CC, CallOpts, Idx);
635 const auto *OuterCtor = dyn_cast_or_null<CXXConstructExpr>(
641 (
"This virtual base should have already been initialized by "
642 "the most derived class!"));
658 if (isa_and_nonnull<InitListExpr, CXXParenListInitExpr>(
661 Target = loc::MemRegionVal(MRMgr.getCXXTempObjectRegion(E, LCtx));
670 SVal ThisVal = State->getSVal(ThisPtr);
686 static SimpleProgramPointTag T(
"ExprEngine",
687 "Prepare for object construction");
688 ExplodedNodeSet DstPrepare;
689 NodeBuilder BldrPrepare(Pred, DstPrepare, *currBldrCtx);
696 const MemRegion *TargetRegion =
Target.getAsRegion();
698 CallEventRef<>
Call =
704 ExplodedNodeSet DstPreVisit;
707 ExplodedNodeSet PreInitialized;
710 NodeBuilder Bldr(DstPreVisit, PreInitialized, *currBldrCtx);
711 for (ExplodedNode *N : DstPreVisit) {
713 if (CE->requiresZeroInitialization()) {
726 const CXXRecordDecl *TargetHeldRecord =
727 dyn_cast_or_null<CXXRecordDecl>(CE->getType()->getAsRecordDecl());
729 if (!TargetHeldRecord || !TargetHeldRecord->
isEmpty())
730 State = State->bindDefaultZero(
Target, LCtx);
737 PreInitialized = DstPreVisit;
740 ExplodedNodeSet DstPreCall;
744 ExplodedNodeSet DstEvaluated;
746 if (CE && CE->getConstructor()->isTrivial() &&
747 CE->getConstructor()->isCopyOrMoveConstructor() &&
749 NodeBuilder Bldr(DstPreCall, DstEvaluated, *currBldrCtx);
751 for (ExplodedNode *N : DstPreCall)
752 performTrivialCopy(Bldr, N, *
Call);
755 for (ExplodedNode *N : DstPreCall)
767 ExplodedNodeSet DstEvaluatedPostProcessed;
768 NodeBuilder Bldr(DstEvaluated, DstEvaluatedPostProcessed, *currBldrCtx);
771 if (llvm::isa_and_nonnull<CXXTempObjectRegion,
772 CXXLifetimeExtendedObjectRegion>(TargetRegion) &&
775 ->isAnyDestructorNoReturn()) {
784 assert(!DstEvaluated.
empty() &&
785 "We should not have inlined this constructor!");
787 for (ExplodedNode *N : DstEvaluated) {
798 ExplodedNodeSet DstPostArgumentCleanup;
799 for (ExplodedNode *I : DstEvaluatedPostProcessed)
800 finishArgumentConstruction(DstPostArgumentCleanup, I, *
Call);
804 ExplodedNodeSet DstPostCall;
806 DstPostArgumentCleanup,
814 handleConstructor(CE, Pred, Dst);
820 handleConstructor(CE, Pred, Dst);
830 assert(S &&
"A destructor without a trigger!");
835 assert(
RecordDecl &&
"Only CXXRecordDecls should have destructors");
858 if (
const Expr *E = dyn_cast_or_null<Expr>(S)) {
874 Call->getSourceRange().getBegin(),
875 "Error evaluating destructor");
882 NodeBuilder Bldr(DstPreCall, DstInvalidated, *currBldrCtx);
897 "Error evaluating New Allocator Call");
907 NodeBuilder CallBldr(DstPreCall, DstPostCall, *currBldrCtx);
924 NodeBuilder ValueBldr(DstPostCall, DstPostValue, *currBldrCtx);
936 SVal RetVal = State->getSVal(CNE, LCtx);
941 State = State->bindDefaultInitial(RetVal,
UndefinedVal{}, LCtx);
953 if (!ProtoType->isNothrow())
958 CNE, I, addObjectUnderConstruction(State, CNE, LCtx, RetVal));
963 DstPostValue, *
Call, *
this);
981 bool IsStandardGlobalOpNewFunction =
987 if (AMgr.getAnalyzerOptions().MayInlineCXXAllocator) {
989 State = finishObjectConstruction(State, CNE, LCtx);
996 if (IsStandardGlobalOpNewFunction)
1000 symVal = svalBuilder.conjureSymbolVal(
1008 if (!AMgr.getAnalyzerOptions().MayInlineCXXAllocator) {
1013 State =
Call->invalidateRegions(blockCount, State);
1025 if (!ProtoType->isNothrow())
1027 State = State->assume(*dSymVal,
true);
1036 if (
const auto *NewReg = cast_or_null<SubRegion>(symVal.
getAsRegion())) {
1042 isa_and_nonnull<InitListExpr, CXXParenListInitExpr>(
Init);
1047 MRMgr.getElementRegion(ObjTy, svalBuilder.makeArrayIndex(0), NewReg,
1048 svalBuilder.getContext());
1059 evalBind(evaluated, CNE, Pred,
Result,
V,
true);
1064 Pred = *evaluated.
begin();
1086 State = State->BindExpr(CNE, LCtx,
Result);
1097 evalBind(Dst, CNE, NewN,
Result, State->getSVal(
Init, LCtx),
1098 IsStandardGlobalOpNewFunction);
1114 if (AMgr.getAnalyzerOptions().MayInlineCXXAllocator) {
1115 NodeBuilder Bldr(DstPreCall, DstPostCall, *currBldrCtx);
1124 DstPostCall = std::move(DstPreCall);
1141 state = state->bindLoc(state->getLValue(VD, LCtx),
V, LCtx);
1154 svalBuilder.getRegionManager().getCXXThisRegion(
1168 const MemRegion *R = svalBuilder.getRegionManager().getCXXTempObjectRegion(
1176 for (
auto const [Idx, FieldForCapture, InitExpr] :
1177 llvm::zip(llvm::seq<unsigned>(0, -1), LE->getLambdaClass()->fields(),
1178 LE->capture_inits())) {
1179 SVal FieldLoc = State->getLValue(FieldForCapture,
V);
1182 if (!FieldForCapture->hasCapturedVLAType()) {
1183 assert(InitExpr &&
"Capture missing initialization expression");
1189 const auto FTy = FieldForCapture->getType();
1190 if (FTy->isConstantArrayType() &&
1192 getContext().getAsConstantArrayType(FTy)) == 0)
1198 if (
const auto OUC =
1200 InitVal = State->getSVal(OUC->getAsRegion());
1202 State = finishObjectConstruction(State, {LE, Idx}, LocCtxt);
1204 InitVal = State->getSVal(InitExpr, LocCtxt);
1209 "VLA capture by value is a compile time error!");
1214 Expr *SizeExpr = FieldForCapture->getCapturedVLAType()->getSizeExpr();
1215 InitVal = State->getSVal(SizeExpr, LocCtxt);
1218 State = State->bindLoc(FieldLoc, InitVal, LocCtxt);
1224 SVal LambdaRVal = State->getSVal(R);
1230 State->BindExpr(LE, LocCtxt, LambdaRVal),
1243 NodeBuilder Bldr(CheckerPreStmt, EvalSet, *currBldrCtx);
1247 Visit(
Attr->getAssumption()->IgnoreParens(), N, EvalSet);
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
static ProgramStateRef bindRequiredArrayElementToEnvironment(ProgramStateRef State, const ArrayInitLoopExpr *AILE, const LocationContext *LCtx, NonLoc Idx)
Defines the PrettyStackTraceEntry class, which is used to make crashes give more contextual informati...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
uint64_t getArrayInitLoopExprElementCount(const ArrayInitLoopExpr *AILE) const
Return number of elements initialized in an ArrayInitLoopExpr.
CFG::BuildOptions & getCFGBuildOptions()
Represents a loop initializing the elements of an array.
OpaqueValueExpr * getCommonExpr() const
Get the common subexpression shared by all initializations (the source array).
Attr - This represents one attribute.
Represents an attribute applied to a statement.
ArrayRef< const Attr * > getAttrs() const
Represents a function call that returns a C++ object by value.
std::optional< T > getAs() const
Convert to the specified CFGElement type, returning std::nullopt if this CFGElement is not of the des...
CXXCatchStmt - This represents a C++ catch block.
VarDecl * getExceptionDecl() const
Represents a call to a C++ constructor.
Represents a delete expression for memory deallocation and destructor calls, e.g.
Represents a C++ destructor within a class.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a static or instance method of a struct/union/class.
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Expr * getPlacementArg(unsigned I)
SourceLocation getBeginLoc() const
FunctionDecl * getOperatorNew() const
Expr * getInitializer()
The initializer of this new-expression.
Represents a C++ struct/union/class.
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Represents the this expression in C++.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
ConstructionContext's subclasses describe different ways of constructing an object in C++.
virtual const ArrayInitLoopExpr * getArrayInitLoop() const
@ CXX17ElidedCopyVariableKind
@ ElidedTemporaryObjectKind
@ SimpleTemporaryObjectKind
@ CXX17ElidedCopyConstructorInitializerKind
@ SimpleConstructorInitializerKind
@ SimpleReturnedValueKind
@ CXX17ElidedCopyReturnedValueKind
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Decl - This represents one declaration (or definition), e.g.
This represents one expression.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Represents a function declaration or definition.
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Represents a prototype with parameter type info, e.g.
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
const Decl * getDecl() const
const ParentMap & getParentMap() const
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
const LocationContext * getParent() const
It might return null.
const StackFrameContext * getStackFrame() const
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
Stmt * getParent(Stmt *) const
Represents a program point just after an implicit call event.
If a crash happens while one of these objects are live, the message is printed out along with the spe...
ProgramPoint withTag(const ProgramPointTag *tag) const
Create a new ProgramPoint object that is the same as the original except for using the specified tag ...
A (possibly-)qualified type.
Represents a struct/union/class.
It represents a stack frame of the call stack (based on CallEvent).
unsigned getIndex() const
const Stmt * getCallSite() const
const CFGBlock * getCallSiteBlock() const
Stmt - This represents one statement.
SourceLocation getEndLoc() const LLVM_READONLY
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const T * getAs() const
Member-template getAs<specific type>'.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
Represents a call to a C++ constructor.
Manages the lifetime of CallEvent objects.
CallEventRef< CXXDestructorCall > getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, const MemRegion *Target, bool IsBase, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef< CXXDeallocatorCall > getCXXDeallocatorCall(const CXXDeleteExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef getSimpleCall(const CallExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef< ObjCMethodCall > getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef< CXXAllocatorCall > getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef< CXXConstructorCall > getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef< CXXInheritedConstructorCall > getCXXInheritedConstructorCall(const CXXInheritedCtorInitExpr *E, const MemRegion *Target, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
Represents an abstract call to a function or method along a particular path.
static bool isVariadic(const Decl *D)
Returns true if the given decl is known to be variadic.
void runCheckersForPreCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const CallEvent &Call, ExprEngine &Eng)
Run checkers for pre-visiting function calls (including methods, constructors, destructors etc.
void runCheckersForEvalCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const CallEvent &CE, ExprEngine &Eng, const EvalCallOptions &CallOpts)
Run checkers for evaluating a call.
void runCheckersForPostStmt(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const Stmt *S, ExprEngine &Eng, bool wasInlined=false)
Run checkers for post-visiting Stmts.
void runCheckersForNewAllocator(const CXXAllocatorCall &Call, ExplodedNodeSet &Dst, ExplodedNode *Pred, ExprEngine &Eng, bool wasInlined=false)
Run checkers between C++ operator new and constructor calls.
void runCheckersForPreStmt(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const Stmt *S, ExprEngine &Eng)
Run checkers for pre-visiting Stmts.
void runCheckersForPostCall(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const CallEvent &Call, ExprEngine &Eng, bool wasInlined=false)
Run checkers for post-visiting function calls (including methods, constructors, destructors etc.
ElementRegion is used to represent both array elements and casts.
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 LocationContext * getLocationContext() const
ProgramStateManager & getStateManager()
std::pair< ProgramStateRef, SVal > handleConstructionContext(const Expr *E, ProgramStateRef State, const NodeBuilderContext *BldrCtx, const LocationContext *LCtx, const ConstructionContext *CC, EvalCallOptions &CallOpts, unsigned Idx=0)
A convenient wrapper around computeObjectUnderConstruction and updateObjectsUnderConstruction.
void VisitCXXDestructor(QualType ObjectType, const MemRegion *Dest, const Stmt *S, bool IsBaseDtor, ExplodedNode *Pred, ExplodedNodeSet &Dst, EvalCallOptions &Options)
void VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitLambdaExpr(const LambdaExpr *LE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitLambdaExpr - Transfer function logic for LambdaExprs.
static std::optional< SVal > getObjectUnderConstruction(ProgramStateRef State, const ConstructionContextItem &Item, const LocationContext *LC)
By looking at a certain item that may be potentially part of an object's ConstructionContext,...
CFGElement getCurrentCFGElement()
Return the CFG element corresponding to the worklist element that is currently being processed by Exp...
unsigned getNumVisited(const LocationContext *LC, const CFGBlock *Block) const
SVal computeObjectUnderConstruction(const Expr *E, ProgramStateRef State, unsigned NumVisitedCaller, const LocationContext *LCtx, const ConstructionContext *CC, EvalCallOptions &CallOpts, unsigned Idx=0)
Find location of the object that is being constructed by a given constructor.
static std::optional< unsigned > getIndexOfElementToConstruct(ProgramStateRef State, const CXXConstructExpr *E, const LocationContext *LCtx)
Retreives which element is being constructed in a non-POD type array.
ASTContext & getContext() const
getContext - Return the ASTContext associated with this analysis.
StoreManager & getStoreManager()
void VisitCXXNewAllocatorCall(const CXXNewExpr *CNE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void CreateCXXTemporaryObject(const MaterializeTemporaryExpr *ME, ExplodedNode *Pred, ExplodedNodeSet &Dst)
Create a C++ temporary object for an rvalue.
ConstCFGElementRef getCFGElementRef() const
CheckerManager & getCheckerManager() const
ProgramStateRef bindReturnValue(const CallEvent &Call, const LocationContext *LCtx, ProgramStateRef State)
Create a new state in which the call return value is binded to the call origin expression.
void VisitCXXThisExpr(const CXXThisExpr *TE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitCXXDeleteExpr(const CXXDeleteExpr *CDE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitCXXConstructExpr(const CXXConstructExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst)
unsigned getNumVisitedCurrent() const
void Visit(const Stmt *S, ExplodedNode *Pred, ExplodedNodeSet &Dst)
Visit - Transfer function logic for all statements.
void defaultEvalCall(NodeBuilder &B, ExplodedNode *Pred, const CallEvent &Call, const EvalCallOptions &CallOpts={})
Default implementation of call evaluation.
void VisitCXXCatchStmt(const CXXCatchStmt *CS, ExplodedNode *Pred, ExplodedNodeSet &Dst)
SValBuilder & getSValBuilder()
ProgramStateRef updateObjectsUnderConstruction(SVal V, const Expr *E, ProgramStateRef State, const LocationContext *LCtx, const ConstructionContext *CC, const EvalCallOptions &CallOpts)
Update the program state with all the path-sensitive information that's necessary to perform construc...
void VisitAttributedStmt(const AttributedStmt *A, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitAttributedStmt - Transfer function logic for AttributedStmt.
static std::optional< unsigned > getPendingInitLoop(ProgramStateRef State, const CXXConstructExpr *E, const LocationContext *LCtx)
Retreives the size of the array in the pending ArrayInitLoopExpr.
const ElementRegion * getElementRegion(QualType elementType, NonLoc Idx, const SubRegion *superRegion, const ASTContext &Ctx)
getElementRegion - Retrieve the memory region associated with the associated element type,...
MemRegion - The root abstract class for all memory regions.
This is the simplest builder which generates nodes in the ExplodedGraph.
void takeNodes(const ExplodedNodeSet &S)
ExplodedNode * generateNode(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred, bool MarkAsSink=false)
Generates a node in the ExplodedGraph.
ExplodedNode * generateSink(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred)
Generates a sink in the ExplodedGraph.
void addNodes(const ExplodedNodeSet &S)
const ExplodedNodeSet & getResults() const
SValBuilder & getSValBuilder()
CallEventManager & getCallEventManager()
MemRegionManager & getRegionManager()
ProgramStateManager & getStateManager()
NonLoc makeArrayIndex(uint64_t idx)
ASTContext & getContext()
loc::MemRegionVal makeLoc(SymbolRef sym)
loc::MemRegionVal getCXXThis(const CXXMethodDecl *D, const StackFrameContext *SFC)
Return a memory region for the 'this' object reference.
DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, ConstCFGElementRef elem, const LocationContext *LCtx, unsigned count)
Create a new symbol with a unique 'name'.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
std::optional< T > getAs() const
Convert to the specified SVal type, returning std::nullopt if this SVal is not of the desired type.
const MemRegion * getAsRegion() const
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
SVal evalDerivedToBase(SVal Derived, const CastExpr *Cast)
Evaluates a chain of derived-to-base casts through the path specified in Cast.
SubRegion - A region that subsets another larger region.
TypedValueRegion - An abstract class representing regions having a typed value.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ Result
The result type of a method or function.
auto getSpecificAttrs(const Container &container)
U cast(CodeGen::Address addr)
Expr * extractElementInitializerFromNestedAILE(const ArrayInitLoopExpr *AILE)
Hints for figuring out of a call should be inlined during evalCall().
bool IsTemporaryLifetimeExtendedViaAggregate
This call is a constructor for a temporary that is lifetime-extended by binding it to a reference-typ...
bool IsTemporaryCtorOrDtor
This call is a constructor or a destructor of a temporary value.
bool IsArrayCtorOrDtor
This call is a constructor or a destructor for a single element within an array, a part of array cons...
bool IsElidableCtorThatHasNotBeenElided
This call is a pre-C++17 elidable constructor that we failed to elide because we failed to compute th...
bool IsCtorOrDtorWithImproperlyModeledTargetRegion
This call is a constructor or a destructor for which we do not currently compute the this-region corr...