add test for nasty example
This commit is contained in:
parent
1d79b60a1e
commit
3dcba56349
27
tests/compile-fail/strict_provenance_transmute.rs
Normal file
27
tests/compile-fail/strict_provenance_transmute.rs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// compile-flags: -Zmiri-strict-provenance
|
||||||
|
#![feature(strict_provenance)]
|
||||||
|
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
|
// This is the example from
|
||||||
|
// <https://github.com/rust-lang/unsafe-code-guidelines/issues/286#issuecomment-1085144431>.
|
||||||
|
|
||||||
|
unsafe fn deref(left: *const u8, right: *const u8) {
|
||||||
|
let left_int: usize = mem::transmute(left); //~ERROR expected initialized 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()));
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user