aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/RegionStore.cpp
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2009-06-23 05:23:38 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2009-06-23 05:23:38 +0000
commit087d6c20876ced37d544552b43cf33332687f074 (patch)
tree0fc631d79e5ddebd05b83346289db57ae4dfd98b /lib/Analysis/RegionStore.cpp
parent5636a3b6ece2c1f413464b72545e08eb0b7f06e4 (diff)
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
Diffstat (limited to 'lib/Analysis/RegionStore.cpp')
-rw-r--r--lib/Analysis/RegionStore.cpp36
1 files changed, 19 insertions, 17 deletions
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<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 @@ const GRState *RegionStoreManager::BindArray(const GRState *state,
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 @@ 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<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 @@ 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;
}