59 SVal LeftV = state->getSVal(LHS, SF);
60 SVal RightV = state->getSVal(RHS, SF);
64 if (Op == BO_Assign) {
75 evalStore(Tmp2, B, LHS, *it, state->BindExpr(B, SF, ExprVal), LeftV,
99 state = createTemporaryRegionIfNeeded(state, SF, LHS);
104 if (!
Result.isUnknown()) {
105 state = state->BindExpr(B, SF,
Result);
120 llvm_unreachable(
"Invalid opcode for compound assignment.");
121 case BO_MulAssign: Op = BO_Mul;
break;
122 case BO_DivAssign: Op = BO_Div;
break;
123 case BO_RemAssign: Op = BO_Rem;
break;
124 case BO_AddAssign: Op = BO_Add;
break;
125 case BO_SubAssign: Op = BO_Sub;
break;
126 case BO_ShlAssign: Op = BO_Shl;
break;
127 case BO_ShrAssign: Op = BO_Shr;
break;
128 case BO_AndAssign: Op = BO_And;
break;
129 case BO_XorAssign: Op = BO_Xor;
break;
130 case BO_OrAssign: Op = BO_Or;
break;
136 SVal location = LeftV;
137 evalLoad(Tmp, B, LHS, *it, state, location);
140 state = N->getState();
142 SVal V = state->getSVal(LHS, SF);
156 V = svalBuilder.evalCast(
V, CLHSTy, LTy);
171 LHSVal = svalBuilder.conjureSymbolVal(
nullptr,
175 Result = svalBuilder.evalCast(LHSVal, CTy, LTy);
179 LHSVal = svalBuilder.evalCast(
Result, LTy, CTy);
185 state = state->BindExpr(B, SF, location);
187 state = state->BindExpr(B, SF,
Result);
189 evalStore(Tmp2, B, LHS, N, state, location, LHSVal);
212 dyn_cast_or_null<BlockDataRegion>(
V.getAsRegion())) {
214 auto ReferencedVars = BDR->referenced_vars();
217 for (
auto Var : ReferencedVars) {
218 const VarRegion *capturedR = Var.getCapturedRegion();
227 const Expr *copyExpr =
nullptr;
229 assert(CI->getVariable() == capturedR->
getDecl());
230 copyExpr = CI->getCopyExpr();
234 if (capturedR != originalR) {
238 originalV = State->getSVal(copyExpr, SF);
261 if (T->isLValueReferenceType()) {
264 }
else if (T->isRValueReferenceType()) {
269 SVal OrigV = state->getSVal(Ex, SF);
270 SVal SimplifiedOrigV = svalBuilder.simplifySVal(state, OrigV);
271 SVal V = svalBuilder.evalCast(SimplifiedOrigV, T, ExTy);
273 if (CastE->
getCastKind() == CK_BooleanToSignedIntegral &&
V.isValid())
274 V = svalBuilder.evalMinus(
V.castAs<
NonLoc>());
276 state = state->BindExpr(CastE, SF,
V);
295 evalLoad(Dst, CastE, CastE, Node, State, State->getSVal(Ex, SF));
299 if (CastE->
getCastKind() == CK_LValueToRValueBitCast) {
307 evalLocation(DstEvalLoc, CastE, Ex, Node, State, State->getSVal(Ex, SF),
322 if (
const MemRegion *MR = State->getSVal(Ex, SF).getAsRegion()) {
323 SVal OrigV = State->getSVal(MR);
324 CastedV = svalBuilder.evalCast(svalBuilder.simplifySVal(State, OrigV),
327 State = State->BindExpr(CastE, SF, CastedV);
337 if (
const ExplicitCastExpr *ExCast=dyn_cast_or_null<ExplicitCastExpr>(CastE))
338 T = ExCast->getTypeAsWritten();
346 case CK_LValueToRValue:
347 case CK_LValueToRValueBitCast:
348 llvm_unreachable(
"LValueToRValue casts handled earlier.");
353 case CK_ARCProduceObject:
354 case CK_ARCConsumeObject:
355 case CK_ARCReclaimReturnedObject:
356 case CK_ARCExtendBlockObject:
357 case CK_CopyAndAutoreleaseBlockObject:
361 case CK_AtomicToNonAtomic:
362 case CK_NonAtomicToAtomic:
365 case CK_ConstructorConversion:
366 case CK_UserDefinedConversion:
367 case CK_FunctionToPointerDecay:
368 case CK_BuiltinFnToFnPtr:
369 case CK_HLSLArrayRValue: {
373 SVal V = state->getSVal(Ex, SF);
374 state = state->BindExpr(CastE, SF,
V);
378 case CK_MemberPointerToBoolean:
379 case CK_PointerToBoolean: {
380 SVal V = state->getSVal(Ex, SF);
383 V = svalBuilder.makeTruthVal(!PTMSV->isNullMemberPointer(), ExTy);
384 if (
V.isUndef() || PTMSV) {
385 state = state->BindExpr(CastE, SF,
V);
394 case CK_ArrayToPointerDecay:
396 case CK_AddressSpaceConversion:
397 case CK_BooleanToSignedIntegral:
398 case CK_IntegralToPointer:
399 case CK_PointerToIntegral: {
400 SVal V = state->getSVal(Ex, SF);
402 state = state->BindExpr(CastE, SF,
UnknownVal());
410 case CK_IntegralToBoolean:
411 case CK_IntegralToFloating:
412 case CK_FloatingToIntegral:
413 case CK_FloatingToBoolean:
414 case CK_FloatingCast:
415 case CK_FloatingRealToComplex:
416 case CK_FloatingComplexToReal:
417 case CK_FloatingComplexToBoolean:
418 case CK_FloatingComplexCast:
419 case CK_FloatingComplexToIntegralComplex:
420 case CK_IntegralRealToComplex:
421 case CK_IntegralComplexToReal:
422 case CK_IntegralComplexToBoolean:
423 case CK_IntegralComplexCast:
424 case CK_IntegralComplexToFloatingComplex:
425 case CK_CPointerToObjCPointerCast:
426 case CK_BlockPointerToObjCPointerCast:
427 case CK_AnyPointerToBlockPointerCast:
428 case CK_ObjCObjectLValueCast:
429 case CK_ZeroToOCLOpaqueType:
430 case CK_IntToOCLSampler:
431 case CK_LValueBitCast:
432 case CK_FloatingToFixedPoint:
433 case CK_FixedPointToFloating:
434 case CK_FixedPointCast:
435 case CK_FixedPointToBoolean:
436 case CK_FixedPointToIntegral:
437 case CK_IntegralToFixedPoint: {
441 case CK_IntegralCast: {
443 SVal V = state->getSVal(Ex, SF);
444 if (AMgr.options.ShouldSupportSymbolicIntegerCasts)
445 V = svalBuilder.evalCast(
V, T, ExTy);
447 V = svalBuilder.evalIntegralCast(state,
V, T, ExTy);
448 state = state->BindExpr(CastE, SF,
V);
452 case CK_DerivedToBase:
453 case CK_UncheckedDerivedToBase: {
455 SVal val = state->getSVal(Ex, SF);
457 state = state->BindExpr(CastE, SF, val);
463 SVal val = state->getSVal(Ex, SF);
474 if (std::optional<SVal>
V =
475 StateMgr.getStoreManager().evalBaseToDerived(val, T)) {
481 if (T->isReferenceType()) {
488 state = state->BindExpr(CastE, SF,
489 svalBuilder.makeNullWithType(resultType));
497 state = state->BindExpr(CastE, SF, NewSym);
500 state = state->BindExpr(CastE, SF, val);
505 case CK_BaseToDerived: {
506 SVal val = state->getSVal(Ex, SF);
518 val = svalBuilder.conjureSymbolVal(
522 state = state->BindExpr(CastE, SF, val);
526 case CK_NullToPointer: {
527 SVal V = svalBuilder.makeNullWithType(CastE->
getType());
528 state = state->BindExpr(CastE, SF,
V);
532 case CK_NullToMemberPointer: {
533 SVal V = svalBuilder.getMemberPointer(
nullptr);
534 state = state->BindExpr(CastE, SF,
V);
538 case CK_DerivedToBaseMemberPointer:
539 case CK_BaseToDerivedMemberPointer:
540 case CK_ReinterpretMemberPointer: {
541 SVal V = state->getSVal(Ex, SF);
544 svalBuilder.makePointerToMember(
getBasicVals().accumCXXBase(
546 state = state->BindExpr(CastE, SF, CastedPTMSV);
557 case CK_HLSLElementwiseCast:
558 case CK_HLSLAggregateSplatCast:
559 case CK_HLSLMatrixTruncation:
560 case CK_HLSLVectorTruncation: {
564 SVal result = svalBuilder.conjureSymbolVal(
567 state = state->BindExpr(CastE, SF, result);
584 SVal V = State->getSVal(
CL->getInitializer(), SF);
590 Loc CLLoc = State->getLValue(
CL, SF);
591 State = State->bindLoc(CLLoc,
V, SF);
628 NodeBuilder B(dstPreVisit, dstEvaluated, *currBldrCtx);
640 SVal InitVal = state->getSVal(InitEx, SF);
644 state = finishObjectConstruction(state, DS, SF);
653 if (InitEx->isGLValue()) {
657 InitVal = svalBuilder.conjureSymbolVal(
665 evalBind(Dst2, DS, UpdatedN, state->getLValue(VD, SF), InitVal,
true);
739 if (
const BinaryOperator *Term = cast_or_null<BinaryOperator>(T.getStmt())) {
741 assert(Term->isLogicalOp());
745 X = svalBuilder.makeIntVal(constant, B->
getType());
751 assert(!SrcBlock->
empty());
764 svalBuilder.evalCast(RHSVal, B->
getType(), RHS->getType()),
786 auto Edge = N->getLocationAs<
BlockEdge>();
787 if (!Edge.has_value()) {
795 SrcBlock = Edge->getSrc();
796 SrcState = N->getState();
800 assert(SrcBlock &&
"missing function entry");
804 bool hasValue =
false;
807 for (
CFGElement CE : llvm::reverse(*SrcBlock)) {
808 if (std::optional<CFGStmt> CS = CE.getAs<
CFGStmt>()) {
815 L = OpaqueEx->getSourceExpr();
819 if (ValEx == L->
IgnoreParens() || ValEx == R->IgnoreParens()) {
821 V = SrcState->getSVal(ValEx, SF);
841 APSInt IV =
Result.Val.getInt();
845 SVal X = svalBuilder.makeIntVal(IV);
862 NodeBuilder Bldr(CheckedSet, EvalSet, *currBldrCtx);
867 if (Ex->
getKind() == UETT_SizeOf || Ex->
getKind() == UETT_DataSizeOf ||
868 Ex->
getKind() == UETT_CountOf) {
869 if (!T->isIncompleteType() && !T->isConstantSizeType()) {
870 assert(T->isVariableArrayType() &&
"Unknown non-constant-sized type.");
887 state = state->BindExpr(
888 Ex, N->getStackFrame(),
905 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
908 Bldr.
generateNode(
U, N, state->BindExpr(
U, SF, state->getSVal(Ex, SF)));
918 NodeBuilder Bldr(CheckedSet, EvalSet, *currBldrCtx);
921 switch (
U->getOpcode()) {
930 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
939 assert (
U->getType() == Ex->
getType());
942 Bldr.
generateNode(
U, N, state->BindExpr(
U, SF, state->getSVal(Ex, SF)));
947 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
963 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
964 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Ex)) {
980 assert(!
U->isGLValue());
991 assert (!
U->isGLValue());
992 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
997 SVal V = state->getSVal(Ex, SF);
999 if (
V.isUnknownOrUndef()) {
1004 switch (
U->getOpcode()) {
1006 llvm_unreachable(
"Invalid Opcode.");
1009 state = state->BindExpr(
1010 U, SF, svalBuilder.evalComplement(
V.castAs<
NonLoc>()));
1015 state->BindExpr(
U, SF, svalBuilder.evalMinus(
V.castAs<
NonLoc>()));
1023 if (std::optional<Loc> LV =
V.getAs<
Loc>()) {
1024 Loc X = svalBuilder.makeNullWithType(Ex->
getType());
1034 state = state->BindExpr(
U, SF,
Result);
1050 assert (
U->isIncrementDecrementOp());
1051 const Expr *Ex =
U->getSubExpr()->IgnoreParens();
1055 SVal loc = state->getSVal(Ex, SF);
1064 state = N->getState();
1065 assert(SF == N->getStackFrame());
1066 SVal V2_untested = state->getSVal(Ex, SF);
1070 state = state->BindExpr(
U, SF, V2_untested);
1091 if (
U->getType()->isAnyPointerType())
1092 RHS = svalBuilder.makeArrayIndex(1);
1093 else if (
U->getType()->isIntegralOrEnumerationType())
1094 RHS = svalBuilder.makeIntVal(1,
U->getType());
1102 if (
U->getType()->isBooleanType() &&
U->isIncrementOp())
1103 Result = svalBuilder.makeTruthVal(
true,
U->getType());
1119 svalBuilder.evalEQ(state, V2,svalBuilder.makeZeroVal(
U->getType()));
1121 if (!state->assume(Constraint,
true)) {
1124 Constraint = svalBuilder.evalEQ(state, SymVal,
1125 svalBuilder.makeZeroVal(
U->getType()));
1127 state = state->assume(Constraint,
false);
1136 state = state->BindExpr(
U, SF,
loc);
1138 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.
static SVal conjureOffsetSymbolOnLocation(SVal Symbol, SVal Other, ConstCFGElementRef Elem, QualType Ty, SValBuilder &svalBuilder, unsigned Count, const StackFrame *SF)
Optionally conjure and return a symbol for offset when processing Elem.
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].
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.
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.
It represents a stack frame of the call stack.
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 isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
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()
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.
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 StackFrame *SF, QualType T, QualType ExTy, const CastExpr *CastE, NodeBuilder &Bldr, ExplodedNode *Pred)
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 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 handleUOExtension(ExplodedNode *N, const UnaryOperator *U, NodeBuilder &Bldr)
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)
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
DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, ConstCFGElementRef elem, const StackFrame *SF, 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.
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
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
CFGBlock::ConstCFGElementRef ConstCFGElementRef
@ Result
The result type of a method or function.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
EvalResult is a struct with detailed info about an evaluated expression.