Change CallEvent to use ArrayRef<> interface to get formal parameters of callee.

llvm-svn: 199472
This commit is contained in:
Ted Kremenek 2014-01-17 07:15:31 +00:00
parent 81541c561c
commit 2ff160046b
3 changed files with 27 additions and 63 deletions

View File

@ -342,23 +342,16 @@ public:
// Iterator access to formal parameters and their types.
private:
typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
public:
typedef const ParmVarDecl * const *param_iterator;
/// Returns an iterator over the call's formal parameters.
public:
/// Return call's formal parameters.
///
/// Remember that the number of formal parameters may not match the number
/// of arguments for all calls. However, the first parameter will always
/// correspond with the argument value returned by \c getArgSVal(0).
///
/// If the call has no accessible declaration, \c param_begin() will be equal
/// to \c param_end().
virtual param_iterator param_begin() const = 0;
/// \sa param_begin()
virtual param_iterator param_end() const = 0;
virtual ArrayRef<ParmVarDecl*> parameters() const = 0;
typedef llvm::mapped_iterator<param_iterator, get_type_fun>
typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun>
param_type_iterator;
/// Returns an iterator over the types of the call's formal parameters.
@ -367,12 +360,13 @@ public:
/// definition because it represents a public interface, and probably has
/// more annotations.
param_type_iterator param_type_begin() const {
return llvm::map_iterator(param_begin(),
return llvm::map_iterator(parameters().begin(),
get_type_fun(&ParmVarDecl::getType));
}
/// \sa param_type_begin()
param_type_iterator param_type_end() const {
return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType));
return llvm::map_iterator(parameters().end(),
get_type_fun(&ParmVarDecl::getType));
}
// For debugging purposes only
@ -420,8 +414,7 @@ public:
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
BindingsTy &Bindings) const;
virtual param_iterator param_begin() const;
virtual param_iterator param_end() const;
virtual ArrayRef<ParmVarDecl *> parameters() const;
static bool classof(const CallEvent *CA) {
return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
@ -515,8 +508,7 @@ public:
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
BindingsTy &Bindings) const;
virtual param_iterator param_begin() const;
virtual param_iterator param_end() const;
virtual ArrayRef<ParmVarDecl*> parameters() const;
virtual Kind getKind() const { return CE_Block; }
@ -885,8 +877,7 @@ public:
virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
BindingsTy &Bindings) const;
virtual param_iterator param_begin() const;
virtual param_iterator param_end() const;
virtual ArrayRef<ParmVarDecl*> parameters() const;
virtual Kind getKind() const { return CE_ObjCMessage; }

View File

@ -1613,8 +1613,10 @@ UndefOrNullArgVisitor::VisitNode(const ExplodedNode *N,
CallEventManager &CEMgr = BRC.getStateManager().getCallEventManager();
CallEventRef<> Call = CEMgr.getCaller(CEnter->getCalleeContext(), State);
unsigned Idx = 0;
for (CallEvent::param_iterator I = Call->param_begin(),
E = Call->param_end(); I != E; ++I, ++Idx) {
ArrayRef<ParmVarDecl*> parms = Call->parameters();
for (ArrayRef<ParmVarDecl*>::iterator I = parms.begin(), E = parms.end();
I != E; ++I, ++Idx) {
const MemRegion *ArgReg = Call->getArgSVal(Idx).getAsRegion();
// Are we tracking the argument or its subregion?

View File

@ -282,14 +282,14 @@ static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
CallEvent::BindingsTy &Bindings,
SValBuilder &SVB,
const CallEvent &Call,
CallEvent::param_iterator I,
CallEvent::param_iterator E) {
ArrayRef<ParmVarDecl*> parameters) {
MemRegionManager &MRMgr = SVB.getRegionManager();
// If the function has fewer parameters than the call has arguments, we simply
// do not bind any values to them.
unsigned NumArgs = Call.getNumArgs();
unsigned Idx = 0;
ArrayRef<ParmVarDecl*>::iterator I = parameters.begin(), E = parameters.end();
for (; I != E && Idx < NumArgs; ++I, ++Idx) {
const ParmVarDecl *ParamDecl = *I;
assert(ParamDecl && "Formal parameter has no decl?");
@ -304,21 +304,11 @@ static void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
// FIXME: Variadic arguments are not handled at all right now.
}
CallEvent::param_iterator AnyFunctionCall::param_begin() const {
ArrayRef<ParmVarDecl*> AnyFunctionCall::parameters() const {
const FunctionDecl *D = getDecl();
if (!D)
return 0;
return D->param_begin();
}
CallEvent::param_iterator AnyFunctionCall::param_end() const {
const FunctionDecl *D = getDecl();
if (!D)
return 0;
return D->param_end();
return llvm::ArrayRef<ParmVarDecl*>();
return D->parameters();
}
void AnyFunctionCall::getInitialStackFrameContents(
@ -327,7 +317,7 @@ void AnyFunctionCall::getInitialStackFrameContents(
const FunctionDecl *D = cast<FunctionDecl>(CalleeCtx->getDecl());
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
D->param_begin(), D->param_end());
D->parameters());
}
bool AnyFunctionCall::argumentsMayEscape() const {
@ -548,18 +538,11 @@ const BlockDataRegion *BlockCall::getBlockRegion() const {
return dyn_cast_or_null<BlockDataRegion>(DataReg);
}
CallEvent::param_iterator BlockCall::param_begin() const {
ArrayRef<ParmVarDecl*> BlockCall::parameters() const {
const BlockDecl *D = getDecl();
if (!D)
return 0;
return D->param_begin();
}
CallEvent::param_iterator BlockCall::param_end() const {
const BlockDecl *D = getDecl();
if (!D)
return 0;
return D->param_end();
return D->parameters();
}
void BlockCall::getExtraInvalidatedValues(ValueList &Values) const {
@ -573,7 +556,7 @@ void BlockCall::getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
const BlockDecl *D = cast<BlockDecl>(CalleeCtx->getDecl());
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
D->param_begin(), D->param_end());
D->parameters());
}
@ -602,8 +585,6 @@ void CXXConstructorCall::getInitialStackFrameContents(
}
}
SVal CXXDestructorCall::getCXXThisVal() const {
if (Data)
return loc::MemRegionVal(DtorDataTy::getFromOpaqueValue(Data).getPointer());
@ -619,21 +600,11 @@ RuntimeDefinition CXXDestructorCall::getRuntimeDefinition() const {
return CXXInstanceCall::getRuntimeDefinition();
}
CallEvent::param_iterator ObjCMethodCall::param_begin() const {
ArrayRef<ParmVarDecl*> ObjCMethodCall::parameters() const {
const ObjCMethodDecl *D = getDecl();
if (!D)
return 0;
return D->param_begin();
}
CallEvent::param_iterator ObjCMethodCall::param_end() const {
const ObjCMethodDecl *D = getDecl();
if (!D)
return 0;
return D->param_end();
return ArrayRef<ParmVarDecl*>();
return D->parameters();
}
void
@ -911,7 +882,7 @@ void ObjCMethodCall::getInitialStackFrameContents(
const ObjCMethodDecl *D = cast<ObjCMethodDecl>(CalleeCtx->getDecl());
SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
D->param_begin(), D->param_end());
D->parameters());
SVal SelfVal = getReceiverSVal();
if (!SelfVal.isUnknown()) {