On Dec 16, 2009, at 5:47 PM, Zhongxing Xu wrote:

> 2009/12/17 Ted Kremenek <[email protected]>:
>> Hi Zhongxing,
>> 
>> How do we plan on using CXXObjectRegion?
>> 
>> For stack allocated objects, we will use VarRegions.  For heap allocated 
>> (e.g., 'new'), we will use SymbolicRegions.  For fields that are C++ objects 
>> we will use FieldRegions.
>> 
> 
> My feeling is that c++ objects may have some properties that justify
> it to be a separate region, like the vtable pointer. But apparently we
> haven't got there.

If we wanted to represent the vtable pointer we have a variety of options, like 
having something similar to FieldRegion, e.g., VTablePtrRegion, that allows us 
to attach the vtable pointer as a "property" of another region.  That way a 
VarRegion could represent a stack allocated object, a SymbolicRegion an 
objected created using 'new', etc.

> 
>> It seems that the only place where we would use CXXObjectRegions are for 
>> modeling the object associated with analyzing a specific method, but I'm not 
>> sure  that is necessary or the right approach.  ObjCObjectRegion is 
>> currently only used by BasicStoreManager, and that should probably be fixed 
>> so it can be removed.  RegionStoreManager handles the Objective-C 'self' 
>> variable by using a VarRegion for the 'self' ImplicitParamDecl, and then 
>> represents the actual Objective-C object with a SymbolicRegion.  There is no 
>> ImplicitParamDecl for 'this', but conceptually that's what we want: a way to 
>> go from CXXThisExpr to the region that represents the current object.  That 
>> way when we inline method calls we can simply map from 
>> ("this",LocationContext) -> MemRegion*.
>> 
> 
> I was looking for an identity to represent the 'this' expression, but
> haven't found one, so created a new region with the type as the
> identity.

For a given CXXThisExpr, we want to be able to map to a MemRegion representing 
the current object.  I don't think that requires a CXXObjectRegion; just a way 
to perform that query.  In other words, the region is the value we obtain from 
the lookup, not the key for the lookup.

My concern about introducing a new object region is that it doesn't add more 
power to our memory model and we run into the issue of how to model properties 
of objects differently for stack allocated objects and heap allocated objects.  
If we perform inter-procedural analysis via inlining, for example, the 'this' 
pointer could refer to a VarRegion that dwells in a parent StackFrameContext.  
Alternatively, if we analyzing a C++ method in isolation the 'this' pointer 
could be associated with a SymbolicRegion.

One idea I just had is that CXXObjectRegion could serve a function similar to 
the suggested VTablePtrRegion.  That is, instead of CXXObjectRegion 
representing the actual memory blob, it represents properties layered on that 
blob.  For example, we have a VarRegion or SymbolicRegion to represent the 
actual object, and then have CXXObjectRegion be a subregion that associates 
additional properties with that region (e.g., the vtable pointer).  I'm not 
certain if that is the right approach if we want to allow rich modeling of 
downcasts, as the specific type of an object referred to by a pointer might not 
be known, but we might have constraints on that object (e.g., it subclasses 
class A).  This seems difficult to model with a region that associates a 
specific type with an object.


_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to