39 SVal LeftV = State->getSVal(LHS, SF);
40 SVal RightV = State->getSVal(RHS, SF);
44 if (Op == BO_Assign) {
53 evalStore(Tmp2, B, LHS, N, State->BindExpr(B, SF, ExprVal), LeftV,
70 ConjureIfNeeded(RightV, LeftV, RHS->
getType());
71 ConjureIfNeeded(LeftV, RightV, LHS->
getType());
78 State = createTemporaryRegionIfNeeded(State, SF, LHS);
84 State = State->BindExpr(B, SF,
Result);
91 Tmp2.
insert(Engine.makePostStmtNode(B, State, N));
99 llvm_unreachable(
"Invalid opcode for compound assignment.");
100 case BO_MulAssign: Op = BO_Mul;
break;
101 case BO_DivAssign: Op = BO_Div;
break;
102 case BO_RemAssign: Op = BO_Rem;
break;
103 case BO_AddAssign: Op = BO_Add;
break;
104 case BO_SubAssign: Op = BO_Sub;
break;
105 case BO_ShlAssign: Op = BO_Shl;
break;
106 case BO_ShrAssign: Op = BO_Shr;
break;
107 case BO_AndAssign: Op = BO_And;
break;
108 case BO_XorAssign: Op = BO_Xor;
break;
109 case BO_OrAssign: Op = BO_Or;
break;
115 evalLoad(Tmp, B, LHS, N, State, LeftV);
118 State = N->getState();
119 SVal V = State->getSVal(LHS, SF);
129 V = svalBuilder.evalCast(
V, CLHSTy, LTy);
141 StoredInLeftV = svalBuilder.conjureSymbolVal(
145 Result = svalBuilder.evalCast(StoredInLeftV, CTy, LTy);
149 StoredInLeftV = svalBuilder.evalCast(
Result, LTy, CTy);
155 State = State->BindExpr(B, SF, LeftV);
157 State = State->BindExpr(B, SF,
Result);
159 evalStore(Tmp2, B, LHS, N, State, LeftV, StoredInLeftV);
182 dyn_cast_or_null<BlockDataRegion>(
V.getAsRegion())) {
184 auto ReferencedVars = BDR->referenced_vars();
187 for (
auto Var : ReferencedVars) {
188 const VarRegion *capturedR = Var.getCapturedRegion();
197 const Expr *copyExpr =
nullptr;
199 assert(CI->getVariable() == capturedR->
getDecl());
200 copyExpr = CI->getCopyExpr();
204 if (capturedR != originalR) {
208 originalV = State->getSVal(copyExpr, SF);
217 Dst.
insert(Engine.makeNodeWithBinding(Pred, BE,
V, State,
225 if (
T->isLValueReferenceType()) {
228 }
else if (
T->isRValueReferenceType()) {
233 SVal OrigV = state->getSVal(Ex, SF);
234 SVal SimplifiedOrigV = svalBuilder.simplifySVal(state, OrigV);
235 SVal V = svalBuilder.evalCast(SimplifiedOrigV,
T, ExTy);
237 if (CastE->
getCastKind() == CK_BooleanToSignedIntegral &&
V.isValid())
238 V = svalBuilder.evalMinus(
V.castAs<
NonLoc>());
240 state = state->BindExpr(CastE, SF,
V);
244 Dst.
insert(Engine.makePostStmtNode(CastE, state, Pred));
257 if (CastE->
getCastKind() == CK_LValueToRValueBitCast) {
262 evalLocation(DstEvalLoc, CastE, Ex, Pred, State, State->
getSVal(Ex, SF),
275 if (
const MemRegion *MR = State->getSVal(Ex, SF).getAsRegion()) {
276 SVal OrigV = State->getSVal(MR);
277 CastedV = svalBuilder.evalCast(svalBuilder.simplifySVal(State, OrigV),
280 Dst.
insert(Engine.makeNodeWithBinding(Node, CastE, CastedV));
289 if (
const ExplicitCastExpr *ExCast=dyn_cast_or_null<ExplicitCastExpr>(CastE))
290 T = ExCast->getTypeAsWritten();
293 case CK_LValueToRValue:
294 case CK_LValueToRValueBitCast:
295 llvm_unreachable(
"LValueToRValue casts handled earlier.");
301 case CK_ARCProduceObject:
302 case CK_ARCConsumeObject:
303 case CK_ARCReclaimReturnedObject:
304 case CK_ARCExtendBlockObject:
305 case CK_CopyAndAutoreleaseBlockObject:
309 case CK_AtomicToNonAtomic:
310 case CK_NonAtomicToAtomic:
313 case CK_ConstructorConversion:
314 case CK_UserDefinedConversion:
315 case CK_FunctionToPointerDecay:
316 case CK_BuiltinFnToFnPtr:
317 case CK_HLSLArrayRValue: {
319 SVal V = State->getSVal(Ex, SF);
320 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE,
V));
323 case CK_MemberPointerToBoolean:
324 case CK_PointerToBoolean: {
325 SVal V = State->getSVal(Ex, SF);
328 V = svalBuilder.makeTruthVal(!PTMSV->isNullMemberPointer(), ExTy);
329 if (
V.isUndef() || PTMSV) {
330 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE,
V));
337 case CK_ArrayToPointerDecay:
339 case CK_AddressSpaceConversion:
340 case CK_BooleanToSignedIntegral:
341 case CK_IntegralToPointer:
342 case CK_PointerToIntegral: {
343 SVal V = State->getSVal(Ex, SF);
351 case CK_IntegralToBoolean:
352 case CK_IntegralToFloating:
353 case CK_FloatingToIntegral:
354 case CK_FloatingToBoolean:
355 case CK_FloatingCast:
356 case CK_FloatingRealToComplex:
357 case CK_FloatingComplexToReal:
358 case CK_FloatingComplexToBoolean:
359 case CK_FloatingComplexCast:
360 case CK_FloatingComplexToIntegralComplex:
361 case CK_IntegralRealToComplex:
362 case CK_IntegralComplexToReal:
363 case CK_IntegralComplexToBoolean:
364 case CK_IntegralComplexCast:
365 case CK_IntegralComplexToFloatingComplex:
366 case CK_CPointerToObjCPointerCast:
367 case CK_BlockPointerToObjCPointerCast:
368 case CK_AnyPointerToBlockPointerCast:
369 case CK_ObjCObjectLValueCast:
370 case CK_ZeroToOCLOpaqueType:
371 case CK_IntToOCLSampler:
372 case CK_LValueBitCast:
373 case CK_FloatingToFixedPoint:
374 case CK_FixedPointToFloating:
375 case CK_FixedPointCast:
376 case CK_FixedPointToBoolean:
377 case CK_FixedPointToIntegral:
378 case CK_IntegralToFixedPoint: {
382 case CK_IntegralCast: {
384 SVal V = State->getSVal(Ex, SF);
385 if (AMgr.options.analyzerSymbolicIntegerCasts())
386 V = svalBuilder.evalCast(
V,
T, ExTy);
388 V = svalBuilder.evalIntegralCast(State,
V,
T, ExTy);
389 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE,
V));
392 case CK_DerivedToBase:
393 case CK_UncheckedDerivedToBase: {
395 SVal val = State->getSVal(Ex, SF);
397 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE, val));
402 SVal val = State->getSVal(Ex, SF);
413 if (std::optional<SVal>
V =
414 StateMgr.getStoreManager().evalBaseToDerived(val,
T)) {
420 if (
T->isReferenceType()) {
423 Engine.makePostStmtNode(CastE, State, Pred,
true);
427 State = State->BindExpr(CastE, SF,
428 svalBuilder.makeNullWithType(resultType));
436 State = State->BindExpr(CastE, SF, NewSym);
439 State = State->BindExpr(CastE, SF, val);
441 Dst.
insert(Engine.makePostStmtNode(CastE, State, Pred));
444 case CK_BaseToDerived: {
445 SVal val = State->getSVal(Ex, SF);
457 val = svalBuilder.conjureSymbolVal(
461 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE, val));
464 case CK_NullToPointer: {
465 SVal V = svalBuilder.makeNullWithType(CastE->
getType());
466 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE,
V));
469 case CK_NullToMemberPointer: {
470 SVal V = svalBuilder.getMemberPointer(
nullptr);
471 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE,
V));
474 case CK_DerivedToBaseMemberPointer:
475 case CK_BaseToDerivedMemberPointer:
476 case CK_ReinterpretMemberPointer: {
477 SVal V = State->getSVal(Ex, SF);
480 svalBuilder.makePointerToMember(
getBasicVals().accumCXXBase(
482 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE, CastedPTMSV));
492 case CK_HLSLElementwiseCast:
493 case CK_HLSLAggregateSplatCast:
494 case CK_HLSLMatrixTruncation:
495 case CK_HLSLVectorTruncation: {
499 SVal result = svalBuilder.conjureSymbolVal(
502 Dst.
insert(Engine.makeNodeWithBinding(Pred, CastE, result));
515 SVal V = State->getSVal(
CL->getInitializer(), SF);
521 Loc CLLoc = State->getLValue(
CL, SF);
522 State = State->bindLoc(CLLoc,
V, SF);
528 Dst.
insert(Engine.makeNodeWithBinding(Pred,
CL,
V, State));
562 if (
const auto *IL = dyn_cast<InitListExpr>(EI);
563 IL && IL->getNumInits() == 1)
567 if (
const auto *DR = dyn_cast<DeclRefExpr>(EI->IgnoreParenImpCasts())) {
591 SVal InitVal = state->getSVal(InitEx, SF);
595 state = finishObjectConstruction(state, DS, SF);
598 dstEvaluated.
insert(Engine.makePostStmtNode(DS, state, UpdatedN));
604 if (InitEx->isGLValue()) {
608 InitVal = svalBuilder.conjureSymbolVal(
613 evalBind(dstEvaluated, DS, UpdatedN, state->getLValue(VD, SF), InitVal,
618 dstEvaluated.
insert(Engine.makePostStmtNode(DS, state, N));
653 Dst.
insert(Engine.makePostStmtNode(B, state, Pred));
665 Dst.
insert(Engine.makePostStmtNode(B, state, Pred));
673 Dst.
insert(Engine.makePostStmtNode(B, state, Pred));
686 if (
const BinaryOperator *Term = cast_or_null<BinaryOperator>(
T.getStmt())) {
688 assert(Term->isLogicalOp());
692 X = svalBuilder.makeIntVal(constant, B->
getType());
698 assert(!SrcBlock->
empty());
710 svalBuilder.makeZeroVal(RHS->getType()), B->
getType());
713 Dst.
insert(Engine.makeNodeWithBinding(Pred, B,
X));
730 auto Edge = N->getLocationAs<
BlockEdge>();
731 if (!Edge.has_value()) {
739 SrcBlock = Edge->getSrc();
740 SrcState = N->getState();
744 assert(SrcBlock &&
"missing function entry");
748 bool hasValue =
false;
751 for (
CFGElement CE : llvm::reverse(*SrcBlock)) {
752 if (std::optional<CFGStmt> CS = CE.getAs<
CFGStmt>()) {
759 L = OpaqueEx->getSourceExpr();
763 if (ValEx == L->
IgnoreParens() || ValEx == R->IgnoreParens()) {
765 V = SrcState->getSVal(ValEx, SF);
776 Dst.
insert(Engine.makeNodeWithBinding(Pred, Ex,
V));
783 APSInt IV =
Result.Val.getInt();
787 SVal X = svalBuilder.makeIntVal(IV);
788 Dst.
insert(Engine.makeNodeWithBinding(Pred, OOE,
X));
800 if (Ex->
getKind() == UETT_SizeOf || Ex->
getKind() == UETT_DataSizeOf ||
801 Ex->
getKind() == UETT_CountOf) {
802 if (!
T->isIncompleteType() && !
T->isConstantSizeType()) {
803 assert(
T->isVariableArrayType() &&
"Unknown non-constant-sized type.");
822 Dst.
insert(Engine.makeNodeWithBinding(Pred, Ex,
V));
830 "Empty statement expression must have void type.");
831 }
else if (
const auto *LastExpr =
834 Pred = Engine.makeNodeWithBinding(Pred, SE, Val);
848 auto MakeNodeForIdentityOp = [
U, &Engine = Engine](
ExplodedNode *N) {
849 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
850 SVal SV = N->getState()->getSVal(Ex, N->getStackFrame());
851 return Engine.makeNodeWithBinding(N,
U, SV);
855 switch (
U->getOpcode()) {
863 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
873 assert (
U->getType() == Ex->
getType());
874 EvalSet.
insert(MakeNodeForIdentityOp(N));
879 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
888 EvalSet.
insert(Engine.makeNodeWithBinding(N,
U,
X));
894 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
895 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex)) {
900 EvalSet.
insert(Engine.makeNodeWithBinding(N,
U, SV));
905 EvalSet.
insert(MakeNodeForIdentityOp(N));
909 assert(!
U->isGLValue());
913 EvalSet.
insert(MakeNodeForIdentityOp(N));
920 assert (!
U->isGLValue());
921 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
926 SVal V = state->getSVal(Ex, SF);
928 if (
V.isUnknownOrUndef()) {
929 EvalSet.
insert(Engine.makeNodeWithBinding(N,
U,
V));
933 switch (
U->getOpcode()) {
935 llvm_unreachable(
"Invalid Opcode.");
938 state = state->BindExpr(
939 U, SF, svalBuilder.evalComplement(
V.castAs<
NonLoc>()));
944 state->BindExpr(
U, SF, svalBuilder.evalMinus(
V.castAs<
NonLoc>()));
952 if (std::optional<Loc> LV =
V.getAs<
Loc>()) {
953 Loc X = svalBuilder.makeNullWithType(Ex->
getType());
963 state = state->BindExpr(
U, SF,
Result);
966 EvalSet.
insert(Engine.makePostStmtNode(
U, state, N));
981 Dst.
insert(Engine.makeNodeWithBinding(Pred, PE,
V));
992 Dst.
insert(Engine.makeNodeWithBinding(Pred, OIE,
V));
999 assert (
U->isIncrementDecrementOp());
1000 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1004 SVal loc = state->getSVal(Ex, SF);
1012 state = N->getState();
1013 assert(SF == N->getStackFrame());
1014 SVal V2_untested = state->getSVal(Ex, SF);
1018 state = state->BindExpr(
U, SF, V2_untested);
1035 if (
U->getType()->isAnyPointerType())
1036 RHS = svalBuilder.makeArrayIndex(1);
1037 else if (
U->getType()->isIntegralOrEnumerationType())
1038 RHS = svalBuilder.makeIntVal(1,
U->getType());
1046 if (
U->getType()->isBooleanType() &&
U->isIncrementOp())
1047 Result = svalBuilder.makeTruthVal(
true,
U->getType());
1063 svalBuilder.evalEQ(state, V2,svalBuilder.makeZeroVal(
U->getType()));
1065 if (!state->assume(Constraint,
true)) {
1068 Constraint = svalBuilder.evalEQ(state, SymVal,
1069 svalBuilder.makeZeroVal(
U->getType()));
1071 state = state->assume(Constraint,
false);
1080 state = state->BindExpr(
U, SF,
loc);
1082 state = state->BindExpr(
U, SF,
U->isPostfix() ? V2 :
Result);
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
A builtin binary operation expression such as "x + y" or "x <= y".
static bool isAdditiveOp(Opcode Opc)
static bool isAssignmentOp(Opcode Opc)
static bool isCompoundAssignmentOp(Opcode Opc)
BinaryOperatorKind Opcode
Represents a block literal declaration, which is like an unnamed FunctionDecl.
capture_const_iterator capture_begin() const
capture_const_iterator capture_end() const
const CFGBlock * getSrc() const
const CFGBlock * getDst() const
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
const BlockDecl * getBlockDecl() const
This class is used for builtin types like 'int'.
Represents a single basic block in a source-level CFG.
reverse_iterator rbegin()
CFGTerminator getTerminator() const
succ_iterator succ_begin()
unsigned succ_size() const
Represents a top-level expression in a basic block.
T castAs() const
Convert to the specified CFGElement type, asserting that this CFGElement is of the desired type.
const Stmt * getStmt() const
Represents CFGBlock terminator statement.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
llvm::iterator_range< path_iterator > path()
Path through the class hierarchy taken by casts between base and derived classes (see implementation ...
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits fromQuantity(QuantityType Quantity)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
CompoundLiteralExpr - [C99 6.5.2.5].
reverse_body_iterator body_rbegin()
A reference to a declared variable, function, enum, etc.
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
decl_iterator decl_begin()
ExplicitCastExpr - An explicit cast written in the source code.
This represents one expression.
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
ObjCIndirectCopyRestoreExpr - Represents the passing of a function argument by indirect copy-restore ...
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Represents a point after we ran remove dead bindings BEFORE processing the given statement.
T castAs() const
Convert to the specified ProgramPoint type, asserting that this ProgramPoint is of the desired type.
std::optional< T > getAs() const
Convert to the specified ProgramPoint type, returning std::nullopt if this ProgramPoint is not of the...
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Expr * getResultExpr()
Return the result-bearing expression, or null if there is none.
A (possibly-)qualified type.
It represents a stack frame of the call stack.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
CompoundStmt * getSubStmt()
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isRValueReferenceType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isLValueReferenceType() const
bool isAnyComplexType() const
bool isVectorType() const
bool isFloatingType() const
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
QualType getTypeOfArgument() const
Gets the argument type, or the type of the argument expression, whichever is appropriate.
UnaryExprOrTypeTrait getKind() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
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.
const Expr * getInit() const
BlockDataRegion - A region that represents a block instance.
void runCheckersForPostStmt(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const Stmt *S, ExprEngine &Eng, bool wasInlined=false)
Run checkers for post-visiting Stmts.
void runCheckersForPreStmt(ExplodedNodeSet &Dst, const ExplodedNodeSet &Src, const Stmt *S, ExprEngine &Eng)
Run checkers for pre-visiting Stmts.
ExplodedNodeSet is a set of ExplodedNode * elements with the invariant that its elements cannot be nu...
void insert(ExplodedNode *N)
ImplTy::iterator iterator
const ProgramStateRef & getState() const
pred_iterator pred_begin()
SVal getSVal(const Expr *E) const
Get the value of an arbitrary expression at this node.
ProgramPoint getLocation() const
getLocation - Returns the edge associated with the given node.
unsigned pred_size() const
const StackFrame * getStackFrame() const
void VisitBinaryOperator(const BinaryOperator *B, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitBinaryOperator - Transfer function logic for binary operators.
void VisitGuardedExpr(const Expr *Ex, const Expr *L, const Expr *R, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitGuardedExpr - Transfer function logic for ?, __builtin_choose.
BasicValueFactory & getBasicVals()
void VisitLogicalExpr(const BinaryOperator *B, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitLogicalExpr - Transfer function logic for '&&', '||'.
SVal evalBinOp(ProgramStateRef ST, BinaryOperator::Opcode Op, SVal LHS, SVal RHS, QualType T)
void VisitObjCIndirectCopyRestoreExpr(const ObjCIndirectCopyRestoreExpr *OIE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitUnaryOperator(const UnaryOperator *B, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitUnaryOperator - Transfer function logic for unary operators.
void VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitDeclStmt - Transfer function logic for DeclStmts.
void VisitBlockExpr(const BlockExpr *BE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitBlockExpr - Transfer function logic for BlockExprs.
void VisitIncrementDecrementOperator(const UnaryOperator *U, ExplodedNode *Pred, ExplodedNodeSet &Dst)
Handle ++ and – (both pre- and post-increment).
ASTContext & getContext() const
getContext - Return the ASTContext associated with this analysis.
StoreManager & getStoreManager()
ConstCFGElementRef getCFGElementRef() const
void VisitStmtExpr(const StmtExpr *SE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Ex, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitUnaryExprOrTypeTraitExpr - Transfer function for sizeof.
ProgramStateRef escapeValues(ProgramStateRef State, ArrayRef< SVal > Vs, PointerEscapeKind K, const CallEvent *Call=nullptr) const
A simple wrapper when you only need to notify checkers of pointer-escape of some values.
CheckerManager & getCheckerManager() const
static std::optional< SVal > getObjectUnderConstruction(ProgramStateRef State, const ConstructionContextItem &Item, const StackFrame *SF)
By looking at a certain item that may be potentially part of an object's ConstructionContext,...
unsigned getNumVisitedCurrent() const
void VisitOffsetOfExpr(const OffsetOfExpr *Ex, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitOffsetOfExpr - Transfer function for offsetof.
void evalLoad(ExplodedNodeSet &Dst, const Expr *NodeEx, const Expr *BoundExpr, ExplodedNode *Pred, ProgramStateRef St, SVal location, const ProgramPointTag *tag=nullptr, QualType LoadTy=QualType())
Simulate a read of the result of Ex.
void VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitCompoundLiteralExpr - Transfer function logic for compound literals.
void evalStore(ExplodedNodeSet &Dst, const Expr *AssignE, const Expr *StoreE, ExplodedNode *Pred, ProgramStateRef St, SVal TargetLV, SVal Val, const ProgramPointTag *tag=nullptr)
evalStore - Handle the semantics of a store via an assignment.
void VisitCastExpr(const CastExpr *CastE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitCastExpr - Transfer function logic for all casts (implicit and explicit).
void VisitPseudoObjectExpr(const PseudoObjectExpr *PE, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void handleLValueBitCast(ProgramStateRef state, const Expr *Ex, const StackFrame *SF, QualType T, QualType ExTy, const CastExpr *CastE, ExplodedNodeSet &Dst, ExplodedNode *Pred)
static bool isLocType(QualType T)
MemRegion - The root abstract class for all memory regions.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
bool isZeroConstant() const
bool isUnknownOrUndef() 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.
std::optional< SVal > evalBaseToDerived(SVal Base, QualType DerivedPtrType)
Attempts to do a down cast.
TypedValueRegion - An abstract class representing regions having a typed value.
const VarDecl * getDecl() const override=0
Value representing integer constant.
Value representing pointer-to-member.
@ PSK_EscapeOther
The reason for pointer escape is unknown.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
@ Result
The result type of a method or function.
const FunctionProtoType * T
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
EvalResult is a struct with detailed info about an evaluated expression.