49#include "llvm/ADT/ArrayRef.h"
50#include "llvm/ADT/DenseMap.h"
51#include "llvm/ADT/ImmutableList.h"
52#include "llvm/ADT/PointerIntPair.h"
53#include "llvm/ADT/SmallSet.h"
54#include "llvm/ADT/SmallVector.h"
55#include "llvm/ADT/StringExtras.h"
56#include "llvm/ADT/StringRef.h"
57#include "llvm/Support/Compiler.h"
58#include "llvm/Support/Debug.h"
59#include "llvm/Support/ErrorHandling.h"
60#include "llvm/Support/raw_ostream.h"
65#define DEBUG_TYPE "static-analyzer-call-event"
80 if (T->isBlockPointerType() ||
81 T->isFunctionPointerType() ||
88 if (T->isAnyPointerType() || T->isReferenceType())
89 T = T->getPointeeType();
91 if (
const RecordType *RT = T->getAsStructureType()) {
93 for (
const auto *I : RD->
fields()) {
124 I != E && Idx < NumOfArgs; ++I, ++Idx) {
144 const auto *FD = dyn_cast_or_null<FunctionDecl>(
getDecl());
176 const CFGStmtMap *Map = LCtx->getAnalysisDeclContext()->getCFGStmtMap();
181 unsigned Idx = 0, Sz = B->
size();
182 for (; Idx < Sz; ++Idx)
183 if (
auto StmtElem = (*B)[Idx].getAs<CFGStmt>())
184 if (StmtElem->getStmt() == E)
188 return ADC->
getStackFrame(LCtx,
nullptr, E, B, BlockCount, Idx);
199 State->getStateManager().getRegionManager().getParamVarRegion(
224 E =
Call.param_type_end();
225 I != E; ++I, ++Idx) {
227 PreserveArgs.insert(Idx);
232 if (
const auto *CtorCall = dyn_cast<CXXConstructorCall>(&
Call)) {
233 if (
const MemRegion *R = CtorCall->getCXXThisVal().getAsRegion())
234 return R->getBaseRegion();
243 if (Callee->hasAttr<PureAttr>() || Callee->hasAttr<ConstAttr>())
252 llvm::SmallSet<unsigned, 4> PreserveArgs;
260 for (
unsigned Idx = 0, Count =
getNumArgs(); Idx != Count; ++Idx) {
263 if (PreserveArgs.count(Idx)) {
265 ArgBaseR = ArgBaseR->getBaseRegion();
269 if (ArgBaseR != ThisRegionBaseOrNull) {
277 ValuesToInvalidate.push_back(
getArgSVal(Idx));
301 nullptr,
this, &ETraits);
314 assert(D &&
"Cannot get a program point without a statement or decl");
315 assert(ElemRef.getParent() &&
316 "Cannot get a program point without a CFGElementRef");
369 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
370 return FD->getReturnType();
371 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
372 return MD->getReturnType();
373 if (
const auto *BD = dyn_cast<BlockDecl>(D)) {
385 Ty = FT->getReturnType();
393 llvm_unreachable(
"unknown callable kind");
399 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
400 return FD->isVariadic();
401 if (
const auto *MD = dyn_cast<ObjCMethodDecl>(D))
402 return MD->isVariadic();
403 if (
const auto *BD = dyn_cast<BlockDecl>(D))
404 return BD->isVariadic();
406 llvm_unreachable(
"unknown callable kind");
410 const RecordType *UT = T->getAsUnionType();
412 UT->getDecl()->getMostRecentDecl()->hasAttr<TransparentUnionAttr>();
454 const auto *CallExprDecl = dyn_cast_or_null<FunctionDecl>(
Call.getDecl());
465 if (CallExprDecl->hasPrototype() || !
Definition->hasPrototype())
473 const Expr *ArgExpr =
Call.getArgExpr(ArgIdx);
487 unsigned NumArgs =
Call.getNumArgs();
490 for (; I != E && Idx < NumArgs; ++I, ++Idx) {
491 assert(*I &&
"Formal parameter has no decl?");
495 if (
Call.isArgumentConstructedDirectly(
Call.getASTArgumentIndex(Idx)))
502 const Expr *ArgExpr =
Call.getArgExpr(Idx);
527 return Ctor->getConstructionContext();
531 return RecCall->getConstructionContext();
539 if (!CallLocationContext || CallLocationContext->inTopFrame())
542 const auto *CallSF = CallLocationContext->getStackFrame();
552 return Caller->isInSystemHeader();
588 getManager()->getContext(FD);
589 bool IsAutosynthesized;
592 if (IsAutosynthesized)
593 llvm::dbgs() <<
"Using autosynthesized body for " << FD->
getName()
599 *Engine.getCrossTranslationUnitContext();
615 if (!Opts.IsNaiveCTUEnabled)
620 Opts.DisplayCTUProgress);
622 if (!CTUDeclOrError) {
623 handleAllErrors(CTUDeclOrError.takeError(),
625 auto Loc = getOriginExpr() ? getOriginExpr()->getExprLoc()
627 CTUCtx.emitCrossTUDiagnostics(IE, Loc);
660 if (II->
isStr(
"pthread_setspecific"))
665 if (II->
isStr(
"xpc_connection_set_context"))
669 if (II->
isStr(
"funopen"))
674 if (II->
isStr(
"__cxa_demangle"))
677 StringRef FName = II->
getName();
681 if (FName.ends_with(
"NoCopy"))
686 if (FName.starts_with(
"NS") && FName.contains(
"Insert"))
691 if (FName.starts_with(
"CF") || FName.starts_with(
"CG")) {
692 return FName.contains_insensitive(
"InsertValue") ||
693 FName.contains_insensitive(
"AddValue") ||
694 FName.contains_insensitive(
"SetValue") ||
695 FName.contains_insensitive(
"WithData") ||
696 FName.contains_insensitive(
"AppendValue") ||
697 FName.contains_insensitive(
"SetAttribute");
716 if (
const auto *CMD = dyn_cast_if_present<CXXMethodDecl>(
getDecl());
717 CMD && CMD->isLambdaStaticInvoker())
738 Values.push_back(ThisVal);
741 if (
const auto *D = cast_or_null<CXXMethodDecl>(
getDecl())) {
773 return SVB.
evalCast(ThisVal,
Base->getType(), OriginalTy);
780std::pair<const CXXRecordDecl *, bool>
803 if (!MD->isVirtual())
807 if (!RD || !RD->hasDefinition())
817 assert(!RD->isDerivedFrom(MD->getParent()) &&
"Couldn't find known method");
868 std::optional<SVal>
V =
878 ThisVal = SVB.
evalCast(ThisVal, Ty, StaticTy);
884 Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
898 if (ME->hasQualifier())
912 return dyn_cast_or_null<BlockDataRegion>(DataReg);
935 Params = LambdaOperatorDecl->parameters();
943 Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
966 if (
const MemRegion *Obj =
V.getAsRegion(); Obj && IsStdClassCtor) {
983 Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
1023 if (
const ObjCIvarDecl *PropIvar = PropDecl->getPropertyIvarDecl()) {
1032 Values.push_back(IvarLVal);
1053 assert(SelfVal.
isValid() &&
"Calling super but not in ObjC method");
1068 return (RecVal == SelfVal);
1077 return getContainingPseudoObjectExpr()->getSourceRange();
1079 llvm_unreachable(
"unknown message kind");
1084const PseudoObjectExpr *ObjCMethodCall::getContainingPseudoObjectExpr()
const {
1085 assert(
Data &&
"Lazy lookup not yet performed.");
1087 return ObjCMessageDataTy::getFromOpaqueValue(
Data).getPointer();
1096 if (
const auto *BO = dyn_cast<BinaryOperator>(Syntactic))
1109 if (
const auto *POE = dyn_cast_or_null<PseudoObjectExpr>(S)) {
1114 case Stmt::ObjCPropertyRefExprClass:
1117 case Stmt::ObjCSubscriptRefExprClass:
1141 if (!Info.getPointer())
1150 assert(POE &&
"Property access without PseudoObjectExpr?");
1155 if (RefExpr->isExplicitProperty())
1156 return RefExpr->getExplicitProperty();
1172 getState()->getStateManager().getOwningEngine().getAnalysisManager();
1219 llvm_unreachable(
"The while loop should always terminate.");
1247 return {InterfaceInfo::getEmptyKey(), SelectorInfo::getEmptyKey(),
false};
1251 return {InterfaceInfo::getTombstoneKey(), SelectorInfo::getTombstoneKey(),
1256 return llvm::hash_combine(
1257 llvm::hash_code(InterfaceInfo::getHashValue(Key.
Interface)),
1277 llvm::DenseMap<PrivateMethodKey, std::optional<const ObjCMethodDecl *>>;
1282 Selector LookupSelector,
bool InstanceMethod) {
1288 std::optional<const ObjCMethodDecl *> &Val =
1293 Val =
Interface->lookupPrivateMethod(LookupSelector, InstanceMethod);
1297 Val =
Interface->lookupMethod(LookupSelector, InstanceMethod);
1312 bool CanBeSubClassed =
false;
1313 bool LookingForInstanceMethod =
true;
1317 if (!SupersType.
isNull()) {
1330 "Unhandled untyped region class!");
1337 const auto *ReceiverDynT =
1341 ReceiverT = ReceiverDynT->getObjectType();
1346 if (ReceiverT->isObjCClass()) {
1366 LookingForInstanceMethod =
false;
1371 if (CanBeSubClassed)
1389 if (CanBeSubClassed)
1429 Bindings.push_back(std::make_pair(SelfLoc, SelfVal));
1444 if (
const auto *MCE = dyn_cast<CXXMemberCallExpr>(CE))
1445 return create<CXXMemberCall>(MCE, State, LCtx, ElemRef);
1447 if (
const auto *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
1448 const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
1449 if (
const auto *MD = dyn_cast<CXXMethodDecl>(DirectCallee)) {
1450 if (MD->isImplicitObjectMemberFunction())
1451 return create<CXXMemberOperatorCall>(OpCE, State, LCtx, ElemRef);
1453 return create<CXXStaticOperatorCall>(OpCE, State, LCtx, ElemRef);
1457 return create<BlockCall>(CE, State, LCtx, ElemRef);
1462 return create<SimpleFunctionCall>(CE, State, LCtx, ElemRef);
1471 assert(CallerCtx &&
"This should not be used for top-level stack frames");
1482 SVal ThisVal = State->getSVal(ThisPtr);
1484 if (
const auto *CE = dyn_cast<CXXConstructExpr>(CallSite))
1487 if (
const auto *CIE = dyn_cast<CXXInheritedCtorInitExpr>(CallSite))
1489 CallerCtx, ElemRef);
1491 llvm_unreachable(
"This is not an inlineable statement");
1499 "All other CFG elements should have exprs");
1504 SVal ThisVal = State->getSVal(ThisPtr);
1506 const Stmt *Trigger;
1507 if (std::optional<CFGAutomaticObjDtor> AutoDtor =
1509 Trigger = AutoDtor->getTriggerStmt();
1511 Trigger = DeleteDtor->getDeleteExpr();
1513 Trigger = Dtor->getBody();
1517 CallerCtx, ElemRef);
1523 if (
const auto *CE = dyn_cast<CallExpr>(S)) {
1525 }
else if (
const auto *NE = dyn_cast<CXXNewExpr>(S)) {
1527 }
else if (
const auto *DE = dyn_cast<CXXDeleteExpr>(S)) {
1529 }
else if (
const auto *ME = dyn_cast<ObjCMessageExpr>(S)) {
Defines the clang::ASTContext interface.
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
static bool isZeroConstant(const llvm::Value *Value)
static bool isVoidPointerToNonConst(QualType T)
static const ObjCMethodDecl * findDefiningRedecl(const ObjCMethodDecl *MD)
static const ObjCMethodDecl * lookupRuntimeDefinition(const ObjCInterfaceDecl *Interface, Selector LookupSelector, bool InstanceMethod)
static const MemRegion * getThisRegionBaseOrNull(const CallEvent &Call)
static const Expr * getSyntacticFromForPseudoObjectExpr(const PseudoObjectExpr *POE)
static bool isTransparentUnion(QualType T)
llvm::PointerIntPair< const PseudoObjectExpr *, 2 > ObjCMessageDataTy
static bool isCallback(QualType T)
static SVal castArgToParamTypeIfNeeded(const CallEvent &Call, unsigned ArgIdx, SVal ArgVal, SValBuilder &SVB)
Cast the argument value to the type of the parameter at the function declaration.
llvm::DenseMap< PrivateMethodKey, std::optional< const ObjCMethodDecl * > > PrivateMethodCacheTy
static SVal processArgument(SVal Value, const Expr *ArgumentExpr, const ParmVarDecl *Parameter, SValBuilder &SVB)
static PrivateMethodCacheTy PrivateMethodCache
static void findPtrToConstParams(llvm::SmallSet< unsigned, 4 > &PreserveArgs, const CallEvent &Call)
static void addParameterValuesToBindings(const StackFrame *CalleeSF, CallEvent::BindingsTy &Bindings, SValBuilder &SVB, const CallEvent &Call, ArrayRef< ParmVarDecl * > parameters)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines the clang::IdentifierInfo, clang::IdentifierTable, and clang::Selector interfaces.
static const Decl * getCanonicalDecl(const Decl *D)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
Defines the clang::SourceLocation class and associated facilities.
Defines various enumerations that describe declaration and type specifiers.
C Language Family Type Representation.
static bool isPointerToConst(const QualType &QT)
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.
QualType getReferenceQualifiedType(const Expr *e) const
getReferenceQualifiedType - Given an expr, will return the type for that expression,...
const clang::PrintingPolicy & getPrintingPolicy() const
CanQualType getCanonicalTagType(const TagDecl *TD) const
AnalysisDeclContext * getContext(const Decl *D)
AnalysisDeclContext contains the context data for the function, method or block under analysis.
const Decl * getDecl() const
const ImplicitParamDecl * getSelfDecl() const
AnalysisDeclContextManager * getManager() const
const StackFrame * getStackFrame(LocationContext const *ParentLC, const void *Data, const Expr *E, const CFGBlock *Blk, unsigned BlockCount, unsigned Index)
Obtain a context of the call stack using its parent context.
Stores options for the analyzer from the command line.
Represents a block literal declaration, which is like an unnamed FunctionDecl.
ArrayRef< ParmVarDecl * > parameters() const
Represents C++ object destructor implicitly generated for automatic object or temporary bound to cons...
Represents C++ object destructor implicitly generated for base object in destructor.
Represents a single basic block in a source-level CFG.
ElementRefImpl< true > ConstCFGElementRef
Represents a function call that returns a C++ object by value.
Represents C++ constructor call.
Represents C++ object destructor generated from a call to delete.
Represents a top-level expression in a basic block.
std::optional< T > getAs() const
Convert to the specified CFGElement type, returning std::nullopt if this CFGElement is not of the des...
Represents C++ object destructor implicitly generated by compiler on various occasions.
const CFGBlock * getBlock(const Stmt *S) const
Returns the CFGBlock the specified Stmt* appears in.
Represents C++ object destructor implicitly generated at the end of full expression for temporary obj...
Expr * getImplicitObjectArgument() const
Retrieve the implicit object argument for the member call.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
bool hasMutableFields() const
Determine whether this class, or any of its class subobjects, contains a mutable field.
bool hasDefinition() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
ConstructionContext's subclasses describe different ways of constructing an object in C++.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
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.
ArrayRef< ParmVarDecl * > parameters() const
FunctionType - C99 6.7.5.3 - Function Declarators.
One of these records is kept for each identifier that is lexed.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
const Decl * getDecl() const
const ParentMap & getParentMap() const
LLVM_ATTRIBUTE_RETURNS_NONNULL AnalysisDeclContext * getAnalysisDeclContext() const
const LocationContext * getParent() const
It might return null.
const StackFrame * getStackFrame() const
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
Represents an ObjC class declaration.
ObjCMethodDecl * lookupMethod(Selector Sel, bool isInstance, bool shallowCategoryLookup=false, bool followSuper=true, const ObjCCategoryDecl *C=nullptr) const
lookupMethod - This method returns an instance/class method by looking in the class,...
SourceLocation getEndOfDefinitionLoc() const
ObjCInterfaceDecl * getSuperClass() const
ObjCIvarDecl - Represents an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
Selector getSelector() const
@ SuperInstance
The receiver is the instance of the superclass object.
@ SuperClass
The receiver is a superclass.
bool isInstanceMessage() const
Determine whether this is an instance message to either a computed object or to super.
ObjCInterfaceDecl * getReceiverInterface() const
Retrieve the Objective-C interface to which this message is being directed, if known.
QualType getSuperType() const
Retrieve the type referred to by 'super'.
const ObjCMethodDecl * getMethodDecl() const
ObjCMethodDecl - Represents an instance or class method declaration.
bool hasBody() const override
Determine whether this method has a body.
bool isOverriding() const
Whether this method overrides any other in the class hierarchy.
ArrayRef< ParmVarDecl * > parameters() const
bool isPropertyAccessor() const
const ObjCPropertyDecl * findPropertyDecl(bool CheckOverrides=true) const
Returns the property associated with this method's selector.
ObjCMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
ObjCInterfaceDecl * getClassInterface()
Represents one property declaration in an Objective-C interface.
Stmt * getParentIgnoreParenCasts(Stmt *) const
Represents a parameter to a function.
PointerType - C99 6.7.5.1 - Pointer Declarators.
Represents a program point just after an implicit call event.
Represents a program point just before an implicit call event.
ProgramPoints can be "tagged" as representing points specific to a given analysis entity.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Expr * getSyntacticForm()
Return the syntactic form of this expression, i.e.
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getCanonicalType() const
bool isConstQualified() const
Determine whether this type is const-qualified.
Represents a struct/union/class.
field_range fields() const
RecordDecl * getDefinitionOrSelf() const
Smart pointer class that efficiently represents Objective-C method names.
const IdentifierInfo * getIdentifierInfoForSlot(unsigned argIndex) const
Retrieve the identifier at a given position in the selector.
unsigned getNumArgs() const
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
It represents a stack frame of the call stack (based on CallEvent).
unsigned getIndex() const
const Expr * getCallSite() const
CFGElement getCallSiteCFGElement() const
const CFGBlock * getCallSiteBlock() const
Stmt - This represents one statement.
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
A container of type source information.
bool isBlockPointerType() const
bool isFunctionPointerType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
Represents a variable declaration or definition.
This class is used for tools that requires cross translation unit capability.
llvm::Expected< const FunctionDecl * > getCrossTUDefinition(const FunctionDecl *FD, StringRef CrossTUDir, StringRef IndexName, bool DisplayCTUProgress=false)
This function loads a function or variable definition from an external AST file and merges it into th...
bool hasError(const Decl *ToDecl) const
Returns true if the given Decl is mapped (or created) during an import but there was an unrecoverable...
bool isImportedAsNew(const Decl *ToDecl) const
Returns true if the given Decl is newly created during the import.
static bool isInCodeFile(SourceLocation SL, const SourceManager &SM)
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
SVal getCXXThisVal() const
Returns the value of the implicit 'this' object.
void getInitialStackFrameContents(const StackFrame *CalleeSF, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
void getInitialStackFrameContents(const StackFrame *CalleeSF, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
bool argumentsMayEscape() const override
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
llvm::ImmutableList< SVal > getEmptySValList()
llvm::ImmutableList< SVal > prependSVal(SVal X, llvm::ImmutableList< SVal > L)
const BlockDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
void getInitialStackFrameContents(const StackFrame *CalleeSF, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
const BlockDataRegion * getBlockRegion() const
Returns the region associated with this instance of the block.
bool isConversionFromLambda() const
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
const VarRegion * getRegionStoringCapturedLambda() const
For a block converted from a C++ lambda, returns the block VarRegion for the variable holding the cap...
const CallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
BlockDataRegion - A region that represents a block instance.
SVal getCXXThisVal() const override
Returns the value of the implicit 'this' object.
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
bool isBaseDestructor() const
Returns true if this is a call to a base class destructor.
const StackFrame * getInheritingStackFrame() const
Obtain the stack frame of the inheriting constructor.
std::pair< const CXXRecordDecl *, bool > getDeclForDynamicType() const
Returns the decl refered to by the "dynamic type" of the current object and if the class can be a sub...
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
virtual SVal getCXXThisVal() const
Returns the value of the implicit 'this' object.
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
virtual const Expr * getCXXThisExpr() const
Returns the expression representing the implicit 'this' object.
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
void getInitialStackFrameContents(const StackFrame *CalleeSF, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
const CXXMemberCallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
const Expr * getCXXThisExpr() const override
Returns the expression representing the implicit 'this' object.
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
const Expr * getCXXThisExpr() const override
Returns the expression representing the implicit 'this' object.
const CXXOperatorCallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
CallEventRef getCaller(const StackFrame *CalleeSF, ProgramStateRef State)
Gets an outside caller given a callee context.
CallEventRef< CXXDestructorCall > getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger, const MemRegion *Target, bool IsBase, ProgramStateRef State, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
CallEventRef getCall(const Stmt *S, ProgramStateRef State, const LocationContext *LC, CFGBlock::ConstCFGElementRef ElemRef)
Gets a call event for a function call, Objective-C method call, a 'new', or a 'delete' call.
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)
CallEventManager(llvm::BumpPtrAllocator &alloc)
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.
virtual SourceRange getArgSourceRange(unsigned Index) const
Returns the source range for errors associated with this argument.
virtual void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const
Used to specify non-argument regions that will be invalidated as a result of this call.
virtual StringRef getKindAsString() const =0
SVal getSVal(const Expr *E) const
Get the value of arbitrary expressions at this point in the path.
virtual const Expr * getOriginExpr() const
Returns the expression whose value will be the result of this call.
ProgramStateRef getState() const
A state for looking up relevant Environment entries (arguments, return value), dynamic type informati...
static bool isCallStmt(const Stmt *S)
Returns true if this is a statement is a function or method call of some kind.
const ConstructionContext * getConstructionContext() const
Returns the construction context of the call, if it is a C++ constructor call or a call of a function...
param_type_iterator param_type_end() const
const ParamVarRegion * getParameterLocation(unsigned Index, unsigned BlockCount) const
Returns memory location for a parameter variable within the callee stack frame.
bool isCalledFromSystemHeader() const
AnalysisDeclContext * getCalleeAnalysisDeclContext() const
Returns AnalysisDeclContext for the callee stack frame.
virtual std::optional< unsigned > getAdjustedParameterIndex(unsigned ASTArgumentIndex) const
Some calls have parameter numbering mismatched from argument numbering.
QualType getResultType() const
Returns the result type, adjusted for references.
ProgramStateRef invalidateRegions(unsigned BlockCount, ProgramStateRef State) const
Invalidates the regions (arguments, globals, special regions like 'this') that may have been written ...
friend class CallEventManager
llvm::mapped_iterator< ArrayRef< ParmVarDecl * >::iterator, GetTypeFn > param_type_iterator
const StackFrame * getCalleeStackFrame(unsigned BlockCount) const
Returns the callee stack frame.
bool isInSystemHeader() const
Returns true if the callee is known to be from a system header.
bool isGlobalCFunction(StringRef SpecificName=StringRef()) const
Returns true if the callee is an externally-visible function in the top-level namespace,...
virtual bool argumentsMayEscape() const
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
param_type_iterator param_type_begin() const
Returns an iterator over the types of the call's formal parameters.
ProgramPoint getProgramPoint(bool IsPreVisit=false, const ProgramPointTag *Tag=nullptr) const
Returns an appropriate ProgramPoint for this call.
static QualType getDeclaredResultType(const Decl *D)
Returns the result type of a function or method declaration.
static bool isVariadic(const Decl *D)
Returns true if the given decl is known to be variadic.
virtual SVal getArgSVal(unsigned Index) const
Returns the value of a given argument at the time of the call.
bool hasNonNullArgumentsWithType(bool(*Condition)(QualType)) const
Returns true if the type of any of the non-null arguments satisfies the condition.
std::optional< SVal > getReturnValueUnderConstruction() const
If the call returns a C++ record type then the region of its return value can be retrieved from its c...
virtual const Expr * getArgExpr(unsigned Index) const
Returns the expression associated with a given argument.
virtual unsigned getNumArgs() const =0
Returns the number of arguments (explicit and implicit).
bool hasVoidPointerToNonConstArg() const
Returns true if any of the arguments is void*.
const CallEventRef getCaller() const
bool isArgumentConstructedDirectly(unsigned Index) const
Returns true if on the current path, the argument was constructed by calling a C++ constructor over i...
SmallVectorImpl< FrameBindingTy > BindingsTy
SVal getReturnValue() const
Returns the return value of the call.
virtual const Decl * getDecl() const
Returns the declaration of the function or method that will be called.
const LocationContext * getLocationContext() const
The context in which the call is being evaluated.
const CFGBlock::ConstCFGElementRef & getCFGElementRef() const
bool hasNonZeroCallbackArg() const
Returns true if any of the arguments appear to represent callbacks.
virtual Kind getKind() const =0
Returns the kind of call this is.
SmallVectorImpl< SVal > ValueList
virtual SourceRange getSourceRange() const
Returns a source range for the entire call, suitable for outputting in diagnostics.
static bool isCLibraryFunction(const FunctionDecl *FD, StringRef Name=StringRef())
Returns true if the given function is an externally-visible function in the top-level namespace,...
Stores the currently inferred strictest bound on the runtime type of a region in a given state along ...
bool canBeASubClass() const
Returns false if the type information is precise (the type 'DynTy' is the only type in the lattice),...
QualType getType() const
Returns the currently inferred upper bound on the runtime type.
bool isValid() const
Returns true if the dynamic type info is available.
unsigned getNumVisited(const LocationContext *LC, const CFGBlock *Block) const
SVal computeObjectUnderConstruction(const Expr *E, ProgramStateRef State, unsigned NumVisitedCaller, const LocationContext *LCtx, const ConstructionContext *CC, EvalCallOptions &CallOpts, unsigned Idx=0)
Find location of the object that is being constructed by a given constructor.
const VarRegion * getVarRegion(const VarDecl *VD, const LocationContext *LC)
getVarRegion - Retrieve or create the memory region associated with a specified VarDecl and LocationC...
const ParamVarRegion * getParamVarRegion(const Expr *OriginExpr, unsigned Index, const LocationContext *LC)
getParamVarRegion - Retrieve or create the memory region associated with a specified CallExpr,...
MemRegion - The root abstract class for all memory regions.
LLVM_ATTRIBUTE_RETURNS_NONNULL const MemRegion * getBaseRegion() const
const ObjCMethodDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
void getExtraInvalidatedValues(ValueList &Values, RegionAndSymbolInvalidationTraits *ETraits) const override
Used to specify non-argument regions that will be invalidated as a result of this call.
bool isInstanceMessage() const
ObjCMessageKind getMessageKind() const
Returns how the message was written in the source (property access, subscript, or explicit message se...
const ObjCMessageExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St, const LocationContext *LCtx, CFGBlock::ConstCFGElementRef ElemRef)
ArrayRef< ParmVarDecl * > parameters() const override
Return call's formal parameters.
void getInitialStackFrameContents(const StackFrame *CalleeSF, BindingsTy &Bindings) const override
Populates the given SmallVector with the bindings in the callee's stack frame at the start of this ca...
SourceRange getSourceRange() const override
Returns a source range for the entire call, suitable for outputting in diagnostics.
virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl, Selector Sel) const
Check if the selector may have multiple definitions (may have overrides).
bool argumentsMayEscape() const override
Returns true if any of the arguments are known to escape to long- term storage, even if this method w...
SVal getReceiverSVal() const
Returns the value of the receiver at the time of this call.
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
bool isReceiverSelfOrSuper() const
Checks if the receiver refers to 'self' or 'super'.
Selector getSelector() const
const ObjCPropertyDecl * getAccessedProperty() const
ParamVarRegion - Represents a region for parameters.
SValBuilder & getSValBuilder()
StoreManager & getStoreManager()
Information about invalidation for a particular region/symbol.
@ TK_PreserveContents
Tells that a region's contents is not changed.
@ TK_DoNotInvalidateSuperRegion
@ TK_SuppressEscape
Suppress pointer-escaping of a region.
void setTrait(SymbolRef Sym, InvalidationKinds IK)
Defines the runtime definition of the called function.
BasicValueFactory & getBasicValueFactory()
NonLoc makeCompoundVal(QualType type, llvm::ImmutableList< SVal > vals)
MemRegionManager & getRegionManager()
ProgramStateManager & getStateManager()
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 StackFrame *SF)
Return a memory region for the 'this' object reference.
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
bool isUnknownOrUndef() const
const FunctionDecl * getAsFunctionDecl() const
getAsFunctionDecl - If this SVal is a MemRegionVal and wraps a CodeTextRegion wrapping a FunctionDecl...
QualType getType(const ASTContext &) const
Try to get a reasonable type for the given value.
const MemRegion * getAsRegion() const
RuntimeDefinition getRuntimeDefinition() const override
Returns the definition of the function or method that will be called.
const CallExpr * getOriginExpr() const override
Returns the expression whose value will be the result of this call.
const FunctionDecl * getDecl() const override
Returns the declaration of the function or method that will be called.
std::optional< SVal > evalBaseToDerived(SVal Base, QualType DerivedPtrType)
Attempts to do a down cast.
TypedValueRegion - An abstract class representing regions having a typed value.
static const FunctionDecl * getCallee(const CXXConstructExpr &D)
bool isWithinStdNamespace(const Decl *D)
Returns true if declaration D is in std namespace or any nested namespace or class scope.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
const SymExpr * SymbolRef
DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State, const MemRegion *MR)
Get dynamic type information for the region MR.
ObjCMessageKind
Represents the ways an Objective-C message send can occur.
DynamicTypeInfo getClassObjectDynamicTypeInfo(ProgramStateRef State, SymbolRef Sym)
Get dynamic type information stored in a class object represented by Sym.
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)
@ Parameter
The parameter type of a method or function.
@ Result
The result type of a method or function.
U cast(CodeGen::Address addr)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Diagnostic wrappers for TextAPI types for error reporting.
const ObjCInterfaceDecl * Interface
Hints for figuring out if a call should be inlined during evalCall().
DenseMapInfo< Selector > SelectorInfo
static unsigned getHashValue(const PrivateMethodKey &Key)
static PrivateMethodKey getEmptyKey()
DenseMapInfo< const ObjCInterfaceDecl * > InterfaceInfo
static bool isEqual(const PrivateMethodKey &LHS, const PrivateMethodKey &RHS)
static PrivateMethodKey getTombstoneKey()