[cfe-commits] r59229 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h lib/Analysis/MemRegion.cpp

Ted Kremenek kremenek at apple.com
Wed Nov 12 23:37:34 PST 2008


I'm not certain if this will work.  alloca() often (always?) returns a  
void*, so it basically represents an untyped glob of memory. It's  
pointee type is "void", but that's not actually a type for an  
element.  That's why it doesn't subtype TypedRegion.

One question is how to represent:

   char* p = (char*) alloca(8);

alloca() itself returns a new region.  To me the cast such layer a new  
region on top of that region with the "char*" type information.  That  
was the point of the AnonTypedRegion (to add typing to a previously  
untyped glob of memory).

On Nov 12, 2008, at 11:31 PM, Zhongxing Xu wrote:

> Author: zhongxingxu
> Date: Thu Nov 13 01:30:58 2008
> New Revision: 59229
>
> URL: http://llvm.org/viewvc/llvm-project?rev=59229&view=rev
> Log:
> Change AllocaRegion to subclass TypedRegion. We need to know  
> ElementRegion's
> type when assigning to it.
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
>    cfe/trunk/lib/Analysis/MemRegion.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=59229&r1=59228&r2=59229&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h  
> (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Thu  
> Nov 13 01:30:58 2008
> @@ -37,9 +37,9 @@
> class MemRegion : public llvm::FoldingSetNode {
> public:
>   enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
> -              AllocaRegionKind,
>               // Typed regions.
>               BEG_TYPED_REGIONS,
> +               AllocaRegionKind,
>                CompoundLiteralRegionKind,
>                StringRegionKind, ElementRegionKind,
>                // Decl Regions.
> @@ -102,34 +102,6 @@
>   }
> };
>
> -/// AllocaRegion - A region that represents an untyped blob of  
> bytes created
> -///  by a call to 'alloca'.
> -class AllocaRegion : public SubRegion {
> -  friend class MemRegionManager;
> -protected:
> -  unsigned Cnt; // Block counter.  Used to distinguish different  
> pieces of
> -                // memory allocated by alloca at the same call site.
> -  const Expr* Ex;
> -
> -  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion*  
> superRegion)
> -    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
> -
> -public:
> -
> -  const Expr* getExpr() const { return Ex; }
> -
> -  void Profile(llvm::FoldingSetNodeID& ID) const;
> -
> -  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr*  
> Ex,
> -                            unsigned Cnt);
> -
> -  void print(llvm::raw_ostream& os) const;
> -
> -  static bool classof(const MemRegion* R) {
> -    return R->getKind() == AllocaRegionKind;
> -  }
> -};
> -
> /// 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
> @@ -170,6 +142,42 @@
>   }
> };
>
> +/// AllocaRegion - A region that represents an untyped blob of  
> bytes created
> +///  by a call to 'alloca'.
> +class AllocaRegion : public TypedRegion {
> +  friend class MemRegionManager;
> +protected:
> +  unsigned Cnt; // Block counter.  Used to distinguish different  
> pieces of
> +                // memory allocated by alloca at the same call site.
> +  const Expr* Ex;
> +
> +  QualType T;
> +
> +  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion*  
> superRegion)
> +    : TypedRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
> +
> +public:
> +
> +  const Expr* getExpr() const { return Ex; }
> +
> +  void setType(QualType t) { T = t; }
> +
> +  QualType getType(ASTContext& C) const {
> +    return C.getCanonicalType(T);
> +  }
> +
> +  void Profile(llvm::FoldingSetNodeID& ID) const;
> +
> +  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr*  
> Ex,
> +                            unsigned Cnt);
> +
> +  void print(llvm::raw_ostream& os) const;
> +
> +  static bool classof(const MemRegion* R) {
> +    return R->getKind() == AllocaRegionKind;
> +  }
> +};
> +
> /// StringRegion - Region associated with a StringLiteral.
> class StringRegion : public TypedRegion {
>   friend class MemRegionManager;
>
> Modified: cfe/trunk/lib/Analysis/MemRegion.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=59229&r1=59228&r2=59229&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- cfe/trunk/lib/Analysis/MemRegion.cpp (original)
> +++ cfe/trunk/lib/Analysis/MemRegion.cpp Thu Nov 13 01:30:58 2008
> @@ -105,8 +105,18 @@
>
> QualType ElementRegion::getType(ASTContext& C) const {
>   QualType T = cast<TypedRegion>(superRegion)->getType(C);
> -  ArrayType* AT = cast<ArrayType>(T.getTypePtr());
> -  return AT->getElementType();
> +
> +  if (isa<ArrayType>(T.getTypePtr())) {
> +    ArrayType* AT = cast<ArrayType>(T.getTypePtr());
> +    return AT->getElementType();
> +  }
> +  else if (isa<AllocaRegion>(superRegion)) {
> +    PointerType* PtrT = cast<PointerType>(T.getTypePtr());
> +    QualType PTy = PtrT->getPointeeType();
> +    return C.getCanonicalType(PTy);
> +  }
> +  else
> +    assert(0 && "SuperRegion type unsupported.");
> }
>
> // 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
>
>
> _______________________________________________
> 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