4eff60ad6e
stacked_borrow now has an item module, and its own FrameExtra. These serve to protect the implementation of Item (which is a bunch of bit-packing tricks) from the primary logic of Stacked Borrows, and the FrameExtra we have separates Stacked Borrows more cleanly from the interpreter itself. The new strategy for checking protectors also makes some subtle performance tradeoffs, so they are now documented in Stack::item_popped because that function primarily benefits from them, and it also touches every aspect of them. Also separating the actual CallId that is protecting a Tag from the Tag makes it inconvienent to reproduce exactly the same protector errors, so this also takes the opportunity to use some slightly cleaner English in those errors. We need to make some change, might as well make it good.
41 lines
1.8 KiB
Plaintext
41 lines
1.8 KiB
Plaintext
error: Undefined Behavior: not granting access to tag <TAG> because incompatible item [SharedReadOnly for <TAG>] is protected by call ID
|
|
--> $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
|
|
|
LL | unsafe { *x = 0 };
|
|
| ^^^^^^ not granting access to tag <TAG> because incompatible item [SharedReadOnly for <TAG>] is protected by call ID
|
|
|
|
|
= help: this indicates a potential bug in the program: it performed an invalid operation, but the Stacked Borrows rules it violated are still experimental
|
|
= help: see https://github.com/rust-lang/unsafe-code-guidelines/blob/master/wip/stacked-borrows.md for further information
|
|
help: <TAG> was created by a retag at offsets [0x0..0x4]
|
|
--> $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
|
|
|
LL | let xraw = &mut x as *mut _;
|
|
| ^^^^^^
|
|
help: <TAG> was protected due to <TAG> which was created here
|
|
--> $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
|
|
|
LL | inner(xraw, xref);
|
|
| ^^^^
|
|
help: this protector is live for this call
|
|
--> $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
|
|
|
LL | / fn inner(x: *mut i32, _y: &i32) {
|
|
LL | | // If `x` and `y` alias, retagging is fine with this... but we really
|
|
LL | | // shouldn't be allowed to write to `x` at all because `y` was assumed to be
|
|
LL | | // immutable for the duration of this call.
|
|
LL | | unsafe { *x = 0 };
|
|
LL | | }
|
|
| |_^
|
|
= note: backtrace:
|
|
= note: inside `inner` at $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
note: inside `main` at $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
--> $DIR/invalidate_against_barrier2.rs:LL:CC
|
|
|
|
|
LL | inner(xraw, xref);
|
|
| ^^^^^^^^^^^^^^^^^
|
|
|
|
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
|
|
|
|
error: aborting due to previous error
|
|
|