Fix some sporadic segfaults that are triggered when SmallVector's heap
authorDan Gohman <gohman@apple.com>
Thu, 17 May 2007 18:29:01 +0000 (18:29 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 17 May 2007 18:29:01 +0000 (18:29 +0000)
storage lands near the end of the available address space. In the expression
Begin+N > Capacity, the Begin+N was overflowing. Fix this by replacing it
by with an expression that doesn't involve computation of an address
beyond the end of allocated memory.

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

include/llvm/ADT/SmallVector.h

index e93177cdcb748338c28a46fca0ba44c24e2a9a60..12127603058ea812471bdc46877deab21fdf4ef7 100644 (file)
@@ -147,7 +147,7 @@ public:
       destroy_range(Begin+N, End);
       End = Begin+N;
     } else if (N > size()) {
-      if (Begin+N > Capacity)
+      if (Capacity-Begin < N)
         grow(N);
       construct_range(End, Begin+N, T());
       End = Begin+N;
@@ -159,7 +159,7 @@ public:
       destroy_range(Begin+N, End);
       End = Begin+N;
     } else if (N > size()) {
-      if (Begin+N > Capacity)
+      if (Capacity-Begin < N)
         grow(N);
       construct_range(End, Begin+N, NV);
       End = Begin+N;
@@ -189,7 +189,7 @@ public:
   
   void assign(unsigned NumElts, const T &Elt) {
     clear();
-    if (Begin+NumElts > Capacity)
+    if (Capacity-Begin < NumElts)
       grow(NumElts);
     End = Begin+NumElts;
     construct_range(Begin, End, Elt);