diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h index 396a9fe36445..7eca84313769 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h @@ -342,23 +342,16 @@ public: // Iterator access to formal parameters and their types. private: typedef std::const_mem_fun_t 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 parameters() const = 0; - typedef llvm::mapped_iterator + typedef llvm::mapped_iterator::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 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 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 parameters() const; virtual Kind getKind() const { return CE_ObjCMessage; } diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 6ce57feb0890..c389efdbcbed 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -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 parms = Call->parameters(); + + for (ArrayRef::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? diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index 16bbc86dd48f..d72678e2e42f 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -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 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::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 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(); + return D->parameters(); } void AnyFunctionCall::getInitialStackFrameContents( @@ -327,7 +317,7 @@ void AnyFunctionCall::getInitialStackFrameContents( const FunctionDecl *D = cast(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(DataReg); } -CallEvent::param_iterator BlockCall::param_begin() const { +ArrayRef 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(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 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(); + return D->parameters(); } void @@ -911,7 +882,7 @@ void ObjCMethodCall::getInitialStackFrameContents( const ObjCMethodDecl *D = cast(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()) {