| use std::mem; | |
| fn leak<T>(mut b: Box<T>) -> &'static mut T { | |
| // isn't this supposed to be safe? | |
| let inner = &mut *b as *mut _; | |
| mem::forget(b); | |
| unsafe { &mut *inner } | |
| } | |
| fn evil(mut s: &'static mut String) | |
| { | |
| // create alias | |
| let alias: &'static mut String = s; | |
| let inner: &str = &alias; | |
| // free value | |
| *s = String::new(); //~ ERROR cannot assign | |
| let _spray = "0wned".to_owned(); | |
| // ... and then use it | |
| println!("{}", inner); | |
| } | |
| fn main() { | |
| evil(leak(Box::new("hello".to_owned()))); | |
| } |