]> granicus.if.org Git - clang/commitdiff
StoreManager::NewCastRegion:
authorTed Kremenek <kremenek@apple.com>
Mon, 6 Jul 2009 22:23:45 +0000 (22:23 +0000)
committerTed Kremenek <kremenek@apple.com>
Mon, 6 Jul 2009 22:23:45 +0000 (22:23 +0000)
- Refactor logic that creates ElementRegions into a help method 'MakeElementRegion'.
- Fix crash due to not handling StringRegions.  Casts of StringRegions now
  result in a new ElementRegion layered on the original StringRegion.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@74867 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/Store.cpp
test/Analysis/misc-ps.m

index cd123995faa39b0419e1d222c8aaa16ee752722c..08db2c565f3ce5518a3a06f3cb18570b440d385b 100644 (file)
@@ -22,6 +22,19 @@ StoreManager::StoreManager(GRStateManager &stateMgr, bool useNewCastRegion)
     UseNewCastRegion(useNewCastRegion),
     MRMgr(ValMgr.getRegionManager()) {}
 
+StoreManager::CastResult
+StoreManager::MakeElementRegion(const GRState *state, const MemRegion *region,
+                                QualType pointeeTy, QualType castToTy) {
+  
+  // Record the cast type of the region.
+  state = setCastType(state, region, castToTy);
+  
+  // Create a new ElementRegion at offset 0.
+  SVal idx = ValMgr.makeZeroArrayIndex();
+  return CastResult(state, MRMgr.getElementRegion(pointeeTy, idx, region,
+                                                  ValMgr.getContext()));  
+}
+
 StoreManager::CastResult
 StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
                             QualType CastToTy) {
@@ -38,19 +51,23 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
                && CastToTy->getAsPointerType()->getPointeeType()->isVoidType()));
     return CastResult(state, R);
   }
-  
+
   // Check cast to ObjCQualifiedID type.
   if (ToTy->isObjCQualifiedIdType()) {
     // FIXME: Record the type information aside.
     return CastResult(state, R);
   }
-  
+
   // Now assume we are casting from pointer to pointer. Other cases should
   // already be handled.
   QualType PointeeTy = cast<PointerType>(ToTy.getTypePtr())->getPointeeType();
-  
+
   // Process region cast according to the kind of the region being cast.
   
+  // Handle casts of string literals.
+  if (isa<StringRegion>(R))
+    return MakeElementRegion(state, R, PointeeTy, ToTy);
+  
   // FIXME: Need to handle arbitrary downcasts.
   if (isa<SymbolicRegion>(R) || isa<AllocaRegion>(R)) {
     state = setCastType(state, R, ToTy);
@@ -77,13 +94,8 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
     
     if ((PointeeTySize > 0 && PointeeTySize < ObjTySize) ||
         (ObjTy->isAggregateType() && PointeeTy->isScalarType()) ||
-        ObjTySize == 0 /* R has 'void*' type. */) {
-      // Record the cast type of the region.
-      state = setCastType(state, R, ToTy);
-      
-      SVal Idx = ValMgr.makeZeroArrayIndex();
-      ElementRegion* ER = MRMgr.getElementRegion(PointeeTy, Idx,R, Ctx);
-      return CastResult(state, ER);
+        ObjTySize == 0 /* R has 'void*' type. */) {      
+      return MakeElementRegion(state, R, PointeeTy, ToTy);
     } else {
       state = setCastType(state, R, ToTy);
       return CastResult(state, R);
index 025d74cccb4ad0f2dddd845f55f3459658a3d398..d4d2e6272f5d87aaee9f0865b603d78e2d128b0f 100644 (file)
@@ -297,4 +297,13 @@ void rdar_7027684(int x, int y) {
   (rdar_7027684_aux() ? rdar_7027684_aux_2() : (void) 0);
 }
 
+// Test that we handle casts of string literals to arbitrary types.
+unsigned const char *string_literal_test1() {
+  return (const unsigned char*) "hello";
+}
+
+const float *string_literal_test2() {
+  return (const float*) "hello";
+}
+