Here is the code in question:
fn use_mut(r: &mut i32) {
*r += 1;
let _ = &mut *r;
}
fn main() {
let r = &mut 5;
let p = r as *mut _;
use_mut(r);
use_mut(unsafe { &mut *p });
use_mut(r);
}
It seems like a pretty textbook case of UB - there are multiple mutable references to the data in the second call to use_mut. However, Miri does not report any errors, even with -Zmiri-track-raw-pointers enabled.
The strange thing is that if I write &mut *r in the main function (for example if I call use_mut the first time with use_mut(&mut *r)), Miri will detect UB (including without -Zmiri-track-raw-pointers), which really confuses me since I was under the impression that passing a mutable reference to a function will automatically reborrow it.
Am I just not understanding Stacked Borrows or is this a Miri bug?