From: Zhongxing Xu Date: Tue, 23 Jun 2009 05:23:38 +0000 (+0000) Subject: Instead of setting the default value of the array region, bind the rest of the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=087d6c20876ced37d544552b43cf33332687f074;p=clang 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73946 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Analysis/PathSensitive/ValueManager.h b/include/clang/Analysis/PathSensitive/ValueManager.h index c28f0ea855..e6279a3df9 100644 --- a/include/clang/Analysis/PathSensitive/ValueManager.h +++ b/include/clang/Analysis/PathSensitive/ValueManager.h @@ -89,6 +89,8 @@ public: 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); diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index 564ffec6cf..ff2145e26e 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -1079,17 +1079,11 @@ const GRState *RegionStoreManager::BindArray(const GRState *state, 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(R, NonLoc::MakeIntVal(getBasicVals(), - 0, false)); - ConstantArrayType* CAT = cast(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(Init)) { @@ -1106,10 +1100,8 @@ const GRState *RegionStoreManager::BindArray(const GRState *state, if (j >= len) break; - SVal Idx = NonLoc::MakeVal(getBasicVals(), i); - ElementRegion* ER = - MRMgr.getElementRegion(cast(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 @@ const GRState *RegionStoreManager::BindArray(const GRState *state, 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(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 @@ const GRState *RegionStoreManager::BindArray(const GRState *state, 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; } diff --git a/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp index 77c3c8f772..e33275199a 100644 --- a/lib/Analysis/SVals.cpp +++ b/lib/Analysis/SVals.cpp @@ -264,6 +264,10 @@ NonLoc ValueManager::makeNonLoc(SymbolRef sym) { 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