[cfe-dev] Proposed: change tracking for RegionStore
Ted Kremenek
kremenek at apple.com
Mon Aug 2 17:33:43 PDT 2010
(Just catching up)
This is essentially what we are trying to do. The problem is whether that map is done as a per-path property or something "global" to the instance of a Checker or GRExprEngine. If it is per-path, the map has to go in GRState or something similar if that map isn't short-lived. My suggestion before was that this map is essentially implicitly defined by the Checkers, since they are already tracking checker-specific state on the side. In this case, representing this map separately in GRState seems a little silly to me, and potentially a performance concern when it comes to state caching.
On Aug 1, 2010, at 1:23 AM, Zhongxing Xu wrote:
> Are we trying to solve the problem that, some checkers want to be
> informed when some region bindings are changed?
>
> Can we do this:
>
> GRExprEngine maintains a RegionWatcher, which is basically a map:
> MemRegion * => list of Checkers who are interested in the MemRegion
>
> Checkers first register themselves with the region they are interested
> in to the RegionWatcher.
>
> In StoreManager::bind and other necessary places, call
> RegionWatcher::RegionChanged() with the new store and a list of
> changed regions. RegionWatcher then inform each Checker that
> registered before.
>
> On Sat, Jul 31, 2010 at 1:42 PM, Jordy Rose <jediknil at belkadan.com> wrote:
>>
>> On Fri, 30 Jul 2010 19:05:35 -0700, Ted Kremenek <kremenek at apple.com>
>> wrote:
>>> On Jul 30, 2010, at 3:33 PM, Jordy Rose wrote:
>>>>
>>>> And hm. How can we inject new analysis state at the level of Bind or
>>>> Invalidate, where only the Store is being changed? Not all
>>>> store-modifying
>>>> code goes through GRState.
>>>
>>>
>>> I think Bind and Invalidate would still work as expected, but just
>> return
>>> the list of regions that "subscribers" had said they cared about.
>>>
>>> Bind and Invalidate, however, are only called at specific places (e.g.,
>> in
>>> GRExprEngine), and usually when one is reasoning about a GRState or
>>> ExplodedNode. Does it seem plausible to try and do the callbacks after
>> the
>>> Bind/Invalidate, possibly generating new ExplodedNodes? For example, I
>> can
>>> see this happening when evaluating a store within GRExprEngine.
>>
>> I'm thinking of modeling functions, though. The only place where this is
>> used now is MallocChecker's fill value (admittedly, a patch from me, weeks
>> ago). But memset() is basically Invalidate-then-BindDefault.
>> OSAtomicChecker is using EvalStore, but it's not as clean as it should be.
>> There's no EvalFill or EvalInvalidate. Should there be?
>>
>> I'm inclined to not allow new ExplodedNodes here, only a one-to-one filter
>> of GRStates. That is, you can change states when getting a region update,
>> but not bifurcate the state. This limits us to "places that call
>> GRState::makeWithStore", which are a manageable set. But still not at the
>> GRExprEngine level. I'm not thrilled with turning every bind* call into
>> this:
>>
>> RegionSet RS = C.getEngine().GetInterestingRegions();
>> tie(state, RS) = state->bindLoc(L, V, RS);
>> C.getEngine().NoteRegionsChanged(state, RS);
>>
>> Or this:
>>
>> state = state->bindLoc(L, V, C.getEngine());
>>
>> They both seem like they're mixing levels. But having to move these cover
>> methods for Bind* and friends (eight methods) up to the engine seems a
>> little silly. Maybe it shouldn't.
>>
More information about the cfe-dev
mailing list