Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2865128

Browse files
authoredFeb 12, 2023
Rollup merge of rust-lang#107954 - RalfJung:tree-borrows-fix, r=m-ou-se
avoid mixing accesses of ptrs derived from a mutable ref and parent ptrs `@Vanille-N` is working on a successor for Stacked Borrows. It will mostly accept strictly more code than Stacked Borrows did, with one exception: the following pattern no longer works. ```rust let mut root = 6u8; let mref = &mut root; let ptr = mref as *mut u8; *ptr = 0; // Write assert_eq!(root, 0); // Parent Read *ptr = 0; // Attempted Write ``` This worked in Stacked Borrows kind of by accident: when doing the "parent read", under SB we Disable `mref`, but the raw ptrs derived from it remain usable. The fact that we can still use the "children" of a reference that is no longer usable is quite nasty and leads to some undesirable effects (in particular it is the major blocker for resolving rust-lang/unsafe-code-guidelines#257). So in Tree Borrows we no longer do that; instead, reading from `root` makes `mref` and all its children read-only. Due to other improvements in Tree Borrows, the entire Miri test suite still passes with this new behavior, and even the entire libcore and liballoc test suite, except for these 2 cases this PR fixes. Both of these involve code where the programmer wrote `&mut` but then used pointers derived from that reference in ways that alias with the parent pointer, which arguably is violating uniqueness. They are fixed by properly using raw pointers throughout.
2 parents cd1b6d0 + c3a2e7a commit 2865128

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed
 

‎library/core/tests/ptr.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ fn test() {
2525
snd: isize,
2626
}
2727
let mut p = Pair { fst: 10, snd: 20 };
28-
let pptr: *mut Pair = &mut p;
28+
let pptr: *mut Pair = addr_of_mut!(p);
2929
let iptr: *mut isize = pptr as *mut isize;
3030
assert_eq!(*iptr, 10);
3131
*iptr = 30;
@@ -1070,8 +1070,8 @@ fn swap_copy_untyped() {
10701070
let mut x = 5u8;
10711071
let mut y = 6u8;
10721072

1073-
let ptr1 = &mut x as *mut u8 as *mut bool;
1074-
let ptr2 = &mut y as *mut u8 as *mut bool;
1073+
let ptr1 = addr_of_mut!(x).cast::<bool>();
1074+
let ptr2 = addr_of_mut!(y).cast::<bool>();
10751075

10761076
unsafe {
10771077
ptr::swap(ptr1, ptr2);

0 commit comments

Comments
 (0)
Please sign in to comment.