[cfe-commits] r169571 - /cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp

Ted Kremenek kremenek at apple.com
Fri Dec 7 10:27:36 PST 2012


On Dec 7, 2012, at 9:36 AM, Jordan Rose <jordan_rose at apple.com> wrote:

>> 
>>  // BindDefault is only used to initialize a region with a default value.
>>  StoreRef BindDefault(Store store, const MemRegion *R, SVal V) {
>> -    RegionBindings B = GetRegionBindings(store);
>> -    assert(!lookup(B, R, BindingKey::Default));
>> -    assert(!lookup(B, R, BindingKey::Direct));
>> -    return StoreRef(addBinding(B, R, BindingKey::Default, V)
>> -                      .getRootWithoutRetain(), *this);
>> +    RegionBindingsRef B = getRegionBindings(store);
>> +    assert(!B.lookup(R, BindingKey::Default));
>> +    assert(!B.lookup(R, BindingKey::Direct));
>> +    return StoreRef(B.addBinding(R, BindingKey::Default, V)
>> +                     .asImmutableMap()
>> +                     .getRootWithoutRetain(), *this);
> 
> I was thinking about this; I think we should have a makeStoreRef(RegionBindingsRef) helper, since we see this pattern so much.
> 

I agree.

> 
>>        // invalidate that region.  This is because a block may capture
>>        // a pointer value, but the thing pointed by that pointer may
>>        // get invalidated.
>> -        Store store = B.getRootWithoutRetain();
>> +        Store store = B.asImmutableMap().getRootWithoutRetain();
>>        SVal V = RM.getBinding(store, loc::MemRegionVal(VR));
> 
> This is an unfortunate impedance mismatch.

Impedance mismatch?  Please elucidate.

> 
> 
>> StoreRef RegionStoreManager::BindArray(Store store, const TypedValueRegion* R,
>> @@ -1724,9 +1813,9 @@
>> 
>>  // There may be fewer values in the initialize list than the fields of struct.
>>  if (FI != FE) {
>> -    RegionBindings B = GetRegionBindings(newStore.getStore());
>> -    B = addBinding(B, R, BindingKey::Default, svalBuilder.makeIntVal(0, false));
>> -    newStore = StoreRef(B.getRootWithoutRetain(), *this);
>> +    RegionBindingsRef B = getRegionBindings(newStore.getStore());
>> +    B = B.addBinding(R, BindingKey::Default, svalBuilder.makeIntVal(0, false));
>> +    newStore = StoreRef(B.asImmutableMap().getRootWithoutRetain(), *this);
>>  } 
> 
> Same impedance mismatch in BindStruct, BindVector, and BindArray. For that matter, it's worse: we know that all the bindings will happen in a single cluster.

Not sure what you mean by impedance mismatch.  I do agree that asImmutableMap().getRootWithoutRetain() chain is gross, and can be sugared up.  Is that what you mean?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121207/7e1e2bc9/attachment.html>


More information about the cfe-commits mailing list