1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
#![forbid(unsafe_code)] use std::{io::{self, Write, Seek}, fs}; pub fn totally_safe_transmute<T, U>(v: T) -> U { #[repr(C)] enum E<T, U> { T(T), #[allow(dead_code)] U(U), } let v = E::T(v); let mut f = fs::OpenOptions::new() .write(true) .open("/proc/self/mem").expect("welp"); f.seek(io::SeekFrom::Start(&v as *const _ as u64)).expect("oof"); f.write(&[1]).expect("darn"); if let E::U(v) = v { return v; } panic!("rip"); } #[test] fn main() { let v: Vec<u8> = b"foo".to_vec(); let v: String = totally_safe_transmute(v); assert_eq!(&v, "foo"); }