// compile-flags: -Zmiri-strict-provenance #![feature(strict_provenance)] use std::mem; // This is the example from // . unsafe fn deref(left: *const u8, right: *const u8) { let left_int: usize = mem::transmute(left); //~ERROR expected plain (non-pointer) bytes let right_int: usize = mem::transmute(right); if left_int == right_int { // The compiler is allowed to replace `left_int` by `right_int` here... let left_ptr: *const u8 = mem::transmute(left_int); // ...which however means here it could be dereferencing the wrong pointer. let _val = *left_ptr; } } fn main() { let ptr1 = &0u8 as *const u8; let ptr2 = &1u8 as *const u8; unsafe { // Two pointers with the same address but different provenance. deref(ptr1, ptr2.with_addr(ptr1.addr())); } }