[cfe-commits] r73946 - in /cfe/trunk: include/clang/Analysis/PathSensitive/ValueManager.h lib/Analysis/RegionStore.cpp lib/Analysis/SVals.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Tue Jun 23 16:55:47 PDT 2009
2009/6/24 Ted Kremenek <kremenek at apple.com>:
> Hi Zhongxing,
>
> Is this approach going to scale? For even moderate sized arrays this seems
> like it is going to result in a bunch of excess storage. For large arrays
> this might not scale at all. Was there some particular motivation behind
> this change?
I was to make the array case consistent with the struct case. But now
I realized that for the array case we can use the uniform default
value safely. I'll revert to that approach.
>
> Ted
>
> On Jun 22, 2009, at 10:23 PM, Zhongxing Xu wrote:
>
>> Author: zhongxingxu
>> Date: Tue Jun 23 00:23:38 2009
>> New Revision: 73946
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=73946&view=rev
>> Log:
>> Instead of setting the default value of the array region, bind the rest of
>> the
>> array elements to 0 explicitly. Create 0 values with the element type.
>>
>> Modified:
>> cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
>> cfe/trunk/lib/Analysis/RegionStore.cpp
>> cfe/trunk/lib/Analysis/SVals.cpp
>>
>> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h?rev=73946&r1=73945&r2=73946&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h
>> (original)
>> +++ cfe/trunk/include/clang/Analysis/PathSensitive/ValueManager.h Tue Jun
>> 23 00:23:38 2009
>> @@ -89,6 +89,8 @@
>> SVal getFunctionPointer(const FunctionDecl* FD);
>>
>> NonLoc makeNonLoc(SymbolRef sym);
>> +
>> + NonLoc makeNonLoc(const llvm::APSInt& V);
>>
>> NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
>> const llvm::APSInt& rhs, QualType T);
>>
>> Modified: cfe/trunk/lib/Analysis/RegionStore.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/RegionStore.cpp?rev=73946&r1=73945&r2=73946&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/RegionStore.cpp (original)
>> +++ cfe/trunk/lib/Analysis/RegionStore.cpp Tue Jun 23 00:23:38 2009
>> @@ -1079,17 +1079,11 @@
>> SVal Init) {
>>
>> QualType T = R->getValueType(getContext());
>> - assert(T->isArrayType());
>> -
>> - // When we are binding the whole array, it always has default value 0.
>> - state = state->set<RegionDefaultValue>(R,
>> NonLoc::MakeIntVal(getBasicVals(),
>> - 0,
>> false));
>> -
>> ConstantArrayType* CAT = cast<ConstantArrayType>(T.getTypePtr());
>> + QualType ElementTy = CAT->getElementType();
>>
>> llvm::APSInt Size(CAT->getSize(), false);
>> - llvm::APSInt i = getBasicVals().getValue(0, Size.getBitWidth(),
>> - Size.isUnsigned());
>> + llvm::APSInt i(llvm::APInt::getNullValue(Size.getBitWidth()), false);
>>
>> // Check if the init expr is a StringLiteral.
>> if (isa<loc::MemRegionVal>(Init)) {
>> @@ -1106,10 +1100,8 @@
>> if (j >= len)
>> break;
>>
>> - SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
>> - ElementRegion* ER =
>> - MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
>> - Idx, R, getContext());
>> + SVal Idx = ValMgr.makeNonLoc(i);
>> + ElementRegion* ER = MRMgr.getElementRegion(ElementTy,
>> Idx,R,getContext());
>>
>> SVal V = NonLoc::MakeVal(getBasicVals(), str[j], sizeof(char)*8,
>> true);
>> state = Bind(state, loc::MemRegionVal(ER), V);
>> @@ -1122,14 +1114,12 @@
>> nonloc::CompoundVal::iterator VI = CV.begin(), VE = CV.end();
>>
>> for (; i < Size; ++i, ++VI) {
>> - // The init list might be shorter than the array decl.
>> + // The init list might be shorter than the array length.
>> if (VI == VE)
>> break;
>>
>> - SVal Idx = NonLoc::MakeVal(getBasicVals(), i);
>> - ElementRegion* ER =
>> - MRMgr.getElementRegion(cast<ArrayType>(T)->getElementType(),
>> - Idx, R, getContext());
>> + SVal Idx = ValMgr.makeNonLoc(i);
>> + ElementRegion* ER = MRMgr.getElementRegion(ElementTy, Idx, R,
>> getContext());
>>
>> if (CAT->getElementType()->isStructureType())
>> state = BindStruct(state, ER, *VI);
>> @@ -1137,6 +1127,18 @@
>> state = Bind(state, Loc::MakeVal(ER), *VI);
>> }
>>
>> + // If the init list is shorter than the array length, bind the rest
>> elements
>> + // to 0.
>> + if (ElementTy->isIntegerType()) {
>> + while (i < Size) {
>> + SVal Idx = ValMgr.makeNonLoc(i);
>> + ElementRegion* ER = MRMgr.getElementRegion(ElementTy,
>> Idx,R,getContext());
>> + SVal V = ValMgr.makeZeroVal(ElementTy);
>> + state = Bind(state, Loc::MakeVal(ER), V);
>> + ++i;
>> + }
>> + }
>> +
>> return state;
>> }
>>
>>
>> Modified: cfe/trunk/lib/Analysis/SVals.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=73946&r1=73945&r2=73946&view=diff
>>
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Analysis/SVals.cpp (original)
>> +++ cfe/trunk/lib/Analysis/SVals.cpp Tue Jun 23 00:23:38 2009
>> @@ -264,6 +264,10 @@
>> return nonloc::SymbolVal(sym);
>> }
>>
>> +NonLoc ValueManager::makeNonLoc(const APSInt& V) {
>> + return nonloc::ConcreteInt(BasicVals.getValue(V));
>> +}
>> +
>> NonLoc ValueManager::makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode
>> op,
>> const APSInt& v, QualType T) {
>> // The Environment ensures we always get a persistent APSInt in
>>
>>
>> _______________________________________________
>> 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