]> git.lizzy.rs Git - rust.git/commitdiff
Explain why zero-length slices require a non-null pointer
authorHenri Sivonen <hsivonen@hsivonen.fi>
Fri, 28 Apr 2017 09:25:02 +0000 (12:25 +0300)
committerHenri Sivonen <hsivonen@hsivonen.fi>
Fri, 28 Apr 2017 09:25:02 +0000 (12:25 +0300)
src/libcore/slice/mod.rs
src/libcore/str/mod.rs

index 87dfdfe57b65c77db0443d99ea6e7d46143c5089..9e3bd9115468ab22b8645ab1b14bb522da4c542d 100644 (file)
@@ -2354,7 +2354,10 @@ impl<'a, T> FusedIterator for ChunksMut<'a, T> {}
 /// valid for `len` elements, nor whether the lifetime inferred is a suitable
 /// lifetime for the returned slice.
 ///
-/// `p` must be non-null, even for zero-length slices.
+/// `p` must be non-null, even for zero-length slices, because non-zero bits
+/// are required to distinguish between a zero-length slice within `Some()`
+/// from `None`. `p` can be a bogus non-dereferencable pointer, such as `0x1`,
+/// for zero-length slices, though.
 ///
 /// # Caveat
 ///
@@ -2387,7 +2390,8 @@ pub unsafe fn from_raw_parts<'a, T>(p: *const T, len: usize) -> &'a [T] {
 ///
 /// This function is unsafe for the same reasons as `from_raw_parts`, as well
 /// as not being able to provide a non-aliasing guarantee of the returned
-/// mutable slice.
+/// mutable slice. `p` must be non-null even for zero-length slices as with
+/// `from_raw_parts`.
 #[inline]
 #[stable(feature = "rust1", since = "1.0.0")]
 pub unsafe fn from_raw_parts_mut<'a, T>(p: *mut T, len: usize) -> &'a mut [T] {
index 2ceef54ffed6a6ddd37535419ca26ab4043e6ab1..6b627430904847199b42ef7ef6490b41406c7d44 100644 (file)
@@ -319,7 +319,10 @@ pub fn from_utf8_mut(v: &mut [u8]) -> Result<&mut str, Utf8Error> {
 ///
 /// The data must be valid UTF-8
 ///
-/// `p` must be non-null, even for zero-length str.
+/// `p` must be non-null, even for zero-length strs, because non-zero bits
+/// are required to distinguish between a zero-length str within `Some()`
+/// from `None`. `p` can be a bogus non-dereferencable pointer, such as `0x1`,
+/// for zero-length strs, though.
 ///
 /// # Caveat
 ///