[cfe-commits] r63844 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h lib/Analysis/BasicConstraintManager.cpp lib/Analysis/BasicStore.cpp lib/Analysis/MemRegion.cpp lib/Analysis/RegionStore.cpp

Ted Kremenek kremenek at apple.com
Thu Feb 5 12:49:33 PST 2009


Looks great!  Thanks Zhongxing.

On Feb 4, 2009, at 10:57 PM, Zhongxing Xu wrote:

> Author: zhongxingxu
> Date: Thu Feb  5 00:57:29 2009
> New Revision: 63844
>
> URL: http://llvm.org/viewvc/llvm-project?rev=63844&view=rev
> Log:
> Make SymbolicRegion subclass TypedRegion, for symbols usually have  
> types, so
> do the symblic regions associated with them and we need them to be  
> typed.
>
> Current SymbolicRegion::getRValueType() method is very restricting.  
> It may be
> modified when we are more clear about what could be the types of  
> symblic
> regions.
>
> BasicConstraintManager::Assume() is changed due to that now  
> SymblicRegion is a
> subclass of SubRegion.
>
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
>    cfe/trunk/lib/Analysis/BasicConstraintManager.cpp
>    cfe/trunk/lib/Analysis/BasicStore.cpp
>    cfe/trunk/lib/Analysis/MemRegion.cpp
>    cfe/trunk/lib/Analysis/RegionStore.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=63844&r1=63843&r2=63844&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h  
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Thu  
> Feb  5 00:57:29 2009
> @@ -38,10 +38,11 @@
> /// MemRegion - The root abstract class for all memory regions.
> class MemRegion : public llvm::FoldingSetNode {
> public:
> -  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
> +  enum Kind { MemSpaceRegionKind,
>               AllocaRegionKind,
>               // Typed regions.
>               BEG_TYPED_REGIONS,
> +               SymbolicRegionKind,
>                CompoundLiteralRegionKind,
>                StringRegionKind, ElementRegionKind,
>                AnonTypedRegionKind,
> @@ -103,7 +104,7 @@
>   bool isSubRegionOf(const MemRegion* R) const;
>
>   static bool classof(const MemRegion* R) {
> -    return R->getKind() > SymbolicRegionKind;
> +    return R->getKind() > MemSpaceRegionKind;
>   }
> };
>
> @@ -135,32 +136,6 @@
>   }
> };
>
> -/// SymbolicRegion - A special, "non-concrete" region. Unlike other  
> region
> -///  clases, SymbolicRegion represents a region that serves as an  
> alias for
> -///  either a real region, a NULL pointer, etc.  It essentially is  
> used to
> -///  map the concept of symbolic values into the domain of  
> regions.  Symbolic
> -///  regions do not need to be typed.
> -class SymbolicRegion : public MemRegion {
> -protected:
> -  const SymbolRef sym;
> -
> -public:
> -  SymbolicRegion(const SymbolRef s) :  
> MemRegion(SymbolicRegionKind), sym(s) {}
> -
> -  SymbolRef getSymbol() const {
> -    return sym;
> -  }
> -
> -  void Profile(llvm::FoldingSetNodeID& ID) const;
> -  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef  
> sym);
> -
> -  void print(llvm::raw_ostream& os) const;
> -
> -  static bool classof(const MemRegion* R) {
> -    return R->getKind() == SymbolicRegionKind;
> -  }
> -};
> -
> /// TypedRegion - An abstract class representing regions that are  
> typed.
> class TypedRegion : public SubRegion {
> protected:
> @@ -188,6 +163,37 @@
>   }
> };
>
> +/// SymbolicRegion - A special, "non-concrete" region. Unlike other  
> region
> +///  clases, SymbolicRegion represents a region that serves as an  
> alias for
> +///  either a real region, a NULL pointer, etc.  It essentially is  
> used to
> +///  map the concept of symbolic values into the domain of  
> regions.  Symbolic
> +///  regions do not need to be typed.
> +class SymbolicRegion : public TypedRegion {
> +protected:
> +  const SymbolRef sym;
> +  const SymbolManager& SymMgr;
> +
> +public:
> +  SymbolicRegion(const SymbolRef s, const SymbolManager& mgr,  
> MemRegion* sreg)
> +    : TypedRegion(sreg, SymbolicRegionKind), sym(s), SymMgr(mgr) {}
> +
> +  SymbolRef getSymbol() const {
> +    return sym;
> +  }
> +
> +  QualType getRValueType(ASTContext& C) const;
> +
> +  void Profile(llvm::FoldingSetNodeID& ID) const;
> +
> +  static void ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef  
> sym);
> +
> +  void print(llvm::raw_ostream& os) const;
> +
> +  static bool classof(const MemRegion* R) {
> +    return R->getKind() == SymbolicRegionKind;
> +  }
> +};
> +
> /// StringRegion - Region associated with a StringLiteral.
> class StringRegion : public TypedRegion {
>   friend class MemRegionManager;
> @@ -492,7 +498,7 @@
>   getCompoundLiteralRegion(const CompoundLiteralExpr* CL);
>
>   /// getSymbolicRegion - Retrieve or create a "symbolic" memory  
> region.
> -  SymbolicRegion* getSymbolicRegion(const SymbolRef sym);
> +  SymbolicRegion* getSymbolicRegion(const SymbolRef sym, const  
> SymbolManager&);
>
>   StringRegion* getStringRegion(const StringLiteral* Str);
>
>
> Modified: cfe/trunk/lib/Analysis/BasicConstraintManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicConstraintManager.cpp?rev=63844&r1=63843&r2=63844&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/BasicConstraintManager.cpp (original)
> +++ cfe/trunk/lib/Analysis/BasicConstraintManager.cpp Thu Feb  5  
> 00:57:29 2009
> @@ -165,17 +165,14 @@
>     // FIXME: Should this go into the storemanager?
>
>     const MemRegion* R = cast<loc::MemRegionVal>(Cond).getRegion();
> -
> -    while (R) {
> -      if (const SubRegion* SubR = dyn_cast<SubRegion>(R)) {
> -        R = SubR->getSuperRegion();
> -        continue;
> -      }
> -      else if (const SymbolicRegion* SymR =  
> dyn_cast<SymbolicRegion>(R))
> +    const SubRegion* SubR = dyn_cast<SubRegion>(R);
> +
> +    while (SubR) {
> +      // FIXME: now we only find the first symbolic region.
> +      if (const SymbolicRegion* SymR =  
> dyn_cast<SymbolicRegion>(SubR))
>         return AssumeAux(St, loc::SymbolVal(SymR->getSymbol()),  
> Assumption,
>                                             isFeasible);
> -
> -      break;
> +      SubR = dyn_cast<SubRegion>(SubR->getSuperRegion());
>     }
>
>     // FALL-THROUGH.
>
> Modified: cfe/trunk/lib/Analysis/BasicStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicStore.cpp?rev=63844&r1=63843&r2=63844&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/BasicStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/BasicStore.cpp Thu Feb  5 00:57:29 2009
> @@ -173,7 +173,8 @@
>
>   switch(BaseL.getSubKind()) {
>     case loc::SymbolValKind:
> -      BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)- 
> >getSymbol());
> +      BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)- 
> >getSymbol(),
> +                                      StateMgr.getSymbolManager());
>       break;
>
>     case loc::GotoLabelKind:
> @@ -218,7 +219,8 @@
>       // Create a region to represent this symbol.
>       // FIXME: In the future we may just use symbolic regions  
> instead of
>       //  SymbolVals to reason about symbolic memory chunks.
> -      const MemRegion* SymR = MRMgr.getSymbolicRegion(Sym);
> +      const MemRegion* SymR = MRMgr.getSymbolicRegion(Sym,
> +                                                   
> StateMgr.getSymbolManager());
>       // Layered a typed region on top of this.
>       QualType T = StateMgr.getSymbolManager().getType(Sym);
>       BaseR = MRMgr.getAnonTypedRegion(T, SymR);
>
> Modified: cfe/trunk/lib/Analysis/MemRegion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=63844&r1=63843&r2=63844&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/MemRegion.cpp (original)
> +++ cfe/trunk/lib/Analysis/MemRegion.cpp Thu Feb  5 00:57:29 2009
> @@ -107,6 +107,28 @@
>   ElementRegion::ProfileRegion(ID, Index, superRegion);
> }
>
> +// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +// getLValueType() and getRValueType()
> +// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +
> +QualType SymbolicRegion::getRValueType(ASTContext& C) const {
> +  const SymbolData& data = SymMgr.getSymbolData(sym);
> +
> +  // FIXME: We could use the SymbolManager::getType() directly. But  
> that
> +  // would hide the assumptions we made here. What is the type of a  
> symbolic
> +  // region is unclear for other cases.
> +
> +  // For now we assume the symbol is a typed region rvalue.
> +  const TypedRegion* R
> +    = cast<TypedRegion>(cast<SymbolRegionRValue>(data).getRegion());
> +
> +  // Assume the region rvalue has a pointer type, only then we  
> could have a
> +  // symbolic region associated with it.
> +  PointerType* PTy = cast<PointerType>(R- 
> >getRValueType(C).getTypePtr());
> +
> +  return PTy->getPointeeType();
> +}
> +
> QualType ElementRegion::getRValueType(ASTContext& C) const {
>   // Strip off typedefs from the ArrayRegion's RvalueType.
>   QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType();
> @@ -119,10 +141,6 @@
>   return T;
> }
>
> -// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> -// getLValueType() and getRValueType()
> -// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> -
> QualType StringRegion::getRValueType(ASTContext& C) const {
>   return Str->getType();
> }
> @@ -308,7 +326,8 @@
> }
>
> /// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
> -SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef  
> sym) {
> +SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef  
> sym,
> +                                                    const  
> SymbolManager& mgr) {
>
>   llvm::FoldingSetNodeID ID;
>   SymbolicRegion::ProfileRegion(ID, sym);
> @@ -319,7 +338,8 @@
>
>   if (!R) {
>     R = (SymbolicRegion*) A.Allocate<SymbolicRegion>();
> -    new (R) SymbolicRegion(sym);
> +    // SymbolicRegion's storage class is usually unknown.
> +    new (R) SymbolicRegion(sym, mgr, getUnknownRegion());
>     Regions.InsertNode(R, InsertPos);
>   }
>
>
> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=63844&r1=63843&r2=63844&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Thu Feb  5 00:57:29 2009
> @@ -312,7 +312,8 @@
>     break;
>
>   case loc::SymbolValKind:
> -    BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)- 
> >getSymbol());
> +    BaseR = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(&BaseL)- 
> >getSymbol(),
> +                                    StateMgr.getSymbolManager());
>     break;
>
>   case loc::GotoLabelKind:
> @@ -701,7 +702,8 @@
>   if (isa<loc::MemRegionVal>(L))
>     R = cast<loc::MemRegionVal>(L).getRegion();
>   else if (isa<loc::SymbolVal>(L))
> -    R = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(L).getSymbol());
> +    R = MRMgr.getSymbolicRegion(cast<loc::SymbolVal>(L).getSymbol(),
> +                                StateMgr.getSymbolManager());
>
>   if (R) {
>     RegionBindingsTy B = GetRegionBindings(store);
>
>
> _______________________________________________
> 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