[cfe-commits] r60995 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h include/clang/Analysis/PathSensitive/Store.h lib/Analysis/BasicObjCFoundationChecks.cpp lib/Analysis/BasicStore.cpp lib/Analysis/CFRefCount.cpp lib/Analysis/GR

Zhongxing Xu xuzhongxing at gmail.com
Mon Dec 15 22:23:54 PST 2008


On Tue, Dec 16, 2008 at 1:55 PM, Ted Kremenek <kremenek at apple.com> wrote:

>
> On Dec 15, 2008, at 5:39 PM, Zhongxing Xu wrote:
>
>  I agree in your example we should not convert p to point to the zero-index
>> element. But in my example:
>>
>> char * p = alloca(10);
>> p[1] = 3;
>>
>> p *is* a pointer to 'char' when we do CastRegion.
>>
>
> Yes, but a "char*" can be either a pointer to an array or a single
> character.  In this case (with alloca) we know p is a pointer to an array of
> bytes, so it simplifies things, but if (for example) the region is symbolic
> we don't know if the void* is a pointer to a single character or to an array
> of bytes.


The semantics of a pointer has two folds: first it indicates an address,
second it has a type, which basically delimits its range. The concept of
region captures this semantics perfectly: a region indicates a location and
has an extent.

Now that we have an explicit type 'char' for the pointer, we'd better stick
to the semantics of the pointer: give a right extent to the pointer. If we
leave the pointer an AnonTypedRegion, we actually contradicts the 1 byte
range specified by the pointer type. On the other hand, an ElementRegion
matches the type of the pointer perfectly.

>
>
>  And later in ArraySubscriptExpr we don't have a chance to do the
>> conversion.
>>
>
>
> Not true.  Just because there isn't a pointer-to-array cast in the AST
> doesn't mean we can't do the conversion.  We can do it when handling the
> ArraySubscriptExpr:
>
> /// VisitArraySubscriptExpr - Transfer function for array accesses
> void GRExprEngine::VisitArraySubscriptExpr(ArraySubscriptExpr* A, NodeTy*
> Pred,
>                                           NodeSet& Dst, bool asLValue) {
>
>  Expr* Base = A->getBase()->IgnoreParens();
>  Expr* Idx  = A->getIdx()->IgnoreParens();
>  NodeSet Tmp;
>  Visit(Base, Pred, Tmp);   // Get Base's rvalue, which should be an LocVal.
>
>  for (NodeSet::iterator I1=Tmp.begin(), E1=Tmp.end(); I1!=E1; ++I1) {
>    NodeSet Tmp2;
>    Visit(Idx, *I1, Tmp2);     // Evaluate the index.
>
>    for (NodeSet::iterator I2=Tmp2.begin(), E2=Tmp2.end(); I2!=E2; ++I2) {
>      const GRState* St = GetState(*I2);
>      // **** Possible insert a call to StoreManager::PointerToArray here
> for the
>      // ****  results of GetSVal(St, Base).
>      SVal V = StateMgr.GetLValue(St, GetSVal(St, Base), GetSVal(St, Idx));
>     ...
>
> I'm not saying this is the best solution; it just seems that using an
> ElementRegion early seems speculative and premature, especially if it really
> isn't an array.  Why not just do it lazily when a region is *used* as an
> array?


This is possible. But I don't think it's necessary for this case. We can
save the trouble by putting a little more effort in CastRegion() where the
semantics also stipulates.


>
>
> Of course, this leads to the question of how we handle general pointer
> arithmetic (one of those things we're basically punting on right now).
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081216/6f97e15e/attachment.html>


More information about the cfe-commits mailing list