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;
59 assert(cast<CXXMethodDecl>(
Call.getDecl())->isTrivial());
60 assert(cast<CXXMethodDecl>(
Call.getDecl())->getOverloadedOperator() ==
62 ThisVal = cast<CXXInstanceCall>(
Call).getCXXThisVal();
64 AlwaysReturnsLValue =
true;
75 const Expr *VExpr =
Call.getArgExpr(0);
79 if (std::optional<Loc> L =
V.getAs<
Loc>())
82 assert(
V.isUnknownOrUndef());
88 evalBind(Dst,
CallExpr, N, ThisVal,
V, !AlwaysReturnsLValue);
93 if (AlwaysReturnsLValue)
94 State = State->BindExpr(
CallExpr, LCtx, ThisVal);
102 QualType &Ty,
bool &IsArray,
unsigned Idx) {
103 SValBuilder &SVB = State->getStateManager().getSValBuilder();
108 Ty = AT->getElementType();
109 AT = dyn_cast<ArrayType>(AT->getElementType());
136 const auto *DSCC = cast<VariableConstructionContext>(CC);
137 const auto *DS = DSCC->getDeclStmt();
138 const auto *Var = cast<VarDecl>(DS->getSingleDecl());
140 return makeElementRegion(State, State->getLValue(Var, LCtx), Ty,
145 const auto *ICC = cast<ConstructorInitializerConstructionContext>(CC);
146 const auto *
Init = ICC->getCXXCtorInitializer();
149 SVal ThisVal = State->getSVal(ThisPtr);
150 if (
Init->isBaseInitializer()) {
151 const auto *ThisReg = cast<SubRegion>(ThisVal.
getAsRegion());
153 Init->getBaseClass()->getAsCXXRecordDecl();
154 const auto *BaseReg =
156 Init->isBaseVirtual());
159 if (
Init->isDelegatingInitializer())
164 if (
Init->isIndirectMemberInitializer()) {
165 Field =
Init->getIndirectMember();
166 FieldVal = State->getLValue(
Init->getIndirectMember(), ThisVal);
168 Field =
Init->getMember();
169 FieldVal = State->getLValue(
Init->getMember(), ThisVal);
178 const auto *NECC = cast<NewAllocatedObjectConstructionContext>(CC);
179 const auto *NE = NECC->getCXXNewExpr();
182 dyn_cast_or_null<SubRegion>(
V.getAsRegion())) {
186 auto Ty = NE->getType()->getPointeeType();
187 while (
const auto *AT =
getContext().getAsArrayType(Ty))
188 Ty = AT->getElementType();
217 if (isa<BlockInvocationContext>(CallerLCtx)) {
220 CallerLCtx = CallerLCtx->getParent();
221 assert(!isa<BlockInvocationContext>(CallerLCtx));
227 cast<Expr>(SFC->
getCallSite()), State, &CallerBldrCtx, CallerLCtx,
228 RTC->getConstructionContext(), CallOpts);
239 const auto *RCC = cast<ReturnedValueConstructionContext>(CC);
242 static const int TopLevelSymRegionTag = 0;
243 const Expr *RetE = RCC->getReturnStmt()->getRetValue();
244 assert(RetE &&
"Void returns should not have a construction context");
250 llvm_unreachable(
"Unhandled return value construction context!");
254 const auto *TCC = cast<ElidedTemporaryObjectConstructionContext>(CC);
267 TCC->getConstructorAfterElision(), State, BldrCtx, LCtx,
268 TCC->getConstructionContextAfterElision(), CallOpts);
278 CallOpts = PreElideCallOpts;
283 const auto *TCC = cast<TemporaryObjectConstructionContext>(CC);
291 if (!VD->getType()->isReferenceType()) {
315 const auto *LCC = cast<LambdaCaptureConstructionContext>(CC);
320 const auto *CE = dyn_cast_or_null<CXXConstructExpr>(
E);
333 const auto *ACC = cast<ArgumentConstructionContext>(CC);
334 const Expr *
E = ACC->getCallLikeExpr();
335 unsigned Idx = ACC->getIndex();
338 auto getArgLoc = [&](
CallEventRef<> Caller) -> std::optional<SVal> {
340 Caller->getCalleeStackFrame(BldrCtx->
blockCount());
359 *Caller->getAdjustedParameterIndex(Idx), BldrCtx->
blockCount());
366 if (
const auto *CE = dyn_cast<CallExpr>(
E)) {
369 if (std::optional<SVal>
V = getArgLoc(Caller))
373 }
else if (
const auto *CCE = dyn_cast<CXXConstructExpr>(
E)) {
378 if (std::optional<SVal>
V = getArgLoc(Caller))
382 }
else if (
const auto *ME = dyn_cast<ObjCMessageExpr>(
E)) {
385 if (std::optional<SVal>
V = getArgLoc(Caller))
411 assert(CC &&
"Computed target region without construction context?");
415 const auto *DSCC = cast<VariableConstructionContext>(CC);
416 return addObjectUnderConstruction(State, DSCC->getDeclStmt(), LCtx,
V);
420 const auto *ICC = cast<ConstructorInitializerConstructionContext>(CC);
421 const auto *
Init = ICC->getCXXCtorInitializer();
423 assert(
Init->isAnyMemberInitializer() &&
424 "Base and delegating initializers should have been handled by"
425 "computeObjectUnderConstruction()");
426 return addObjectUnderConstruction(State,
Init, LCtx,
V);
442 assert(RTC &&
"Could not have had a target region without it");
443 if (isa<BlockInvocationContext>(CallerLCtx)) {
447 assert(!isa<BlockInvocationContext>(CallerLCtx));
452 RTC->getConstructionContext(), CallOpts);
457 const auto *TCC = cast<ElidedTemporaryObjectConstructionContext>(CC);
459 V, TCC->getConstructorAfterElision(), State, LCtx,
460 TCC->getConstructionContextAfterElision(), CallOpts);
463 State = addObjectUnderConstruction(
464 State, TCC->getConstructorAfterElision(), LCtx,
V);
467 if (
const auto *BTE = TCC->getCXXBindTemporaryExpr())
468 State = elideDestructor(State, BTE, LCtx);
472 if (
const auto *MTE = TCC->getMaterializedTemporaryExpr())
473 State = addObjectUnderConstruction(State, MTE, LCtx,
V);
482 const auto *TCC = cast<TemporaryObjectConstructionContext>(CC);
483 if (
const auto *BTE = TCC->getCXXBindTemporaryExpr())
484 State = addObjectUnderConstruction(State, BTE, LCtx,
V);
486 if (
const auto *MTE = TCC->getMaterializedTemporaryExpr())
487 State = addObjectUnderConstruction(State, MTE, LCtx,
V);
492 const auto *LCC = cast<LambdaCaptureConstructionContext>(CC);
496 if (
const auto *EL = dyn_cast_or_null<ElementRegion>(
V.getAsRegion()))
499 return addObjectUnderConstruction(
500 State, {LCC->getLambdaExpr(), LCC->getIndex()}, LCtx,
V);
503 const auto *ACC = cast<ArgumentConstructionContext>(CC);
504 if (
const auto *BTE = ACC->getCXXBindTemporaryExpr())
505 State = addObjectUnderConstruction(State, BTE, LCtx,
V);
507 return addObjectUnderConstruction(
508 State, {ACC->getCallLikeExpr(), ACC->getIndex()}, LCtx,
V);
511 llvm_unreachable(
"Unhandled construction context!");
518 SValBuilder &SVB = State->getStateManager().getSValBuilder();
529 const auto *SourceArrayRegion =
530 cast<SubRegion>(State->getSVal(SourceArray, LCtx).getAsRegion());
534 return State->BindExpr(Ctor->getArg(0), LCtx,
538void ExprEngine::handleConstructor(
const Expr *
E,
541 const auto *CE = dyn_cast<CXXConstructExpr>(
E);
542 const auto *CIE = dyn_cast<CXXInheritedCtorInitExpr>(
E);
551 if (std::optional<SVal> ElidedTarget =
558 State = finishObjectConstruction(State, CE, LCtx);
560 State = State->BindExpr(CE, LCtx, State->getSVal(*L, CE->getType()));
572 CE ? CE->getConstructionKind() : CIE->getConstructionKind();
576 assert(CE && !CIE &&
"A complete constructor is inherited?!");
583 if (CE->getType()->isArrayType() || AILE) {
585 auto isZeroSizeArray = [&] {
588 if (
const auto *CAT = dyn_cast<ConstantArrayType>(CE->getType()))
597 if (isZeroSizeArray()) {
600 "Skipping 0 size array construction"};
606 State = setIndexOfElementToConstruct(State, CE, LCtx, Idx + 1);
612 State = setPendingInitLoop(
614 getContext().getArrayInitLoopExprElementCount(AILE));
622 CE, State, currBldrCtx, LCtx, CC, CallOpts, Idx);
628 const auto *OuterCtor = dyn_cast_or_null<CXXConstructExpr>(
634 (
"This virtual base should have already been initialized by "
635 "the most derived class!"));
651 if (isa_and_nonnull<InitListExpr, CXXParenListInitExpr>(
663 SVal ThisVal = State->getSVal(ThisPtr);
680 "Prepare for object construction");
684 assert(DstPrepare.
size() <= 1);
685 if (DstPrepare.
size() == 0)
687 Pred = *BldrPrepare.begin();
707 if (CE->requiresZeroInitialization()) {
721 dyn_cast_or_null<CXXRecordDecl>(CE->getType()->getAsRecordDecl());
723 if (!TargetHeldRecord || !TargetHeldRecord->
isEmpty())
724 State = State->bindDefaultZero(
Target, LCtx);
731 PreInitialized = DstPreVisit;
740 if (CE && CE->getConstructor()->isTrivial() &&
741 CE->getConstructor()->isCopyOrMoveConstructor() &&
746 performTrivialCopy(Bldr, N, *
Call);
762 StmtNodeBuilder Bldr(DstEvaluated, DstEvaluatedPostProcessed, *currBldrCtx);
767 cast<CXXConstructorDecl>(
Call->getDecl())
769 ->isAnyDestructorNoReturn()) {
778 assert(!DstEvaluated.
empty() &&
779 "We should not have inlined this constructor!");
794 finishArgumentConstruction(DstPostArgumentCleanup, I, *
Call);
800 DstPostArgumentCleanup,
808 handleConstructor(CE, Pred, Dst);
814 handleConstructor(CE, Pred, Dst);
824 assert(S &&
"A destructor without a trigger!");
829 assert(
RecordDecl &&
"Only CXXRecordDecls should have destructors");
852 if (
const Expr *
E = dyn_cast_or_null<Expr>(S)) {
868 Call->getSourceRange().getBegin(),
869 "Error evaluating destructor");
891 "Error evaluating New Allocator Call");
923 SVal RetVal = State->getSVal(CNE, LCtx);
928 State = State->bindDefaultInitial(RetVal,
UndefinedVal{}, LCtx);
940 if (!ProtoType->isNothrow())
945 CNE, I, addObjectUnderConstruction(State, CNE, LCtx, RetVal));
950 DstPostValue, *
Call, *
this);
963 unsigned blockCount = currBldrCtx->
blockCount();
968 bool IsStandardGlobalOpNewFunction =
976 State = finishObjectConstruction(State, CNE, LCtx);
983 if (IsStandardGlobalOpNewFunction)
1000 State =
Call->invalidateRegions(blockCount);
1012 if (!ProtoType->isNothrow())
1014 State = State->assume(*dSymVal,
true);
1023 if (
const auto *NewReg = cast_or_null<SubRegion>(symVal.
getAsRegion())) {
1029 isa_and_nonnull<InitListExpr, CXXParenListInitExpr>(
Init);
1046 evalBind(evaluated, CNE, Pred,
Result,
V,
true);
1051 Pred = *evaluated.
begin();
1073 State = State->BindExpr(CNE, LCtx,
Result);
1081 if (!isa<CXXConstructExpr>(
Init)) {
1084 evalBind(Dst, CNE, NewN,
Result, State->getSVal(
Init, LCtx),
1085 IsStandardGlobalOpNewFunction);
1107 DstPostCall = DstPreCall;
1124 state = state->bindLoc(state->getLValue(VD, LCtx),
V, LCtx);
1159 for (
auto const [Idx, FieldForCapture, InitExpr] :
1160 llvm::zip(llvm::seq<unsigned>(0, -1), LE->getLambdaClass()->fields(),
1161 LE->capture_inits())) {
1162 SVal FieldLoc = State->getLValue(FieldForCapture,
V);
1165 if (!FieldForCapture->hasCapturedVLAType()) {
1166 assert(InitExpr &&
"Capture missing initialization expression");
1172 const auto FTy = FieldForCapture->getType();
1173 if (FTy->isConstantArrayType() &&
1175 getContext().getAsConstantArrayType(FTy)) == 0)
1181 if (
const auto OUC =
1183 InitVal = State->getSVal(OUC->getAsRegion());
1185 State = finishObjectConstruction(State, {LE, Idx}, LocCtxt);
1187 InitVal = State->getSVal(InitExpr, LocCtxt);
1192 "VLA capture by value is a compile time error!");
1197 Expr *SizeExpr = FieldForCapture->getCapturedVLAType()->getSizeExpr();
1198 InitVal = State->getSVal(SizeExpr, LocCtxt);
1201 State = State->bindLoc(FieldLoc, InitVal, LocCtxt);
1207 SVal LambdaRVal = State->getSVal(R);
1213 State->BindExpr(LE, LocCtxt, LambdaRVal),
1228 for (
const auto *
Attr : getSpecificAttrs<CXXAssumeAttr>(A->
getAttrs())) {
1230 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)
llvm::MachO::Target Target
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.
AnalysisDeclContext contains the context data for the function, method or block under analysis.
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).
Represents an array type, per C99 6.7.5.2 - Array Declarators.
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.
Represents C++ constructor call.
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.
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.
AnalyzerOptions & getAnalyzerOptions() override
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 obj-c messages.
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 obj-c messages.
ElementRegion is used to represent both array elements and casts.
void Add(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)
const CoreEngine & getCoreEngine() const
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...
SVal computeObjectUnderConstruction(const Expr *E, ProgramStateRef State, const NodeBuilderContext *BldrCtx, 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)
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 CXXThisRegion * getCXXThisRegion(QualType thisPointerTy, const LocationContext *LC)
getCXXThisRegion - Retrieve the [artificial] region associated with the parameter 'this'.
const ElementRegion * getElementRegion(QualType elementType, NonLoc Idx, const SubRegion *superRegion, const ASTContext &Ctx)
getElementRegion - Retrieve the memory region associated with the associated element type,...
const CXXLifetimeExtendedObjectRegion * getCXXLifetimeExtendedObjectRegion(Expr const *Ex, ValueDecl const *VD, LocationContext const *LC)
Create a CXXLifetimeExtendedObjectRegion for temporaries which are lifetime-extended by local referen...
const CXXTempObjectRegion * getCXXTempObjectRegion(Expr const *Ex, LocationContext const *LC)
const CXXBaseObjectRegion * getCXXBaseObjectRegion(const CXXRecordDecl *BaseClass, const SubRegion *Super, bool IsVirtual)
Create a CXXBaseObjectRegion with the given base class for region Super.
const CXXLifetimeExtendedObjectRegion * getCXXStaticLifetimeExtendedObjectRegion(const Expr *Ex, ValueDecl const *VD)
Create a CXXLifetimeExtendedObjectRegion for temporaries which are lifetime-extended by static refere...
MemRegion - The root abstract class for all memory regions.
unsigned blockCount() const
Returns the number of times the current basic block has been visited on the exploded graph path.
This is the simplest builder which generates nodes in the ExplodedGraph.
ExplodedNode * generateNode(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred)
Generates a node in the ExplodedGraph.
void takeNodes(const ExplodedNodeSet &S)
ExplodedNode * generateSink(const ProgramPoint &PP, ProgramStateRef State, ExplodedNode *Pred)
Generates a sink in the ExplodedGraph.
void addNodes(const ExplodedNodeSet &S)
const ExplodedNodeSet & getResults()
CallEventManager & getCallEventManager()
DefinedSVal getConjuredHeapSymbolVal(ConstCFGElementRef elem, const LocationContext *LCtx, QualType type, unsigned Count)
Conjure a symbol representing heap allocated memory region.
MemRegionManager & getRegionManager()
NonLoc makeArrayIndex(uint64_t idx)
ASTContext & getContext()
loc::MemRegionVal makeLoc(SymbolRef sym)
SVal evalCast(SVal V, QualType CastTy, QualType OriginalTy)
Cast a given SVal to another SVal using given QualType's.
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.
This builder class is useful for generating nodes that resulted from visiting a statement.
ExplodedNode * generateNode(const Stmt *S, ExplodedNode *Pred, ProgramStateRef St, const ProgramPointTag *tag=nullptr, ProgramPoint::Kind K=ProgramPoint::PostStmtKind)
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.
The JSON file list parser is used to communicate input to InstallAPI.
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.
const FunctionProtoType * T
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...