From b15e13760acba98bffbc5ca1218cdfc4c3f2fcbb Mon Sep 17 00:00:00 2001 From: lch361 Date: Mon, 25 Dec 2023 01:34:07 +0300 Subject: [PATCH 1/2] Removed redundant bounds checking at Split's next and next_mut methods --- library/core/src/slice/iter.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index fc54ea23770..a20b7c9bef0 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -458,8 +458,8 @@ where match self.v.iter().position(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(&self.v[..idx]); - self.v = &self.v[idx + 1..]; + let ret = Some(unsafe { self.v.get_unchecked(..idx) }); + self.v = unsafe { self.v.get_unchecked(idx + 1..) }; ret } } @@ -491,8 +491,8 @@ where match self.v.iter().rposition(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(&self.v[idx + 1..]); - self.v = &self.v[..idx]; + let ret = Some(unsafe { self.v.get_unchecked(idx + 1..) }); + self.v = unsafe { self.v.get_unchecked(..idx) }; ret } } From c082c1c4c37cb672e295a4cb1700fafb51d1e824 Mon Sep 17 00:00:00 2001 From: lch361 Date: Mon, 25 Dec 2023 01:59:37 +0300 Subject: [PATCH 2/2] Documented unsafe blocks --- library/core/src/slice/iter.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index a20b7c9bef0..3d58afd26ea 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -458,8 +458,12 @@ where match self.v.iter().position(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(unsafe { self.v.get_unchecked(..idx) }); - self.v = unsafe { self.v.get_unchecked(idx + 1..) }; + let (left, right) = + // SAFETY: if v.iter().position returns Some(idx), that + // idx is definitely a valid index for v + unsafe { (self.v.get_unchecked(..idx), self.v.get_unchecked(idx + 1..)) }; + let ret = Some(left); + self.v = right; ret } } @@ -491,8 +495,12 @@ where match self.v.iter().rposition(|x| (self.pred)(x)) { None => self.finish(), Some(idx) => { - let ret = Some(unsafe { self.v.get_unchecked(idx + 1..) }); - self.v = unsafe { self.v.get_unchecked(..idx) }; + let (left, right) = + // SAFETY: if v.iter().rposition returns Some(idx), then + // idx is definitely a valid index for v + unsafe { (self.v.get_unchecked(..idx), self.v.get_unchecked(idx + 1..)) }; + let ret = Some(right); + self.v = left; ret } }