diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-07-14 01:12:46 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-07-14 01:12:46 +0000 |
commit | 8203725f37fbb45ded343e4378247fee3389c0da (patch) | |
tree | 9747d8904df212fa9d678be2227c404d433fa1ff /lib/Analysis/RegionStore.cpp | |
parent | 66ad201eb59147fb47816ce961430f05b28203b2 (diff) |
Instead of recovering from a wrong invalidation, this patch aims to
invalidate the region correctly. It uses the cast-to type to invalidate
the region when available. To avoid invalid cast-to type like 'void*' or 'id',
region store now only records non-generic casts of regions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@75580 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/RegionStore.cpp')
-rw-r--r-- | lib/Analysis/RegionStore.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp index c59d935c3d..577ace306b 100644 --- a/lib/Analysis/RegionStore.cpp +++ b/lib/Analysis/RegionStore.cpp @@ -327,6 +327,10 @@ public: const GRState *setCastType(const GRState *state, const MemRegion* R, QualType T); + const QualType *getCastType(const GRState *state, const MemRegion *R) { + return state->get<RegionCasts>(R); + } + static inline RegionBindingsTy GetRegionBindings(Store store) { return RegionBindingsTy(static_cast<const RegionBindingsTy::TreeTy*>(store)); } @@ -349,6 +353,27 @@ public: } // end anonymous namespace +static bool isGenericPtr(ASTContext &Ctx, QualType Ty) { + if (Ty->isObjCIdType() || Ty->isObjCQualifiedIdType()) + return true; + + while (true) { + Ty = Ctx.getCanonicalType(Ty); + + if (Ty->isVoidType()) + return true; + + if (const PointerType *PT = Ty->getAsPointerType()) { + Ty = PT->getPointeeType(); + continue; + } + + break; + } + + return false; +} + //===----------------------------------------------------------------------===// // RegionStore creation. //===----------------------------------------------------------------------===// @@ -1251,6 +1276,13 @@ const GRState *RegionStoreManager::RemoveRegionView(const GRState *state, const GRState *RegionStoreManager::setCastType(const GRState *state, const MemRegion* R, QualType T) { + // We do not record generic cast type, since we are using cast type to + // invlidate regions, and generic type is meaningless for invalidating + // regions. + // If the region already has a cast type before, that type is preserved. + // FIXME: is this the right thing to do? + if (isGenericPtr(getContext(), T)) + return state; return state->set<RegionCasts>(R, T); } |