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>