about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Kalbertodt <lukas.kalbertodt@gmail.com>2020-07-19 13:45:51 +0200
committerLukas Kalbertodt <lukas.kalbertodt@gmail.com>2020-07-19 16:11:07 +0200
commitce338046c8b40e3284707d2ab725e9f076592959 (patch)
treef4a43228117ba7ec05951d7e0ae13d8d3b62ee67
parent47ea6d90b073ab977cf072e2f5f46d63de532cc6 (diff)
downloadrust-ce338046c8b40e3284707d2ab725e9f076592959.tar.gz
rust-ce338046c8b40e3284707d2ab725e9f076592959.zip
Fix panic message when `RangeFrom` index is out of bounds
Before, the `Range` method was called with `end = slice.len()`.
Unfortunately, because `Range::index` first checks the order of the
indices (start has to be smaller than end), an out of bounds index
leads to `core::slice::slice_index_order_fail` being called. This
prints the message 'slice index starts at 27 but ends at 10', which is
worse than 'index 27 out of range for slice of length 10'. This is not
only useful to normal users reading panic messages, but also for people
inspecting assembly and being confused by `slice_index_order_fail`
calls.
-rw-r--r--src/libcore/slice/mod.rs10
-rw-r--r--src/libcore/tests/slice.rs2
2 files changed, 9 insertions, 3 deletions
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs
index 20b2c3d3c96..52babaf9f72 100644
--- a/src/libcore/slice/mod.rs
+++ b/src/libcore/slice/mod.rs
@@ -3241,12 +3241,18 @@ unsafe impl<T> SliceIndex<[T]> for ops::RangeFrom<usize> {
 
     #[inline]
     fn index(self, slice: &[T]) -> &[T] {
-        (self.start..slice.len()).index(slice)
+        if self.start > slice.len() {
+            slice_index_len_fail(self.start, slice.len());
+        }
+        unsafe { &*self.get_unchecked(slice) }
     }
 
     #[inline]
     fn index_mut(self, slice: &mut [T]) -> &mut [T] {
-        (self.start..slice.len()).index_mut(slice)
+        if self.start > slice.len() {
+            slice_index_len_fail(self.start, slice.len());
+        }
+        unsafe { &mut *self.get_unchecked_mut(slice) }
     }
 }
 
diff --git a/src/libcore/tests/slice.rs b/src/libcore/tests/slice.rs
index fba73be92be..8e240832c13 100644
--- a/src/libcore/tests/slice.rs
+++ b/src/libcore/tests/slice.rs
@@ -1088,7 +1088,7 @@ mod slice_index {
 
             good: data[6..] == [];
             bad: data[7..];
-            message: "but ends at"; // perhaps not ideal
+            message: "out of range";
         }
 
         in mod rangeto_len {