]> granicus.if.org Git - clang/commitdiff
Revert r75281 and simply remove the assertion in NewCastRegion that
authorTed Kremenek <kremenek@apple.com>
Fri, 10 Jul 2009 21:24:45 +0000 (21:24 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 10 Jul 2009 21:24:45 +0000 (21:24 +0000)
CodeTextRegions can only be casted to FunctionPointer or BlockPointerTypes. This
simply isn't true. We can handle bogus operations on CodeTextRegions (e.g, an
array access) elsewhere.

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

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

index ad6bd7e4f664d43a6594631d0d2ff841cb104461..7101b34477642bb6610dabb62aa3432fb4d64f8b 100644 (file)
@@ -45,24 +45,6 @@ static bool IsCompleteType(ASTContext &Ctx, QualType Ty) {
   return true;
 }
 
-static bool isVoidOrHigherOrderVoidPtr(ASTContext &Ctx, QualType Ty) {
-  while (true) {
-    Ty = Ctx.getCanonicalType(Ty);
-    
-    if (Ty->isVoidType())
-      return true;    
-
-    if (const PointerType *PT = Ty->getAsPointerType()) {
-      Ty = PT->getPointeeType();
-      continue;
-    }
-    
-    break;
-  }
-  
-  return false;
-}
-
 StoreManager::CastResult
 StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
                             QualType CastToTy) {
@@ -82,10 +64,6 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
   // already be handled.
   QualType PointeeTy = CastToTy->getAsPointerType()->getPointeeType();
   
-  // Casts to 'void*', 'void**', 'void***', etc., should just pass through.
-  if (isVoidOrHigherOrderVoidPtr(Ctx, PointeeTy))
-    return CastResult(state, R);
-  
   // Process region cast according to the kind of the region being cast.
   switch (R->getKind()) {
     case MemRegion::BEG_TYPED_REGIONS:
@@ -99,9 +77,9 @@ StoreManager::NewCastRegion(const GRState *state, const MemRegion* R,
     }
       
     case MemRegion::CodeTextRegionKind: {
-      // CodeTextRegion should be cast to only function pointer type.
-      assert(CastToTy->isFunctionPointerType() || 
-             CastToTy->isBlockPointerType());
+      // CodeTextRegion should be cast to only function pointer type, although
+      // they can in practice be casted to anything, e.g, void*, char*, etc.
+      // Just pass the region through.
       break;
     }
       
index 19d76228054cad1d93507777f1c3042e54699f08..a0da13e0aa2b29de2fca6958c45b9e453472e83b 100644 (file)
@@ -324,17 +324,20 @@ void test_rdar_7034511(NSArray *y) {
   if (x == ((void*) 0)) {}
 }
 
-// Handle arbitrary void*^n -> void*^m casts.  This was previously causing
-// a crash in CastRegion.
-void handle_higher_order_voidptr_casts() {
+// Handle casts of function pointers (CodeTextRegions) to arbitrary pointer
+// types. This was previously causing a crash in CastRegion.
+void handle_funcptr_voidptr_casts() {
   void **ptr;
   typedef void *PVOID;
+  typedef void *PCHAR;  
   typedef long INT_PTR, *PINT_PTR;
   typedef INT_PTR (*FARPROC)();
-  FARPROC handle_higher_order_voidptr_casts_aux();
-  PVOID handle_higher_order_voidptr_casts_aux_2(PVOID volatile *x);
+  FARPROC handle_funcptr_voidptr_casts_aux();
+  PVOID handle_funcptr_voidptr_casts_aux_2(PVOID volatile *x);
+  PVOID handle_funcptr_voidptr_casts_aux_3(PCHAR volatile *x);  
   
-  ptr = (void**) handle_higher_order_voidptr_casts_aux();
-  handle_higher_order_voidptr_casts_aux_2(ptr);
+  ptr = (void**) handle_funcptr_voidptr_casts_aux();
+  handle_funcptr_voidptr_casts_aux_2(ptr);
+  handle_funcptr_voidptr_casts_aux_3(ptr);
 }