From 14f4ffae3224a7846c6bab33f9ca8593ec7416cf Mon Sep 17 00:00:00 2001 From: Ben Kimock Date: Wed, 8 Dec 2021 17:55:50 -0500 Subject: [PATCH] Use spare_capacity_mut instead of invalid unchecked indexing --- library/alloc/src/str.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/library/alloc/src/str.rs b/library/alloc/src/str.rs index 104f5556566f4..69495f31c32ca 100644 --- a/library/alloc/src/str.rs +++ b/library/alloc/src/str.rs @@ -178,12 +178,20 @@ where unsafe { let pos = result.len(); - let target = result.get_unchecked_mut(pos..reserved_len); + let target = result.spare_capacity_mut().get_unchecked_mut(..reserved_len - pos); + + // Convert the separator and slices to slices of MaybeUninit + // to simplify implementation in specialize_for_lengths + let sep_uninit = core::slice::from_raw_parts(sep.as_ptr().cast(), sep.len()); + let iter_uninit = iter.map(|it| { + let it = it.borrow().as_ref(); + core::slice::from_raw_parts(it.as_ptr().cast(), it.len()) + }); // copy separator and slices over without bounds checks // generate loops with hardcoded offsets for small separators // massive improvements possible (~ x2) - let remain = specialize_for_lengths!(sep, target, iter; 0, 1, 2, 3, 4); + let remain = specialize_for_lengths!(sep_uninit, target, iter_uninit; 0, 1, 2, 3, 4); // A weird borrow implementation may return different // slices for the length calculation and the actual copy.