rust/tests/compile-fail/stacked_borrows/pointer_smuggling.rs

23 lines
576 B
Rust

#![allow(unused_variables)]
static mut PTR: *mut u8 = 0 as *mut _;
fn fun1(x: &mut u8) {
unsafe {
PTR = x;
}
}
fn fun2() {
// Now we use a pointer we are not allowed to use
let _x = unsafe { *PTR };
}
fn main() {
let val = &mut 0; // FIXME: This should also work with a local variable, but currently it does not.
fun1(val);
*val = 2; // this invalidates any raw ptrs `fun1` might have created.
fun2(); // if they now use a raw ptr they break our reference
*val = 3; //~ ERROR Mut reference with non-reactivatable tag Mut(Uniq
}