]> granicus.if.org Git - clang/commitdiff
Fix crash in StoreManager::CastRegion() when the base region is a type with 0 size.
authorTed Kremenek <kremenek@apple.com>
Wed, 7 Apr 2010 00:46:49 +0000 (00:46 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 7 Apr 2010 00:46:49 +0000 (00:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100594 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/Store.cpp
test/Analysis/misc-ps-region-store.m

index e524cb3d7cc327132c5975f280d5b14fa8daccd9..80b6586b8b935a97ebe09bfadb543936045e11c7 100644 (file)
@@ -170,13 +170,14 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)
       if (IsCompleteType(Ctx, PointeeTy)) {
         // Compute the size in **bytes**.
         CharUnits pointeeTySize = Ctx.getTypeSizeInChars(PointeeTy);
-
-        // Is the offset a multiple of the size?  If so, we can layer the
-        // ElementRegion (with elementType == PointeeTy) directly on top of
-        // the base region.
-        if (off % pointeeTySize == 0) {
-          newIndex = off / pointeeTySize;
-          newSuperR = baseR;
+        if (!pointeeTySize.isZero()) {
+          // Is the offset a multiple of the size?  If so, we can layer the
+          // ElementRegion (with elementType == PointeeTy) directly on top of
+          // the base region.
+          if (off % pointeeTySize == 0) {
+            newIndex = off / pointeeTySize;
+            newSuperR = baseR;
+          }
         }
       }
 
index 0e305bf1dfba864fedb53c849751336ed3c76507..3f64a085c8392bd2e5473a4171d6db4577d910e9 100644 (file)
@@ -976,3 +976,11 @@ void rdar7817800_qux(void*);
 }
 @end
 
+// PR 6036 - This test case triggered a crash inside StoreManager::CastRegion because the size
+// of 'unsigned long (*)[0]' is 0.
+struct pr6036_a { int pr6036_b; };
+struct pr6036_c;
+void u132monitk (struct pr6036_c *pr6036_d) {
+  (void) ((struct pr6036_a *) (unsigned long (*)[0]) ((char *) pr6036_d - 1))->pr6036_b; // expected-warning{{Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption}}
+}
+