]> git.lizzy.rs Git - rust.git/commitdiff
Remove last use of mem::uninitialized from std::io::util
authornathanwhit <nathan.whitaker01@gmail.com>
Tue, 16 Jul 2019 19:41:43 +0000 (15:41 -0400)
committernathanwhit <nathan.whitaker01@gmail.com>
Wed, 17 Jul 2019 02:41:38 +0000 (22:41 -0400)
src/libstd/io/util.rs

index 2bfd3e4ad20e3d29170370a849b4705ccfa3f0f5..1efccb53b7551f35864f42a1283e33f560e2a7e5 100644 (file)
@@ -44,10 +44,15 @@ pub fn copy<R: ?Sized, W: ?Sized>(reader: &mut R, writer: &mut W) -> io::Result<
     where R: Read, W: Write
 {
     let mut buf = unsafe {
-        #[allow(deprecated)]
-        let mut buf: [u8; super::DEFAULT_BUF_SIZE] = mem::uninitialized();
-        reader.initializer().initialize(&mut buf);
-        buf
+        // This is still technically undefined behavior due to creating a reference
+        // to uninitialized data, but within libstd we can rely on more guarantees
+        // than if this code were in an external lib
+
+        // FIXME: This should probably be changed to an array of `MaybeUninit<u8>`
+        // once the `mem::MaybeUninit` slice APIs stabilize
+        let mut buf: mem::MaybeUninit<[u8; super::DEFAULT_BUF_SIZE]> = mem::MaybeUninit::uninit();
+        reader.initializer().initialize(&mut *buf.as_mut_ptr());
+        buf.assume_init()
     };
 
     let mut written = 0;