[cfe-commits] r73949 - /cfe/trunk/lib/Analysis/RegionStore.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Tue Jun 23 16:52:45 PDT 2009
2009/6/24 Ted Kremenek <kremenek at apple.com>:
> Similar comment to my comment for r73946. Was there a particular motivation
> for this change? While there is certainly more complexity in mass assigning
> fields to 0, algorithmically it seems like a more scalable approach. If the
> original implementation was too complicated, perhaps we just need to find an
> alternate implementation that is easier to reason about.
If we have:
struct s {
int x;
unsigned y;
};
we should get a signed 0 and an unsigned 0 for 'x' and 'y'
respectively. Otherwise APSInt would assert. This is the motivation.
>
> On Jun 22, 2009, at 10:43 PM, Zhongxing Xu wrote:
>
>> Author: zhongxingxu
>> Date: Tue Jun 23 00:43:16 2009
>> New Revision: 73949
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=73949&view=rev
>> Log:
>> If the init list is fewer than the struct fields, bind the rest fields to
>> 0
>> explicitly. Make 0 value with the field type.
>>
>> Modified:
>> cfe/trunk/lib/Analysis/RegionStore.cpp
>>
>> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=73949&r1=73948&r2=73949&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
>> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Tue Jun 23 00:43:16 2009
>> @@ -1165,20 +1165,14 @@
>>
>> nonloc::CompoundVal& CV = cast<nonloc::CompoundVal>(V);
>> nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
>> -
>> - for (RecordDecl::field_iterator FI = RD->field_begin(getContext()),
>> - FE = RD->field_end(getContext());
>> +
>> + RecordDecl::field_iterator FI, FE;
>> +
>> + for (FI = RD->field_begin(getContext()), FE =
>> RD->field_end(getContext());
>> FI != FE; ++FI, ++VI) {
>>
>> - // There may be fewer values than fields only when we are
>> initializing a
>> - // struct decl. In this case, mark the region as having default
>> value.
>> - if (VI == VE) {
>> - // FIXME: We should bind signed/unsigned 0 according to the sign of
>> the
>> - // field type.
>> - const NonLoc& Idx = NonLoc::MakeIntVal(getBasicVals(), 0, false);
>> - state = state->set<RegionDefaultValue>(R, Idx);
>> + if (VI == VE)
>> break;
>> - }
>>
>> QualType FTy = (*FI)->getType();
>> FieldRegion* FR = MRMgr.getFieldRegion(*FI, R);
>> @@ -1191,6 +1185,17 @@
>> state = BindStruct(state, FR, *VI);
>> }
>>
>> + // There may be fewer values in the initialize list than the fields of
>> struct.
>> + while (FI != FE) {
>> + QualType FTy = (*FI)->getType();
>> + if (FTy->isIntegerType()) {
>> + FieldRegion* FR = MRMgr.getFieldRegion(*FI, R);
>> + state = Bind(state, Loc::MakeVal(FR), ValMgr.makeZeroVal(FTy));
>> + }
>> +
>> + ++FI;
>> + }
>> +
>> return state;
>> }
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
More information about the cfe-commits
mailing list