[cfe-commits] r69570 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h include/clang/Analysis/PathSensitive/SVals.h lib/Analysis/BasicObjCFoundationChecks.cpp lib/Analysis/CFRefCount.cpp lib/Analysis/GRExprEngine.cpp lib/Analysis/GRExprEngineInternalChecks.cpp lib/Analysis/SVals.cpp

Ted Kremenek kremenek at apple.com
Tue Apr 21 13:11:13 PDT 2009


Looks great!  Thanks for doing this.

On Apr 19, 2009, at 10:24 PM, Zhongxing Xu wrote:

> Author: zhongxingxu
> Date: Mon Apr 20 00:24:46 2009
> New Revision: 69570
>
> URL: http://llvm.org/viewvc/llvm-project?rev=69570&view=rev
> Log:
> get a CodeTextRegion when visiting FunctionDecl reference.
> get FunctionDecl with more general utility method.
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
>    cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
>    cfe/trunk/lib/Analysis/BasicObjCFoundationChecks.cpp
>    cfe/trunk/lib/Analysis/CFRefCount.cpp
>    cfe/trunk/lib/Analysis/GRExprEngine.cpp
>    cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp
>    cfe/trunk/lib/Analysis/SVals.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=69570&r1=69569&r2=69570&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h  
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Mon  
> Apr 20 00:24:46 2009
> @@ -39,11 +39,11 @@
> class MemRegion : public llvm::FoldingSetNode {
> public:
>   enum Kind { MemSpaceRegionKind,
> -              CodeTextRegionKind,
>               SymbolicRegionKind,
>               AllocaRegionKind,
>               // Typed regions.
>               BEG_TYPED_REGIONS,
> +               CodeTextRegionKind,
>                CompoundLiteralRegionKind,
>                StringRegionKind, ElementRegionKind,
>                TypedViewRegionKind,
> @@ -215,6 +215,13 @@
>   QualType getLValueType(ASTContext &C) const {
>     return LocationType;
>   }
> +
> +  bool isDeclared() const { return codekind == Declared; }
> +
> +  const FunctionDecl* getDecl() const {
> +    assert(codekind == Declared);
> +    return static_cast<const FunctionDecl*>(Data);
> +  }
>
>   virtual bool isBoundable(ASTContext&) const { return false; }
>
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Mon Apr  
> 20 00:24:46 2009
> @@ -89,6 +89,11 @@
>   }
>
>   bool isZeroConstant() const;
> +
> +  /// getAsFunctionDecl - If this SVal is a MemRegionVal and wraps a
> +  /// CodeTextRegion wrapping a FunctionDecl, return that  
> FunctionDecl.
> +  /// Otherwise return 0.
> +  const FunctionDecl* getAsFunctionDecl() const;
>
>   /// getAsLocSymbol - If this SVal is a location (subclasses Loc) and
>   ///  wraps a symbol, return that SymbolRef.  Otherwise return a  
> SymbolData*
>
> Modified: cfe/trunk/lib/Analysis/BasicObjCFoundationChecks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicObjCFoundationChecks.cpp?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/BasicObjCFoundationChecks.cpp (original)
> +++ cfe/trunk/lib/Analysis/BasicObjCFoundationChecks.cpp Mon Apr 20  
> 00:24:46 2009
> @@ -375,9 +375,9 @@
>   CallExpr* CE = cast<CallExpr>(cast<PostStmt>(N->getLocation 
> ()).getStmt());
>   Expr* Callee = CE->getCallee();
>   SVal CallV = GetSVal(N->getState(), Callee);
> -  loc::FuncVal* FuncV = dyn_cast<loc::FuncVal>(&CallV);
> +  const FunctionDecl* FD = CallV.getAsFunctionDecl();
>
> -  if (!FuncV || FuncV->getDecl()->getIdentifier() != II || CE- 
> >getNumArgs()!=3)
> +  if (!FD || FD->getIdentifier() != II || CE->getNumArgs()!=3)
>     return false;
>
>   // Get the value of the "theType" argument.
>
> Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
> +++ cfe/trunk/lib/Analysis/CFRefCount.cpp Mon Apr 20 00:24:46 2009
> @@ -1694,7 +1694,7 @@
>                              Expr* Ex,
>                              Expr* Receiver,
>                              RetainSummary* Summ,
> -                             ExprIterator arg_beg, ExprIterator  
> arg_end,
> +                             ExprIterator arg_beg, ExprIterator  
> arg_end,
>                              ExplodedNode<GRState>* Pred) {
>
>   // Get the state.
> @@ -1930,9 +1930,9 @@
>                           GRStmtNodeBuilder<GRState>& Builder,
>                           CallExpr* CE, SVal L,
>                           ExplodedNode<GRState>* Pred) {
> -
> -  RetainSummary* Summ = !isa<loc::FuncVal>(L) ? 0
> -                      : Summaries.getSummary(cast<loc::FuncVal> 
> (L).getDecl());
> +  const FunctionDecl* FD = L.getAsFunctionDecl();
> +  RetainSummary* Summ = !FD ? 0
> +                        : Summaries.getSummary 
> (const_cast<FunctionDecl*>(FD));
>
>   EvalSummary(Dst, Eng, Builder, CE, 0, Summ,
>               CE->arg_begin(), CE->arg_end(), Pred);
> @@ -2582,9 +2582,9 @@
>
>     if (CallExpr *CE = dyn_cast<CallExpr>(S)) {
>       // Get the name of the callee (if it is available).
> -      SVal X = CurrSt.GetSValAsScalarOrLoc(CE->getCallee());
> -      if (loc::FuncVal* FV = dyn_cast<loc::FuncVal>(&X))
> -        os << "Call to function '" << FV->getDecl()->getNameAsString 
> () <<'\'';
> +      SVal X = CurrSt.GetSValAsScalarOrLoc(CE->getCallee());
> +      if (const FunctionDecl* FD = X.getAsFunctionDecl())
> +        os << "Call to function '" << FD->getNameAsString() <<'\'';
>       else
>         os << "function call";
>     }
> @@ -2675,9 +2675,9 @@
>     if (contains(AEffects, MakeCollectable)) {
>       // Get the name of the function.
>       Stmt* S = cast<PostStmt>(N->getLocation()).getStmt();
> -      loc::FuncVal FV =
> -        cast<loc::FuncVal>(CurrSt.GetSValAsScalarOrLoc 
> (cast<CallExpr>(S)->getCallee()));
> -      const std::string& FName = FV.getDecl()->getNameAsString();
> +      SVal X = CurrSt.GetSValAsScalarOrLoc(cast<CallExpr>(S)- 
> >getCallee());
> +      const FunctionDecl* FD = X.getAsFunctionDecl();
> +      const std::string& FName = FD->getNameAsString();
>
>       if (TF.isGCEnabled()) {
>         // Determine if the object's reference count was pushed to  
> zero.
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Mon Apr 20 00:24:46 2009
> @@ -976,7 +976,7 @@
>
>   } else if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D)) {
>     assert(asLValue);
> -    SVal V = loc::FuncVal(FD);
> +    SVal V = ValMgr.getFunctionPointer(FD);
>     MakeNode(Dst, Ex, Pred, BindExpr(state, Ex, V));
>     return;
>   }
> @@ -1369,11 +1369,10 @@
>                          GRStmtNodeBuilder<GRState>& Builder,
>                          CallExpr* CE, SVal L,
>                          ExplodedNode<GRState>* Pred) {
> -
> -  if (!isa<loc::FuncVal>(L))
> +  const FunctionDecl* FD = L.getAsFunctionDecl();
> +  if (!FD)
>     return false;
> -
> -  const FunctionDecl *FD = cast<loc::FuncVal>(L).getDecl();
> +
>   const char *FName = FD->getNameAsCString();
>
>   // Check for compare and swap.
> @@ -1473,11 +1472,8 @@
>     // Check for the "noreturn" attribute.
>
>     SaveAndRestore<bool> OldSink(Builder->BuildSinks);
> -
> -    if (isa<loc::FuncVal>(L)) {
> -
> -      FunctionDecl* FD = cast<loc::FuncVal>(L).getDecl();
> -
> +    const FunctionDecl* FD = L.getAsFunctionDecl();
> +    if (FD) {
>       if (FD->getAttr<NoReturnAttr>() || FD- 
> >getAttr<AnalyzerNoReturnAttr>())
>         Builder->BuildSinks = true;
>       else {
> @@ -1559,10 +1555,9 @@
>
>     // Evaluate the call.
>
> -    if (isa<loc::FuncVal>(L)) {
> +    if (FD) {
>
> -      if (unsigned id
> -            = cast<loc::FuncVal>(L).getDecl()->getBuiltinID 
> (getContext()))
> +      if (unsigned id = FD->getBuiltinID(getContext()))
>         switch (id) {
>           case Builtin::BI__builtin_expect: {
>             // For __builtin_expect, just return the value of the  
> subexpression.
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngineInternalChecks.cpp Mon Apr 20  
> 00:24:46 2009
> @@ -432,11 +432,11 @@
>     const GRState* state = N->getState();
>
>     SVal X = VMgr.GetSVal(state, CE->getCallee());
> -
> -    if (!isa<loc::FuncVal>(X))
> +
> +    const FunctionDecl* FD = X.getAsFunctionDecl();
> +    if (!FD)
>       return false;
> -
> -    FunctionDecl* FD = dyn_cast<FunctionDecl>(cast<loc::FuncVal> 
> (X).getDecl());
> +
>     const NonNullAttr* Att = FD->getAttr<NonNullAttr>();
>
>     if (!Att)
>
> Modified: cfe/trunk/lib/Analysis/SVals.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=69570&r1=69569&r2=69570&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/SVals.cpp (original)
> +++ cfe/trunk/lib/Analysis/SVals.cpp Mon Apr 20 00:24:46 2009
> @@ -30,9 +30,25 @@
> // Utility methods.
> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
>
> +const FunctionDecl* SVal::getAsFunctionDecl() const {
> +  if (const loc::FuncVal* FV = dyn_cast<loc::FuncVal>(this)) {
> +    return FV->getDecl();
> +  }
> +
> +  if (const loc::MemRegionVal* X = dyn_cast<loc::MemRegionVal> 
> (this)) {
> +    const MemRegion* R = X->getRegion();
> +    if (const CodeTextRegion* CTR = dyn_cast<CodeTextRegion>(R)) {
> +      if (CTR->isDeclared())
> +        return CTR->getDecl();
> +    }
> +  }
> +
> +  return 0;
> +}
> +
> /// getAsLocSymbol - If this SVal is a location (subclasses Loc) and
> -///  wraps a symbol, return that SymbolRef.  Otherwise return a  
> SymbolRef
> -///  where 'isValid()' returns false.
> +///  wraps a symbol, return that SymbolRef.  Otherwise return 0.
> +// FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
> SymbolRef SVal::getAsLocSymbol() const {
>   if (const loc::MemRegionVal *X = dyn_cast<loc::MemRegionVal> 
> (this)) {
>     const MemRegion *R = X->getRegion();
> @@ -55,7 +71,8 @@
> }
>
> /// getAsSymbol - If this Sval wraps a symbol return that SymbolRef.
> -///  Otherwise return a SymbolRef where 'isValid()' returns false.
> +///  Otherwise return 0.
> +// FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
> SymbolRef SVal::getAsSymbol() const {
>   if (const nonloc::SymbolVal *X = dyn_cast<nonloc::SymbolVal>(this))
>     return X->getSymbol();
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list