[cfe-commits] r59232 - /cfe/trunk/lib/Analysis/GRExprEngine.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Thu Nov 13 15:22:07 PST 2008
On Thu, Nov 13, 2008 at 11:45 PM, Ted Kremenek <kremenek at apple.com> wrote:
> 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.
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.
>
>
> 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081114/06bdd70b/attachment.html>
More information about the cfe-commits
mailing list