summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/GRExprEngine.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-12-13 19:24:37 +0000
committerTed Kremenek <kremenek@apple.com>2008-12-13 19:24:37 +0000
commitf065b15f7d47d7442b5d1641b97d321207e87b0a (patch)
tree053b53e504863307b5c5a814f59f18bcb9e7e6b3 /clang/lib/Analysis/GRExprEngine.cpp
parente69336c22d289f8e902ef87b13603fb264e868d0 (diff)
downloadbcm5719-llvm-f065b15f7d47d7442b5d1641b97d321207e87b0a.tar.gz
bcm5719-llvm-f065b15f7d47d7442b5d1641b97d321207e87b0a.zip
A series of cleanups/fixes motivated by <rdar://problem/6442306>:
GRExprEngine (VisitCast): - When using StoreManager::CastRegion, always use the state and value it returns to generate the next node. Failure to do so means that region values returned that don't require the state to be modified will get ignored. MemRegion: - Tighten the interface for ElementRegion. Now ElementRegion can only be created with a super region that is a 'TypedRegion' instead of any MemRegion. Code in BasicStoreManager/RegionStoreManager already assumed this, but it would result in a dynamic assertion check (and crash) rather than just having the compiler forbid the construction of such regions. - Added ElementRegion::getArrayRegion() to return the 'typed version' of an ElementRegion's super region. - Removed bogus assertion in ElementRegion::getType() that assumed that the super region was an AnonTypedRegion. All that matters is that it is a TypedRegion, which is now true all the time by design. BasicStore: - Modified getLValueElement() to check if the 'array' region is a TypedRegion before creating an ElementRegion. This conforms to the updated interface for ElementRegion. RegionStore: - In ArrayToPointer() gracefully handle things we don't reason about, and only create an ElementRegion if the array region is indeed a TypedRegion. llvm-svn: 60990
Diffstat (limited to 'clang/lib/Analysis/GRExprEngine.cpp')
-rw-r--r--clang/lib/Analysis/GRExprEngine.cpp12
1 files changed, 3 insertions, 9 deletions
diff --git a/clang/lib/Analysis/GRExprEngine.cpp b/clang/lib/Analysis/GRExprEngine.cpp
index 96776b46ff8..74e1a076319 100644
--- a/clang/lib/Analysis/GRExprEngine.cpp
+++ b/clang/lib/Analysis/GRExprEngine.cpp
@@ -1731,7 +1731,7 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
continue;
}
- // Check for casts from AllocaRegion pointer to typed pointer.
+ // Check for casts from a pointer to a region to typed pointer.
if (isa<loc::MemRegionVal>(V)) {
assert(Loc::IsLocType(T));
assert(Loc::IsLocType(ExTy));
@@ -1740,14 +1740,8 @@ void GRExprEngine::VisitCast(Expr* CastE, Expr* Ex, NodeTy* Pred, NodeSet& Dst){
std::pair<const GRState*, SVal> Res =
getStoreManager().CastRegion(St, V, T, CastE);
- const GRState* NewSt = Res.first;
- SVal NewPtr = Res.second;
-
- // If no new region is created, fall through to the default case.
- if (NewSt != St) {
- MakeNode(Dst, CastE, N, BindExpr(NewSt, CastE, NewPtr));
- continue;
- }
+ MakeNode(Dst, CastE, N, BindExpr(Res.first, CastE, Res.second));
+ continue;
}
// All other cases.
OpenPOWER on IntegriCloud