| // This should fail even without validation |
| //@compile-flags: -Zmiri-disable-validation -Zmiri-permissive-provenance |
| |
| static mut LEAK: usize = 0; |
| |
| fn fill(v: &mut i32) { |
| unsafe { |
| LEAK = v as *mut _ as usize; |
| } |
| } |
| |
| fn evil() { |
| let _ref = unsafe { &mut *(LEAK as *mut i32) }; //~ ERROR: is a dangling pointer |
| } |
| |
| fn main() { |
| let _y; |
| { |
| let mut x = 0i32; |
| fill(&mut x); |
| _y = x; |
| } |
| // Now we use a pointer to `x` which is no longer in scope, and thus dead (even though the |
| // `main` stack frame still exists). We even try going through a `usize` for extra sneakiness! |
| evil(); |
| } |