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);
139 state = (*I)->getState();
141 SVal V = state->getSVal(LHS, LCtx);
145 cast<CompoundAssignOperator>(B)->getComputationResultType();
149 cast<CompoundAssignOperator>(B)->getComputationLHSType();
184 state = state->BindExpr(B, LCtx, location);
186 state = state->BindExpr(B, LCtx,
Result);
188 evalStore(Tmp2, B, LHS, *I, state, location, LHSVal);
212 dyn_cast_or_null<BlockDataRegion>(
V.getAsRegion())) {
215 E = BDR->referenced_vars_end();
219 for (; I != E; ++I) {
229 const Expr *copyExpr =
nullptr;
231 assert(CI->getVariable() == capturedR->
getDecl());
232 copyExpr = CI->getCopyExpr();
236 if (capturedR != originalR) {
240 originalV = State->getSVal(copyExpr, LCtx);
271 SVal OrigV = state->getSVal(Ex, LCtx);
274 if (CastE->
getCastKind() == CK_BooleanToSignedIntegral &&
V.isValid())
277 state = state->BindExpr(CastE, LCtx,
V);
293 CastE->
getCastKind() == CK_LValueToRValueBitCast) {
299 evalLoad(Dst, CastE, CastE, subExprNode, state, state->getSVal(Ex, LCtx));
308 if (
const ExplicitCastExpr *ExCast=dyn_cast_or_null<ExplicitCastExpr>(CastE))
309 T = ExCast->getTypeAsWritten();
320 case CK_LValueToRValue:
321 case CK_LValueToRValueBitCast:
322 llvm_unreachable(
"LValueToRValue casts handled earlier.");
327 case CK_ARCProduceObject:
328 case CK_ARCConsumeObject:
329 case CK_ARCReclaimReturnedObject:
330 case CK_ARCExtendBlockObject:
331 case CK_CopyAndAutoreleaseBlockObject:
335 case CK_AtomicToNonAtomic:
336 case CK_NonAtomicToAtomic:
339 case CK_ConstructorConversion:
340 case CK_UserDefinedConversion:
341 case CK_FunctionToPointerDecay:
342 case CK_BuiltinFnToFnPtr: {
346 SVal V = state->getSVal(Ex, LCtx);
347 state = state->BindExpr(CastE, LCtx,
V);
351 case CK_MemberPointerToBoolean:
352 case CK_PointerToBoolean: {
353 SVal V = state->getSVal(Ex, LCtx);
356 V = svalBuilder.
makeTruthVal(!PTMSV->isNullMemberPointer(), ExTy);
357 if (
V.isUndef() || PTMSV) {
358 state = state->BindExpr(CastE, LCtx,
V);
368 case CK_ArrayToPointerDecay:
370 case CK_AddressSpaceConversion:
371 case CK_BooleanToSignedIntegral:
372 case CK_IntegralToPointer:
373 case CK_PointerToIntegral: {
374 SVal V = state->getSVal(Ex, LCtx);
375 if (isa<nonloc::PointerToMember>(
V)) {
376 state = state->BindExpr(CastE, LCtx,
UnknownVal());
385 case CK_IntegralToBoolean:
386 case CK_IntegralToFloating:
387 case CK_FloatingToIntegral:
388 case CK_FloatingToBoolean:
389 case CK_FloatingCast:
390 case CK_FloatingRealToComplex:
391 case CK_FloatingComplexToReal:
392 case CK_FloatingComplexToBoolean:
393 case CK_FloatingComplexCast:
394 case CK_FloatingComplexToIntegralComplex:
395 case CK_IntegralRealToComplex:
396 case CK_IntegralComplexToReal:
397 case CK_IntegralComplexToBoolean:
398 case CK_IntegralComplexCast:
399 case CK_IntegralComplexToFloatingComplex:
400 case CK_CPointerToObjCPointerCast:
401 case CK_BlockPointerToObjCPointerCast:
402 case CK_AnyPointerToBlockPointerCast:
403 case CK_ObjCObjectLValueCast:
404 case CK_ZeroToOCLOpaqueType:
405 case CK_IntToOCLSampler:
406 case CK_LValueBitCast:
407 case CK_FloatingToFixedPoint:
408 case CK_FixedPointToFloating:
409 case CK_FixedPointCast:
410 case CK_FixedPointToBoolean:
411 case CK_FixedPointToIntegral:
412 case CK_IntegralToFixedPoint: {
417 case CK_IntegralCast: {
419 SVal V = state->getSVal(Ex, LCtx);
420 if (AMgr.
options.ShouldSupportSymbolicIntegerCasts)
424 state = state->BindExpr(CastE, LCtx,
V);
428 case CK_DerivedToBase:
429 case CK_UncheckedDerivedToBase: {
431 SVal val = state->getSVal(Ex, LCtx);
433 state = state->BindExpr(CastE, LCtx, val);
439 SVal val = state->getSVal(Ex, LCtx);
450 if (std::optional<SVal>
V =
464 state = state->BindExpr(CastE, LCtx,
473 state = state->BindExpr(CastE, LCtx, NewSym);
476 state = state->BindExpr(CastE, LCtx, val);
481 case CK_BaseToDerived: {
482 SVal val = state->getSVal(Ex, LCtx);
498 state = state->BindExpr(CastE, LCtx, val);
502 case CK_NullToPointer: {
504 state = state->BindExpr(CastE, LCtx,
V);
508 case CK_NullToMemberPointer: {
510 state = state->BindExpr(CastE, LCtx,
V);
514 case CK_DerivedToBaseMemberPointer:
515 case CK_BaseToDerivedMemberPointer:
516 case CK_ReinterpretMemberPointer: {
517 SVal V = state->getSVal(Ex, LCtx);
522 state = state->BindExpr(CastE, LCtx, CastedPTMSV);
532 case CK_VectorSplat: {
537 nullptr, CastE, LCtx, resultType,
539 state = state->BindExpr(CastE, LCtx, result);
558 if (isa<CXXConstructExpr, CXXStdInitializerListExpr>(Init)) {
561 assert(isa<InitListExpr>(Init));
562 Loc CLLoc = State->getLValue(CL, LCtx);
563 State = State->bindLoc(CLLoc,
V, LCtx);
574 if (isa<TypedefNameDecl>(*DS->
decl_begin())) {
612 SVal InitVal = state->getSVal(InitEx, LC);
616 state = finishObjectConstruction(state, DS, LC);
625 if (InitEx->isGLValue()) {
636 evalBind(Dst2, DS, UpdatedN, state->getLValue(VD, LC), InitVal,
true);
712 assert(Term->isLogicalOp());
722 assert(!SrcBlock->
empty());
759 if (NumInitElements == 0) {
765 for (
const Stmt *S : llvm::reverse(*IE)) {
766 SVal V = state->getSVal(cast<Expr>(S), LCtx);
771 state->BindExpr(IE, LCtx,
779 assert(NumInitElements <= 1);
782 if (NumInitElements == 0)
785 V = state->getSVal(IE->
getInit(0), LCtx);
815 SrcState = N->getState();
819 assert(SrcBlock &&
"missing function entry");
823 bool hasValue =
false;
826 for (
CFGElement CE : llvm::reverse(*SrcBlock)) {
827 if (std::optional<CFGStmt> CS = CE.getAs<
CFGStmt>()) {
828 const Expr *ValEx = cast<Expr>(CS->getStmt());
834 L = OpaqueEx->getSourceExpr();
840 V = SrcState->getSVal(ValEx, LCtx);
851 B.
generateNode(Ex, Pred, state->BindExpr(Ex, LCtx,
V,
true));
888 if (Ex->
getKind() == UETT_SizeOf) {
907 state = state->BindExpr(Ex, (*I)->getLocationContext(),
926 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
930 state->getSVal(Ex, LCtx)));
944 switch (
U->getOpcode()) {
953 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
962 assert (
U->getType() == Ex->
getType());
966 state->getSVal(Ex, LCtx)));
971 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
987 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
988 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex)) {
991 if (isa<CXXMethodDecl, FieldDecl, IndirectFieldDecl>(VD)) {
1004 assert(!
U->isGLValue());
1007 case UO_Extension: {
1015 assert (!
U->isGLValue());
1016 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1021 SVal V = state->getSVal(Ex, LCtx);
1023 if (
V.isUnknownOrUndef()) {
1028 switch (
U->getOpcode()) {
1030 llvm_unreachable(
"Invalid Opcode.");
1033 state = state->BindExpr(
1038 state = state->BindExpr(
U, LCtx,
1047 if (std::optional<Loc> LV =
V.getAs<
Loc>()) {
1058 state = state->BindExpr(
U, LCtx,
Result);
1074 assert (
U->isIncrementDecrementOp());
1075 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1079 SVal loc = state->getSVal(Ex, LCtx);
1089 state = (*I)->getState();
1090 assert(LCtx == (*I)->getLocationContext());
1091 SVal V2_untested = state->getSVal(Ex, LCtx);
1095 state = state->BindExpr(
U, LCtx, V2_untested);
1100 evalStore(Dst3,
U, Ex, *I, state, loc, V2_untested);
1116 if (
U->getType()->isAnyPointerType())
1118 else if (
U->getType()->isIntegralOrEnumerationType())
1127 if (
U->getType()->isBooleanType() &&
U->isIncrementOp())
1146 if (!state->assume(Constraint,
true)) {
1149 Constraint = svalBuilder.
evalEQ(state, SymVal,
1152 state = state->assume(Constraint,
false);
1161 state = state->BindExpr(
U, LCtx, loc);
1163 state = state->BindExpr(
U, LCtx,
U->isPostfix() ? V2 :
Result);
static SVal getValue(SVal val, SValBuilder &svalBuilder)
static CompilationDatabasePluginRegistry::Add< FixedCompilationDatabasePlugin > X("fixed-compilation-database", "Reads plain-text flags file")
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
static SVal conjureOffsetSymbolOnLocation(SVal Symbol, SVal Other, Expr *Expression, SValBuilder &svalBuilder, unsigned Count, const LocationContext *LCtx)
Optionally conjure and return a symbol for offset when processing an expression Expression.
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
CanQualType getCanonicalType(QualType T) const
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)
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()
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].
const Expr * getInitializer() const
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, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) 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.
Describes an C or C++ initializer list.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
Represents a class type in Objective C.
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...
A (possibly-)qualified type.
Stmt - This represents one statement.
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
bool isRValueReferenceType() const
bool isConstantSizeType() const
Return true if this is not a variable sized type, according to the rules of C99 6....
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isVariableArrayType() const
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isLValueReferenceType() const
bool isAnyComplexType() const
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isVectorType() const
bool isFloatingType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() 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
AnalyzerOptions & options
llvm::ImmutableList< SVal > getEmptySValList()
llvm::ImmutableList< SVal > prependSVal(SVal X, llvm::ImmutableList< SVal > L)
LLVM_ATTRIBUTE_RETURNS_NONNULL const VarRegion * getCapturedRegion() const
LLVM_ATTRIBUTE_RETURNS_NONNULL const VarRegion * getOriginalRegion() 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.
ImplTy::iterator iterator
void insert(const ExplodedNodeSet &S)
const ProgramStateRef & getState() const
pred_iterator pred_begin()
ProgramPoint getLocation() const
getLocation - Returns the edge associated with the given node.
unsigned pred_size() const
const LocationContext * getLocationContext() 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.
void VisitCast(const CastExpr *CastE, const Expr *Ex, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitCast - Transfer function logic for all casts (implicit and explicit).
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 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.
ProgramStateRef handleLValueBitCast(ProgramStateRef state, const Expr *Ex, const LocationContext *LCtx, QualType T, QualType ExTy, const CastExpr *CastE, StmtNodeBuilder &Bldr, ExplodedNode *Pred)
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,...
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()
void handleUOExtension(ExplodedNodeSet::iterator I, const UnaryOperator *U, StmtNodeBuilder &Bldr)
void VisitInitListExpr(const InitListExpr *E, ExplodedNode *Pred, ExplodedNodeSet &Dst)
void VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *Ex, ExplodedNode *Pred, ExplodedNodeSet &Dst)
VisitUnaryExprOrTypeTraitExpr - Transfer function for sizeof.
CheckerManager & getCheckerManager() 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.
SValBuilder & getSValBuilder()
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.
static bool isLocType(QualType T)
void takeNodes(const ExplodedNodeSet &S)
void addNodes(const ExplodedNodeSet &S)
const ExplodedNodeSet & getResults()
StoreManager & getStoreManager()
DefinedOrUnknownSVal makeZeroVal(QualType type)
Construct an SVal representing '0' for the specified type.
DefinedSVal getMemberPointer(const NamedDecl *ND)
NonLoc makePointerToMember(const DeclaratorDecl *DD)
SVal evalMinus(NonLoc val)
SVal evalComplement(NonLoc val)
NonLoc makeCompoundVal(QualType type, llvm::ImmutableList< SVal > vals)
DefinedSVal getBlockPointer(const BlockDecl *block, CanQualType locTy, const LocationContext *locContext, unsigned blockCount)
NonLoc makeArrayIndex(uint64_t idx)
nonloc::ConcreteInt makeIntVal(const IntegerLiteral *integer)
SVal evalCast(SVal V, QualType CastTy, QualType OriginalTy)
Cast a given SVal to another SVal using given QualType's.
DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, const Expr *expr, const LocationContext *LCtx, unsigned count)
Create a new symbol with a unique 'name'.
SVal evalEQ(ProgramStateRef state, SVal lhs, SVal rhs)
nonloc::ConcreteInt makeTruthVal(bool b, QualType type)
loc::ConcreteInt makeNullWithType(QualType type)
Create NULL pointer, with proper pointer bit-width for given address space.
SVal evalIntegralCast(ProgramStateRef state, SVal val, QualType castTy, QualType originalType)
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.
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)
ExplodedNode * generateSink(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.
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.
@ Result
The result type of a method or function.
EvalResult is a struct with detailed info about an evaluated expression.
unsigned blockCount() const
Returns the number of times the current basic block has been visited on the exploded graph path.