Open
Description
What it does
See #12882 and rust-lang/rust#125897. When r: &mut T
, from_ref(r)
is equivalent to from_ref(r as &T)
. Thus, it will no longer be safe to later cast the resultant *const T
into a *mut T
. Instead, when r: &mut T
, the user should use from_mut(r).const_cast()
to get a *const T
.
Granted, it usually doesn't matter, as we usualy don't cast *const T
to *mut T
, but when we do, it matters a lot.
Advantage
This is safe:
let p = ptr::from_mut(r).const_cast();
...
let mut_p = p as *mut T;
Whereas this may not be safe:
let p = ptr::from_ref(r);
let mut_p = p as *mut T;
Drawbacks
None that I'm aware of.
Example
Original code:
use core::ptr;
fn main() {
let mut x = 123u8;
let r = &mut x;
let p = ptr::from_ref(r);
let p_mut = p as *mut T; // Potential UB from this point.
}
Improved code:
- let p = ptr::from_ref(r);
+ let p = ptr::from_mut(r).const_cast();