Skip to content

Commit 3dcba56

Browse files
committed
add test for nasty example
1 parent 1d79b60 commit 3dcba56

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// compile-flags: -Zmiri-strict-provenance
2+
#![feature(strict_provenance)]
3+
4+
use std::mem;
5+
6+
// This is the example from
7+
// <https://github.com/rust-lang/unsafe-code-guidelines/issues/286#issuecomment-1085144431>.
8+
9+
unsafe fn deref(left: *const u8, right: *const u8) {
10+
let left_int: usize = mem::transmute(left); //~ERROR expected initialized plain (non-pointer) bytes
11+
let right_int: usize = mem::transmute(right);
12+
if left_int == right_int {
13+
// The compiler is allowed to replace `left_int` by `right_int` here...
14+
let left_ptr: *const u8 = mem::transmute(left_int);
15+
// ...which however means here it could be dereferencing the wrong pointer.
16+
let _val = *left_ptr;
17+
}
18+
}
19+
20+
fn main() {
21+
let ptr1 = &0u8 as *const u8;
22+
let ptr2 = &1u8 as *const u8;
23+
unsafe {
24+
// Two pointers with the same address but different provenance.
25+
deref(ptr1, ptr2.with_addr(ptr1.addr()));
26+
}
27+
}

0 commit comments

Comments
 (0)