From: Ted Kremenek Date: Fri, 17 Jan 2014 07:15:31 +0000 (+0000) Subject: Change CallEvent to use ArrayRef<> interface to get formal parameters of callee. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d9f32582b1c19af46dbccefd89b26fc8d9d76c4f;p=clang Change CallEvent to use ArrayRef<> interface to get formal parameters of callee. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@199472 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h index 396a9fe364..7eca843137 100644 --- a/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h +++ b/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/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 6ce57feb08..c389efdbcb 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/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/lib/StaticAnalyzer/Core/CallEvent.cpp b/lib/StaticAnalyzer/Core/CallEvent.cpp index 16bbc86dd4..d72678e2e4 100644 --- a/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/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 { - const ObjCMethodDecl *D = getDecl(); - if (!D) - return 0; - - return D->param_begin(); -} - -CallEvent::param_iterator ObjCMethodCall::param_end() const { +ArrayRef ObjCMethodCall::parameters() 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()) {