<br><br><div class="gmail_quote">On Thu, Nov 13, 2008 at 11:45 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;">
Hi Zhongxing,<br>
<br>
This is a little heavy handed, but I'm actually going to revert this patch along with:<br>
<br>
<a href="http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20081110/009157.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20081110/009157.html</a><br>
<br>
There is a reason why MemRegion* have a const qualifier; they never can be changed in any way.  The const_cast itself is an indicator to me that this is the wrong design.  It violates the functional programming design of how we track state, and modifying the MemRegion object in this way can introduce subtle bugs.<br>

<br>
We'll need to iterate on this one.  We may end up applying your patch back, so please don't take my reverting it personally.</blockquote><div><br>Please revert these two patches. Sorry that I forgot some fundamental points. They were quick fixes to some immediate crashes when I test the analyzer. We should get better designs.<br>
 </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>
<br>
Consider:<br>
<br>
char* p = alloca(BLOCK);<br>
new (p) Object1();<br>
...<br>
new (p) Object2();<br>
<br>
Untyped memory can be recycled.  While this won't  occur that often, I think with the right design we can handle such things naturally.<br><font color="#888888">
<br>
Ted</font><div class="Ih2E3d"><br>
<br>
On Nov 12, 2008, at 11:58 PM, Zhongxing Xu wrote:<br>
<br>
</div><div><div></div><div class="Wj3C7c"><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:58:20 2008<br>
New Revision: 59232<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=59232&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=59232&view=rev</a><br>
Log:<br>
Lift the pointer to alloca'ed region to the pointer to its first element.<br>
This is required by some operations, e.g., *p = 1; p[0] = 1;.<br>
Also set the AllocaRegion's type during the cast.<br>
<br>
Modified:<br>
   cfe/trunk/lib/Analysis/GRExprEngine.cpp<br>
<br>
Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=59232&r1=59231&r2=59232&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=59232&r1=59231&r2=59232&view=diff</a><br>

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Nov 13 01:58:20 2008<br>
@@ -1277,7 +1277,7 @@<br>
            // FIXME: Refactor into StoreManager itself?<br>
            MemRegionManager& RM = getStateManager().getRegionManager();<br>
            const MemRegion* R =<br>
-              RM.getAllocaRegion(CE, Builder->getCurrentBlockCount());<br>
+              RM.getAllocaRegion(CE, Builder->getCurrentBlockCount());<br>
            MakeNode(Dst, CE, *DI, BindExpr(St, CE, loc::MemRegionVal(R)));<br>
            continue;<br>
          }<br>
@@ -1681,6 +1681,26 @@<br>
      continue;<br>
    }<br>
<br>
+    // Cast alloca'ed pointer to typed pointer.<br>
+    if (isa<loc::MemRegionVal>(V)) {<br>
+      if (const AllocaRegion* AR =<br>
+          dyn_cast<AllocaRegion>(cast<loc::MemRegionVal>(V).getRegion())) {<br>
+<br>
+        // Set the AllocaRegion's type.<br>
+        const_cast<AllocaRegion*>(AR)->setType(T);<br>
+<br>
+        // Set the CastExpr's value to a pointer to the first element.<br>
+        MemRegionManager& RM = getStateManager().getRegionManager();<br>
+<br>
+        llvm::APSInt Zero(llvm::APInt::getNullValue(32), false);<br>
+        SVal ZeroIdx(nonloc::ConcreteInt(getBasicVals().getValue(Zero)));<br>
+        const ElementRegion* ER = RM.getElementRegion(ZeroIdx, AR);<br>
+<br>
+        MakeNode(Dst, CastE, N, BindExpr(St, CastE, loc::MemRegionVal(ER)));<br>
+        continue;<br>
+      }<br>
+    }<br>
+<br>
    // All other cases.<br>
    MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE->getType())));<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>