[cfe-dev] [PATCH] expand a symbolic pointer

Zhongxing Xu xuzhongxing at gmail.com
Wed Dec 10 22:14:43 PST 2008


On Thu, Dec 11, 2008 at 1:54 PM, Ted Kremenek <kremenek at apple.com> wrote:

>
> On Dec 10, 2008, at 8:06 PM, Zhongxing Xu wrote:
>
>  Thanks for your comments. They were helpful. Now the interfaces get
>> simplified a lot. Variables and functions are commented well.
>>
>> Here I explain the main idea.
>>
>> Some struct base is not mutable, e.g., struct s a; a.f = 3; Here the
>> struct base 'a' is not mutable. But some can, e.g.,
>>
>> void foo(struct s* p) {
>>  p->f = 3
>> }
>>
>> When we getInitialStore(), p is initialized to have value loc::SymbolVal,
>> which I call a symbolic pointer. (Note: here no symbolic region is
>> involved).
>>
>> In this patch we try to concretize the struct pointer p. We have several
>> preconditions for this concretization:
>>  - the struct base is a pointer
>>  - the pointer is symbolic
>>  - the pointer is an lvalue, so that it can be modified.
>>
>> When concretizing the struct base pointer, we pass the pointer's location
>> to StoreManager. Therefore the pointer should be an lvalue and has a
>> location. We get this location by calling
>> GRExprEngine::getBasePtrLoc(). This method only handles a few cases. In
>> other cases, BasePtrLoc is left Undefined intentionally.
>>
>
> Hi Zhongxing,
>
> The patch is looking great, but I still have some concerns about the
> overall approach.  Consider your example with one modification:
>
> void foo(struct s* p) {
>  struct s* q = p;
>  p->f = 3
> }
>
> After evaluating 'p->f' p will bind to an AnonPointeeRegion, but 'q' will
> bind to the original symbol.  They are aliases.  It gets arbitrarily worse
> if the value of 'p' is stored in other places, passed to functions, etc.
>
> This overall approach feels a little "destructive."  We're losing
> information here.  After evaluating 'p->f' we've lost the fact that 'p'
> *still* binds to the value at the entry to the function.
>
> I see this as being fundamental problematic for four reasons:
>
> (1) Different analyses may attach information (perhaps using the GDM) to a
> symbolic value.  Actually replacing a symbolic value with something
> "concrete" loses that information.
>
> (2) Consider function summaries.  We don't have them yet, but  basically we
> would build up a set of constraints and effects in terms of the input to the
> function.  That input is the symbolic values.  Even if we "concretize" them
> we need to keep them around.
>
> (3) Aliasing (i.e., the example I gave).  Concretization via replacing
> loses this critical information.
>
> (4) The BugReporter "module" needs to reconstruct information from the
> ExplodedGraph, including when aliasing relationships come into effect, etc.
>  Blowing away the original value of 'p' makes this difficult at best.
>
> The only way to replace a symbolic value with a concrete value is to
> alpha-rename it throughout the entire state.  This isn't trivial, especially
> when one considers the GDM.
>
> I honestly think we need to take a "layered" approach.  Keep a map on the
> side from "symbols" to concrete values.  That's basically what we do in
> ConstraintManager when it comes to equality relationships with integers.
>  Equality relationships with integers is a form of concretizations; that's
> all were basically doing here, except we're reasoning about the
> concretization of the heap.
>
> What do you think?  I have specific comments about your patch (which is
> looking great!) but I will defer them until we iterate more on this design
> point.
>
> Ted
>

Thanks for bringing up these issues. I agree that we should keep the
original symbolic value around, and do the conretization with a side
mapping. I'll try to implement the idea and see what problems would come up.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20081211/357d3d23/attachment.html>


More information about the cfe-dev mailing list