lib: replace some mem::forget
's with ManuallyDrop
This commit is contained in:
parent
594702ebb5
commit
f6fe7e49a2
20 changed files with 87 additions and 131 deletions
|
@ -8,7 +8,7 @@ use crate::fmt;
|
|||
use crate::fs;
|
||||
use crate::io;
|
||||
use crate::marker::PhantomData;
|
||||
use crate::mem::forget;
|
||||
use crate::mem::ManuallyDrop;
|
||||
#[cfg(not(any(target_arch = "wasm32", target_env = "sgx", target_os = "hermit")))]
|
||||
use crate::sys::cvt;
|
||||
use crate::sys_common::{AsInner, FromInner, IntoInner};
|
||||
|
@ -141,9 +141,7 @@ impl AsRawFd for OwnedFd {
|
|||
impl IntoRawFd for OwnedFd {
|
||||
#[inline]
|
||||
fn into_raw_fd(self) -> RawFd {
|
||||
let fd = self.fd;
|
||||
forget(self);
|
||||
fd
|
||||
ManuallyDrop::new(self).fd
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
use crate::fmt;
|
||||
use crate::marker::PhantomData;
|
||||
use crate::mem::forget;
|
||||
use crate::mem::ManuallyDrop;
|
||||
use crate::net;
|
||||
use crate::sys;
|
||||
use crate::sys_common::{self, AsInner, FromInner, IntoInner};
|
||||
|
@ -149,9 +149,7 @@ impl AsRawFd for OwnedFd {
|
|||
impl IntoRawFd for OwnedFd {
|
||||
#[inline]
|
||||
fn into_raw_fd(self) -> RawFd {
|
||||
let fd = self.fd;
|
||||
forget(self);
|
||||
fd
|
||||
ManuallyDrop::new(self).fd
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ use crate::fmt;
|
|||
use crate::fs;
|
||||
use crate::io;
|
||||
use crate::marker::PhantomData;
|
||||
use crate::mem::{forget, ManuallyDrop};
|
||||
use crate::mem::ManuallyDrop;
|
||||
use crate::ptr;
|
||||
use crate::sys;
|
||||
use crate::sys::cvt;
|
||||
|
@ -319,9 +319,7 @@ impl AsRawHandle for OwnedHandle {
|
|||
impl IntoRawHandle for OwnedHandle {
|
||||
#[inline]
|
||||
fn into_raw_handle(self) -> RawHandle {
|
||||
let handle = self.handle;
|
||||
forget(self);
|
||||
handle
|
||||
ManuallyDrop::new(self).handle
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,8 +6,7 @@ use super::raw::{AsRawSocket, FromRawSocket, IntoRawSocket, RawSocket};
|
|||
use crate::fmt;
|
||||
use crate::io;
|
||||
use crate::marker::PhantomData;
|
||||
use crate::mem;
|
||||
use crate::mem::forget;
|
||||
use crate::mem::{self, ManuallyDrop};
|
||||
use crate::sys;
|
||||
#[cfg(not(target_vendor = "uwp"))]
|
||||
use crate::sys::cvt;
|
||||
|
@ -191,9 +190,7 @@ impl AsRawSocket for OwnedSocket {
|
|||
impl IntoRawSocket for OwnedSocket {
|
||||
#[inline]
|
||||
fn into_raw_socket(self) -> RawSocket {
|
||||
let socket = self.socket;
|
||||
forget(self);
|
||||
socket
|
||||
ManuallyDrop::new(self).socket
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
use super::hermit_abi;
|
||||
use crate::ffi::CStr;
|
||||
use crate::io;
|
||||
use crate::mem;
|
||||
use crate::mem::ManuallyDrop;
|
||||
use crate::num::NonZero;
|
||||
use crate::ptr;
|
||||
use crate::time::Duration;
|
||||
|
@ -90,9 +90,7 @@ impl Thread {
|
|||
|
||||
#[inline]
|
||||
pub fn into_id(self) -> Tid {
|
||||
let id = self.tid;
|
||||
mem::forget(self);
|
||||
id
|
||||
ManuallyDrop::new(self).tid
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -95,8 +95,8 @@ impl Tls {
|
|||
#[allow(unused)]
|
||||
pub unsafe fn activate_persistent(self: Box<Self>) {
|
||||
// FIXME: Needs safety information. See entry.S for `set_tls_ptr` definition.
|
||||
unsafe { set_tls_ptr(core::ptr::addr_of!(*self) as _) };
|
||||
mem::forget(self);
|
||||
let ptr = Box::into_raw(self).cast_const().cast::<u8>();
|
||||
unsafe { set_tls_ptr(ptr) };
|
||||
}
|
||||
|
||||
unsafe fn current<'a>() -> &'a Tls {
|
||||
|
|
|
@ -5,7 +5,7 @@ use crate::cell::UnsafeCell;
|
|||
use crate::cmp;
|
||||
use crate::convert::TryInto;
|
||||
use crate::intrinsics;
|
||||
use crate::mem;
|
||||
use crate::mem::{self, ManuallyDrop};
|
||||
use crate::ops::{CoerceUnsized, Deref, DerefMut, Index, IndexMut};
|
||||
use crate::ptr::{self, NonNull};
|
||||
use crate::slice;
|
||||
|
@ -176,6 +176,7 @@ unsafe impl<T: UserSafeSized> UserSafe for [T] {
|
|||
/// are used solely to indicate intent: a mutable reference is for writing to
|
||||
/// user memory, an immutable reference for reading from user memory.
|
||||
#[unstable(feature = "sgx_platform", issue = "56975")]
|
||||
#[repr(transparent)]
|
||||
pub struct UserRef<T: ?Sized>(UnsafeCell<T>);
|
||||
/// An owned type in userspace memory. `User<T>` is equivalent to `Box<T>` in
|
||||
/// enclave memory. Access to the memory is only allowed by copying to avoid
|
||||
|
@ -266,9 +267,7 @@ where
|
|||
/// Converts this value into a raw pointer. The value will no longer be
|
||||
/// automatically freed.
|
||||
pub fn into_raw(self) -> *mut T {
|
||||
let ret = self.0;
|
||||
mem::forget(self);
|
||||
ret.as_ptr() as _
|
||||
ManuallyDrop::new(self).0.as_ptr() as _
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ use fortanix_sgx_abi::Fd;
|
|||
|
||||
use super::abi::usercalls;
|
||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut};
|
||||
use crate::mem;
|
||||
use crate::mem::ManuallyDrop;
|
||||
use crate::sys::{AsInner, FromInner, IntoInner};
|
||||
|
||||
#[derive(Debug)]
|
||||
|
@ -21,9 +21,7 @@ impl FileDesc {
|
|||
|
||||
/// Extracts the actual file descriptor without closing it.
|
||||
pub fn into_raw(self) -> Fd {
|
||||
let fd = self.fd;
|
||||
mem::forget(self);
|
||||
fd
|
||||
ManuallyDrop::new(self).fd
|
||||
}
|
||||
|
||||
pub fn read(&self, buf: &mut [u8]) -> io::Result<usize> {
|
||||
|
@ -70,9 +68,7 @@ impl AsInner<Fd> for FileDesc {
|
|||
|
||||
impl IntoInner<Fd> for FileDesc {
|
||||
fn into_inner(self) -> Fd {
|
||||
let fd = self.fd;
|
||||
mem::forget(self);
|
||||
fd
|
||||
ManuallyDrop::new(self).fd
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
use core::convert::TryInto;
|
||||
|
||||
use crate::cmp;
|
||||
use crate::ffi::CStr;
|
||||
use crate::io;
|
||||
use crate::mem;
|
||||
use crate::mem::{self, ManuallyDrop};
|
||||
use crate::num::NonZero;
|
||||
use crate::ptr;
|
||||
use crate::sys::os;
|
||||
|
@ -113,11 +111,9 @@ impl Thread {
|
|||
|
||||
/// must join, because no pthread_detach supported
|
||||
pub fn join(self) {
|
||||
unsafe {
|
||||
let ret = libc::pthread_join(self.id, ptr::null_mut());
|
||||
mem::forget(self);
|
||||
assert!(ret == 0, "failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
let id = self.into_id();
|
||||
let ret = unsafe { libc::pthread_join(id, ptr::null_mut()) };
|
||||
assert!(ret == 0, "failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
|
||||
pub fn id(&self) -> libc::pthread_t {
|
||||
|
@ -125,9 +121,7 @@ impl Thread {
|
|||
}
|
||||
|
||||
pub fn into_id(self) -> libc::pthread_t {
|
||||
let id = self.id;
|
||||
mem::forget(self);
|
||||
id
|
||||
ManuallyDrop::new(self).id
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use crate::cmp;
|
||||
use crate::ffi::CStr;
|
||||
use crate::io;
|
||||
use crate::mem;
|
||||
use crate::mem::{self, ManuallyDrop};
|
||||
use crate::num::NonZero;
|
||||
use crate::ptr;
|
||||
use crate::sys::{os, stack_overflow};
|
||||
|
@ -268,11 +268,9 @@ impl Thread {
|
|||
}
|
||||
|
||||
pub fn join(self) {
|
||||
unsafe {
|
||||
let ret = libc::pthread_join(self.id, ptr::null_mut());
|
||||
mem::forget(self);
|
||||
assert!(ret == 0, "failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
let id = self.into_id();
|
||||
let ret = unsafe { libc::pthread_join(id, ptr::null_mut()) };
|
||||
assert!(ret == 0, "failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
|
||||
pub fn id(&self) -> libc::pthread_t {
|
||||
|
@ -280,9 +278,7 @@ impl Thread {
|
|||
}
|
||||
|
||||
pub fn into_id(self) -> libc::pthread_t {
|
||||
let id = self.id;
|
||||
mem::forget(self);
|
||||
id
|
||||
ManuallyDrop::new(self).id
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -172,12 +172,10 @@ impl Thread {
|
|||
pub fn join(self) {
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(target_feature = "atomics")] {
|
||||
unsafe {
|
||||
let ret = libc::pthread_join(self.id, ptr::null_mut());
|
||||
mem::forget(self);
|
||||
if ret != 0 {
|
||||
rtabort!("failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
let id = mem::ManuallyDrop::new(self).id;
|
||||
let ret = unsafe { libc::pthread_join(id, ptr::null_mut()) };
|
||||
if ret != 0 {
|
||||
rtabort!("failed to join thread: {}", io::Error::from_raw_os_error(ret));
|
||||
}
|
||||
} else {
|
||||
self.0
|
||||
|
|
|
@ -165,7 +165,7 @@ use crate::ffi::{CStr, CString};
|
|||
use crate::fmt;
|
||||
use crate::io;
|
||||
use crate::marker::PhantomData;
|
||||
use crate::mem::{self, forget};
|
||||
use crate::mem::{self, forget, ManuallyDrop};
|
||||
use crate::num::NonZero;
|
||||
use crate::panic;
|
||||
use crate::panicking;
|
||||
|
@ -514,11 +514,10 @@ impl Builder {
|
|||
MaybeDangling(mem::MaybeUninit::new(x))
|
||||
}
|
||||
fn into_inner(self) -> T {
|
||||
// SAFETY: we are always initialized.
|
||||
let ret = unsafe { self.0.assume_init_read() };
|
||||
// Make sure we don't drop.
|
||||
mem::forget(self);
|
||||
ret
|
||||
let this = ManuallyDrop::new(self);
|
||||
// SAFETY: we are always initialized.
|
||||
unsafe { this.0.assume_init_read() }
|
||||
}
|
||||
}
|
||||
impl<T> Drop for MaybeDangling<T> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue