[cfe-commits] r59232 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp
Ted Kremenek
kremenek at apple.com
Thu Nov 13 07:45:36 PST 2008
Hi Zhongxing,
This is a little heavy handed, but I'm actually going to revert this
patch along with:
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20081110/009157.html
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.
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.
Consider:
char* p = alloca(BLOCK);
new (p) Object1();
...
new (p) Object2();
Untyped memory can be recycled. While this won't occur that often, I
think with the right design we can handle such things naturally.
Ted
On Nov 12, 2008, at 11:58 PM, Zhongxing Xu wrote:
> Author: zhongxingxu
> Date: Thu Nov 13 01:58:20 2008
> New Revision: 59232
>
> URL: http://llvm.org/viewvc/llvm-project?rev=59232&view=rev
> Log:
> Lift the pointer to alloca'ed region to the pointer to its first
> element.
> This is required by some operations, e.g., *p = 1; p[0] = 1;.
> Also set the AllocaRegion's type during the cast.
>
> Modified:
> cfe/trunk/lib/Analysis/GRExprEngine.cpp
>
> Modified: cfe/trunk/lib/Analysis/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/GRExprEngine.cpp?rev=59232&r1=59231&r2=59232&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Analysis/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Analysis/GRExprEngine.cpp Thu Nov 13 01:58:20 2008
> @@ -1277,7 +1277,7 @@
> // FIXME: Refactor into StoreManager itself?
> MemRegionManager& RM =
> getStateManager().getRegionManager();
> const MemRegion* R =
> - RM.getAllocaRegion(CE, Builder-
> >getCurrentBlockCount());
> + RM.getAllocaRegion(CE, Builder-
> >getCurrentBlockCount());
> MakeNode(Dst, CE, *DI, BindExpr(St, CE,
> loc::MemRegionVal(R)));
> continue;
> }
> @@ -1681,6 +1681,26 @@
> continue;
> }
>
> + // Cast alloca'ed pointer to typed pointer.
> + if (isa<loc::MemRegionVal>(V)) {
> + if (const AllocaRegion* AR =
> +
> dyn_cast<AllocaRegion>(cast<loc::MemRegionVal>(V).getRegion())) {
> +
> + // Set the AllocaRegion's type.
> + const_cast<AllocaRegion*>(AR)->setType(T);
> +
> + // Set the CastExpr's value to a pointer to the first
> element.
> + MemRegionManager& RM = getStateManager().getRegionManager();
> +
> + llvm::APSInt Zero(llvm::APInt::getNullValue(32), false);
> + SVal
> ZeroIdx(nonloc::ConcreteInt(getBasicVals().getValue(Zero)));
> + const ElementRegion* ER = RM.getElementRegion(ZeroIdx, AR);
> +
> + MakeNode(Dst, CastE, N, BindExpr(St, CastE,
> loc::MemRegionVal(ER)));
> + continue;
> + }
> + }
> +
> // All other cases.
> MakeNode(Dst, CastE, N, BindExpr(St, CastE, EvalCast(V, CastE-
> >getType())));
> }
>
>
> _______________________________________________
> 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