58 SVal LeftV = state->getSVal(LHS, LCtx);
59 SVal RightV = state->getSVal(RHS, LCtx);
63 if (Op == BO_Assign) {
74 evalStore(Tmp2, B, LHS, *it, state->BindExpr(B, LCtx, ExprVal),
87 RightV, LeftV, RHS, svalBuilder, Count, LCtx);
89 LeftV, RightV, LHS, svalBuilder, Count, LCtx);
96 state = createTemporaryRegionIfNeeded(state, LCtx, LHS);
101 if (!
Result.isUnknown()) {
102 state = state->BindExpr(B, LCtx,
Result);
117 llvm_unreachable(
"Invalid opcode for compound assignment.");
118 case BO_MulAssign: Op = BO_Mul;
break;
119 case BO_DivAssign: Op = BO_Div;
break;
120 case BO_RemAssign: Op = BO_Rem;
break;
121 case BO_AddAssign: Op = BO_Add;
break;
122 case BO_SubAssign: Op = BO_Sub;
break;
123 case BO_ShlAssign: Op = BO_Shl;
break;
124 case BO_ShrAssign: Op = BO_Shr;
break;
125 case BO_AndAssign: Op = BO_And;
break;
126 case BO_XorAssign: Op = BO_Xor;
break;
127 case BO_OrAssign: Op = BO_Or;
break;
133 SVal location = LeftV;
134 evalLoad(Tmp, B, LHS, *it, state, location);
137 state = N->getState();
139 SVal V = state->getSVal(LHS, LCtx);
143 cast<CompoundAssignOperator>(B)->getComputationResultType();
147 cast<CompoundAssignOperator>(B)->getComputationLHSType();
181 state = state->BindExpr(B, LCtx, location);
183 state = state->BindExpr(B, LCtx,
Result);
185 evalStore(Tmp2, B, LHS, N, state, location, LHSVal);
209 dyn_cast_or_null<BlockDataRegion>(
V.getAsRegion())) {
211 auto ReferencedVars = BDR->referenced_vars();
214 for (
auto Var : ReferencedVars) {
215 const VarRegion *capturedR = Var.getCapturedRegion();
224 const Expr *copyExpr =
nullptr;
226 assert(CI->getVariable() == capturedR->
getDecl());
227 copyExpr = CI->getCopyExpr();
231 if (capturedR != originalR) {
235 originalV = State->getSVal(copyExpr, LCtx);
266 SVal OrigV = state->getSVal(Ex, LCtx);
270 if (CastE->
getCastKind() == CK_BooleanToSignedIntegral &&
V.isValid())
273 state = state->BindExpr(CastE, LCtx,
V);
289 CastE->
getCastKind() == CK_LValueToRValueBitCast) {
293 evalLoad(Dst, CastE, CastE, subExprNode, state, state->getSVal(Ex, LCtx));
302 if (
const ExplicitCastExpr *ExCast=dyn_cast_or_null<ExplicitCastExpr>(CastE))
303 T = ExCast->getTypeAsWritten();
311 case CK_LValueToRValue:
312 case CK_LValueToRValueBitCast:
313 llvm_unreachable(
"LValueToRValue casts handled earlier.");
318 case CK_ARCProduceObject:
319 case CK_ARCConsumeObject:
320 case CK_ARCReclaimReturnedObject:
321 case CK_ARCExtendBlockObject:
322 case CK_CopyAndAutoreleaseBlockObject:
326 case CK_AtomicToNonAtomic:
327 case CK_NonAtomicToAtomic:
330 case CK_ConstructorConversion:
331 case CK_UserDefinedConversion:
332 case CK_FunctionToPointerDecay:
333 case CK_BuiltinFnToFnPtr:
334 case CK_HLSLArrayRValue: {
338 SVal V = state->getSVal(Ex, LCtx);
339 state = state->BindExpr(CastE, LCtx,
V);
343 case CK_MemberPointerToBoolean:
344 case CK_PointerToBoolean: {
345 SVal V = state->getSVal(Ex, LCtx);
348 V = svalBuilder.
makeTruthVal(!PTMSV->isNullMemberPointer(), ExTy);
349 if (
V.isUndef() || PTMSV) {
350 state = state->BindExpr(CastE, LCtx,
V);
360 case CK_ArrayToPointerDecay:
362 case CK_AddressSpaceConversion:
363 case CK_BooleanToSignedIntegral:
364 case CK_IntegralToPointer:
365 case CK_PointerToIntegral: {
366 SVal V = state->getSVal(Ex, LCtx);
367 if (isa<nonloc::PointerToMember>(
V)) {
368 state = state->BindExpr(CastE, LCtx,
UnknownVal());
377 case CK_IntegralToBoolean:
378 case CK_IntegralToFloating:
379 case CK_FloatingToIntegral:
380 case CK_FloatingToBoolean:
381 case CK_FloatingCast:
382 case CK_FloatingRealToComplex:
383 case CK_FloatingComplexToReal:
384 case CK_FloatingComplexToBoolean:
385 case CK_FloatingComplexCast:
386 case CK_FloatingComplexToIntegralComplex:
387 case CK_IntegralRealToComplex:
388 case CK_IntegralComplexToReal:
389 case CK_IntegralComplexToBoolean:
390 case CK_IntegralComplexCast:
391 case CK_IntegralComplexToFloatingComplex:
392 case CK_CPointerToObjCPointerCast:
393 case CK_BlockPointerToObjCPointerCast:
394 case CK_AnyPointerToBlockPointerCast:
395 case CK_ObjCObjectLValueCast:
396 case CK_ZeroToOCLOpaqueType:
397 case CK_IntToOCLSampler:
398 case CK_LValueBitCast:
399 case CK_FloatingToFixedPoint:
400 case CK_FixedPointToFloating:
401 case CK_FixedPointCast:
402 case CK_FixedPointToBoolean:
403 case CK_FixedPointToIntegral:
404 case CK_IntegralToFixedPoint: {
409 case CK_IntegralCast: {
411 SVal V = state->getSVal(Ex, LCtx);
412 if (AMgr.
options.ShouldSupportSymbolicIntegerCasts)
416 state = state->BindExpr(CastE, LCtx,
V);
420 case CK_DerivedToBase:
421 case CK_UncheckedDerivedToBase: {
423 SVal val = state->getSVal(Ex, LCtx);
425 state = state->BindExpr(CastE, LCtx, val);
431 SVal val = state->getSVal(Ex, LCtx);
442 if (std::optional<SVal>
V =
456 state = state->BindExpr(CastE, LCtx,
465 state = state->BindExpr(CastE, LCtx, NewSym);
468 state = state->BindExpr(CastE, LCtx, val);
473 case CK_BaseToDerived: {
474 SVal val = state->getSVal(Ex, LCtx);
490 state = state->BindExpr(CastE, LCtx, val);
494 case CK_NullToPointer: {
496 state = state->BindExpr(CastE, LCtx,
V);
500 case CK_NullToMemberPointer: {
502 state = state->BindExpr(CastE, LCtx,
V);
506 case CK_DerivedToBaseMemberPointer:
507 case CK_BaseToDerivedMemberPointer:
508 case CK_ReinterpretMemberPointer: {
509 SVal V = state->getSVal(Ex, LCtx);
514 state = state->BindExpr(CastE, LCtx, CastedPTMSV);
525 case CK_HLSLVectorTruncation: {
530 nullptr, CastE, LCtx, resultType,
532 state = state->BindExpr(CastE, LCtx, result);
551 if (isa<CXXConstructExpr, CXXStdInitializerListExpr>(
Init)) {
554 assert(isa<InitListExpr>(
Init));
555 Loc CLLoc = State->getLValue(CL, LCtx);
556 State = State->bindLoc(CLLoc,
V, LCtx);
567 if (isa<TypedefNameDecl>(*DS->
decl_begin())) {
605 SVal InitVal = state->getSVal(InitEx, LC);
609 state = finishObjectConstruction(state, DS, LC);
618 if (InitEx->isGLValue()) {
629 evalBind(Dst2, DS, UpdatedN, state->getLValue(VD, LC), InitVal,
true);
703 if (
const BinaryOperator *Term = cast_or_null<BinaryOperator>(
T.getStmt())) {
705 assert(Term->isLogicalOp());
715 assert(!SrcBlock->
empty());
752 if (NumInitElements == 0) {
758 for (
const Stmt *S : llvm::reverse(*IE)) {
759 SVal V = state->getSVal(cast<Expr>(S), LCtx);
764 state->BindExpr(IE, LCtx,
772 assert(NumInitElements <= 1);
775 if (NumInitElements == 0)
778 V = state->getSVal(IE->
getInit(0), LCtx);
808 SrcState = N->getState();
812 assert(SrcBlock &&
"missing function entry");
816 bool hasValue =
false;
819 for (
CFGElement CE : llvm::reverse(*SrcBlock)) {
820 if (std::optional<CFGStmt> CS = CE.getAs<
CFGStmt>()) {
821 const Expr *ValEx = cast<Expr>(CS->getStmt());
827 L = OpaqueEx->getSourceExpr();
833 V = SrcState->getSVal(ValEx, LCtx);
844 B.
generateNode(Ex, Pred, state->BindExpr(Ex, LCtx,
V,
true));
880 if (Ex->
getKind() == UETT_SizeOf) {
899 state = state->BindExpr(
900 Ex, N->getLocationContext(),
917 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
920 Bldr.
generateNode(
U, N, state->BindExpr(
U, LCtx, state->getSVal(Ex, LCtx)));
933 switch (
U->getOpcode()) {
942 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
951 assert (
U->getType() == Ex->
getType());
955 state->BindExpr(
U, LCtx, state->getSVal(Ex, LCtx)));
960 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
976 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
977 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex)) {
980 if (isa<CXXMethodDecl, FieldDecl, IndirectFieldDecl>(VD)) {
993 assert(!
U->isGLValue());
1004 assert (!
U->isGLValue());
1005 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1010 SVal V = state->getSVal(Ex, LCtx);
1012 if (
V.isUnknownOrUndef()) {
1017 switch (
U->getOpcode()) {
1019 llvm_unreachable(
"Invalid Opcode.");
1022 state = state->BindExpr(
1027 state = state->BindExpr(
U, LCtx,
1036 if (std::optional<Loc> LV =
V.getAs<
Loc>()) {
1047 state = state->BindExpr(
U, LCtx,
Result);
1063 assert (
U->isIncrementDecrementOp());
1064 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1068 SVal loc = state->getSVal(Ex, LCtx);
1077 state = N->getState();
1078 assert(LCtx == N->getLocationContext());
1079 SVal V2_untested = state->getSVal(Ex, LCtx);
1083 state = state->BindExpr(
U, LCtx, V2_untested);
1088 evalStore(Dst3,
U, Ex, N, state, loc, V2_untested);
1104 if (
U->getType()->isAnyPointerType())
1106 else if (
U->getType()->isIntegralOrEnumerationType())
1115 if (
U->getType()->isBooleanType() &&
U->isIncrementOp())