diff options
| author | Ralf Jung <post@ralfj.de> | 2019-02-05 20:07:45 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2019-02-05 20:07:45 +0100 |
| commit | 346dc37aee60f995e6c1548ce7f406d5500f8570 (patch) | |
| tree | 4e7087a94a2b084d459a7034990762da93e5aa1d | |
| parent | d30b99f9c23f8e1d6ef993cc94da96510ad709b3 (diff) | |
| download | rust-346dc37aee60f995e6c1548ce7f406d5500f8570.tar.gz rust-346dc37aee60f995e6c1548ce7f406d5500f8570.zip | |
fix str mutating through a ptr derived from &self
| -rw-r--r-- | src/libcore/str/mod.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index 3cb39360380..b01cb688ee5 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -1757,7 +1757,7 @@ mod traits { } #[inline] unsafe fn get_unchecked_mut(self, slice: &mut str) -> &mut Self::Output { - let ptr = slice.as_ptr().add(self.start); + let ptr = slice.as_mut_ptr().add(self.start); let len = self.end - self.start; super::from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr as *mut u8, len)) } @@ -1821,7 +1821,7 @@ mod traits { } #[inline] unsafe fn get_unchecked_mut(self, slice: &mut str) -> &mut Self::Output { - let ptr = slice.as_ptr(); + let ptr = slice.as_mut_ptr(); super::from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr as *mut u8, self.end)) } #[inline] @@ -1883,7 +1883,7 @@ mod traits { } #[inline] unsafe fn get_unchecked_mut(self, slice: &mut str) -> &mut Self::Output { - let ptr = slice.as_ptr().add(self.start); + let ptr = slice.as_mut_ptr().add(self.start); let len = slice.len() - self.start; super::from_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr as *mut u8, len)) } @@ -2213,6 +2213,22 @@ impl str { self as *const str as *const u8 } + /// Converts a mutable string slice to a raw pointer. + /// + /// As string slices are a slice of bytes, the raw pointer points to a + /// [`u8`]. This pointer will be pointing to the first byte of the string + /// slice. + /// + /// It is your responsibility to make sure that the string slice only gets + /// modified in a way that it remains valid UTF-8. + /// + /// [`u8`]: primitive.u8.html + #[unstable(feature = "str_as_mut_ptr", issue = "0")] + #[inline] + pub fn as_mut_ptr(&mut self) -> *mut u8 { + self as *mut str as *mut u8 + } + /// Returns a subslice of `str`. /// /// This is the non-panicking alternative to indexing the `str`. Returns |
