I have a second patch to be committed immediately. Please review that one. Then we can discuss the design.<br><br><div class="gmail_quote">On Thu, Nov 13, 2008 at 3:37 PM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">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.<br>

<br>
One question is how to represent:<br>
<br>
  char* p = (char*) alloca(8);<br>
<br>
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).<div>
<div></div><div class="Wj3C7c"><br>
<br>
On Nov 12, 2008, at 11:31 PM, Zhongxing Xu wrote:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Author: zhongxingxu<br>
Date: Thu Nov 13 01:30:58 2008<br>
New Revision: 59229<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=59229&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=59229&view=rev</a><br>
Log:<br>
Change AllocaRegion to subclass TypedRegion. We need to know ElementRegion's<br>
type when assigning to it.<br>
<br>
Modified:<br>
   cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h<br>
   cfe/trunk/lib/Analysis/MemRegion.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=59229&r1=59228&r2=59229&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=59229&r1=59228&r2=59229&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h (original)<br>
+++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Thu Nov 13 01:30:58 2008<br>
@@ -37,9 +37,9 @@<br>
class MemRegion : public llvm::FoldingSetNode {<br>
public:<br>
  enum Kind { MemSpaceRegionKind, SymbolicRegionKind,<br>
-              AllocaRegionKind,<br>
              // Typed regions.<br>
              BEG_TYPED_REGIONS,<br>
+               AllocaRegionKind,<br>
               CompoundLiteralRegionKind,<br>
               StringRegionKind, ElementRegionKind,<br>
               // Decl Regions.<br>
@@ -102,34 +102,6 @@<br>
  }<br>
};<br>
<br>
-/// AllocaRegion - A region that represents an untyped blob of bytes created<br>
-///  by a call to 'alloca'.<br>
-class AllocaRegion : public SubRegion {<br>
-  friend class MemRegionManager;<br>
-protected:<br>
-  unsigned Cnt; // Block counter.  Used to distinguish different pieces of<br>
-                // memory allocated by alloca at the same call site.<br>
-  const Expr* Ex;<br>
-<br>
-  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)<br>
-    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}<br>
-<br>
-public:<br>
-<br>
-  const Expr* getExpr() const { return Ex; }<br>
-<br>
-  void Profile(llvm::FoldingSetNodeID& ID) const;<br>
-<br>
-  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,<br>
-                            unsigned Cnt);<br>
-<br>
-  void print(llvm::raw_ostream& os) const;<br>
-<br>
-  static bool classof(const MemRegion* R) {<br>
-    return R->getKind() == AllocaRegionKind;<br>
-  }<br>
-};<br>
-<br>
/// SymbolicRegion - A special, "non-concrete" region. Unlike other region<br>
///  clases, SymbolicRegion represents a region that serves as an alias for<br>
///  either a real region, a NULL pointer, etc.  It essentially is used to<br>
@@ -170,6 +142,42 @@<br>
  }<br>
};<br>
<br>
+/// AllocaRegion - A region that represents an untyped blob of bytes created<br>
+///  by a call to 'alloca'.<br>
+class AllocaRegion : public TypedRegion {<br>
+  friend class MemRegionManager;<br>
+protected:<br>
+  unsigned Cnt; // Block counter.  Used to distinguish different pieces of<br>
+                // memory allocated by alloca at the same call site.<br>
+  const Expr* Ex;<br>
+<br>
+  QualType T;<br>
+<br>
+  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)<br>
+    : TypedRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}<br>
+<br>
+public:<br>
+<br>
+  const Expr* getExpr() const { return Ex; }<br>
+<br>
+  void setType(QualType t) { T = t; }<br>
+<br>
+  QualType getType(ASTContext& C) const {<br>
+    return C.getCanonicalType(T);<br>
+  }<br>
+<br>
+  void Profile(llvm::FoldingSetNodeID& ID) const;<br>
+<br>
+  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,<br>
+                            unsigned Cnt);<br>
+<br>
+  void print(llvm::raw_ostream& os) const;<br>
+<br>
+  static bool classof(const MemRegion* R) {<br>
+    return R->getKind() == AllocaRegionKind;<br>
+  }<br>
+};<br>
+<br>
/// StringRegion - Region associated with a StringLiteral.<br>
class StringRegion : public TypedRegion {<br>
  friend class MemRegionManager;<br>
<br>
Modified: cfe/trunk/lib/Analysis/MemRegion.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=59229&r1=59228&r2=59229&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=59229&r1=59228&r2=59229&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/MemRegion.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/MemRegion.cpp Thu Nov 13 01:30:58 2008<br>
@@ -105,8 +105,18 @@<br>
<br>
QualType ElementRegion::getType(ASTContext& C) const {<br>
  QualType T = cast<TypedRegion>(superRegion)->getType(C);<br>
-  ArrayType* AT = cast<ArrayType>(T.getTypePtr());<br>
-  return AT->getElementType();<br>
+<br>
+  if (isa<ArrayType>(T.getTypePtr())) {<br>
+    ArrayType* AT = cast<ArrayType>(T.getTypePtr());<br>
+    return AT->getElementType();<br>
+  }<br>
+  else if (isa<AllocaRegion>(superRegion)) {<br>
+    PointerType* PtrT = cast<PointerType>(T.getTypePtr());<br>
+    QualType PTy = PtrT->getPointeeType();<br>
+    return C.getCanonicalType(PTy);<br>
+  }<br>
+  else<br>
+    assert(0 && "SuperRegion type unsupported.");<br>
}<br>
<br>
//===----------------------------------------------------------------------===//<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote>
<br>
</div></div></blockquote></div><br>