diff options
| author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-05-12 10:10:00 +0000 |
|---|---|---|
| committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-05-12 10:10:00 +0000 |
| commit | 08a2ede018e57e1bff0a4b3ee8dee5d5144897d5 (patch) | |
| tree | b2cca530231893a0a5a6bab842a4f6df4279482d /clang/lib/Analysis/RegionStore.cpp | |
| parent | 310511d429fee450400af626a5cb7c976e749152 (diff) | |
| download | bcm5719-llvm-08a2ede018e57e1bff0a4b3ee8dee5d5144897d5.tar.gz bcm5719-llvm-08a2ede018e57e1bff0a4b3ee8dee5d5144897d5.zip | |
Add logic for invalidating array region to CFRefCount.cpp. When invalidating
array region, set its default value to conjured symbol. When retrieving its
element, create new region value symbol for the element.
Also fix some 80 columns violations.
llvm-svn: 71548
Diffstat (limited to 'clang/lib/Analysis/RegionStore.cpp')
| -rw-r--r-- | clang/lib/Analysis/RegionStore.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/clang/lib/Analysis/RegionStore.cpp b/clang/lib/Analysis/RegionStore.cpp index 9d29a90b3e7..440080db7e0 100644 --- a/clang/lib/Analysis/RegionStore.cpp +++ b/clang/lib/Analysis/RegionStore.cpp @@ -276,7 +276,7 @@ public: void iterBindings(Store store, BindingsHandler& f) { // FIXME: Implement. } - + const GRState* setDefaultValue(const GRState* St, const MemRegion* R, SVal V); private: const GRState* BindArray(const GRState* St, const TypedRegion* R, SVal V); @@ -759,8 +759,13 @@ SVal RegionStoreManager::Retrieve(const GRState* St, Loc L, QualType T) { const MemRegion* SuperR = cast<SubRegion>(R)->getSuperRegion(); GRStateTrait<RegionDefaultValue>::lookup_type D = state.get<RegionDefaultValue>(SuperR); - if (D) - return *D; + if (D) { + // If the default value is symbolic, we need to create a new symbol. + if (D->hasConjuredSymbol()) + return ValMgr.getRegionValueSymbolVal(R); + else + return *D; + } } if (const ObjCIvarRegion *IVR = dyn_cast<ObjCIvarRegion>(R)) { @@ -1274,3 +1279,9 @@ const GRState* RegionStoreManager::setCastType(const GRState* St, GRStateRef state(St, StateMgr); return state.set<RegionCasts>(R, T); } + +const GRState* RegionStoreManager::setDefaultValue(const GRState* St, + const MemRegion* R, SVal V) { + GRStateRef state(St, StateMgr); + return state.set<RegionDefaultValue>(R, V); +} |

