-
Notifications
You must be signed in to change notification settings - Fork 355
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #2523 - saethlin:protector-test, r=RalfJung
Add a protector test that demonstrates the base tag diagnostic Per #2519 (comment), this demonstrates this case for protector diagnostics: ``` help: <3131> was created here, as a base tag for alloc1623 --> tests/fail/stacked_borrows/invalidate_against_protector3.rs:10:19 | 10 | let ptr = std::alloc::alloc(std::alloc::Layout::for_value(&0i32)) as *mut i32; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``` This diagnostic is inspired by what Miri used to do with rust-lang/rust#60076 (comment)
- Loading branch information
Showing
3 changed files
with
46 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
tests/fail/stacked_borrows/invalidate_against_protector3.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
use std::alloc::{alloc, Layout}; | ||
|
||
fn inner(x: *mut i32, _y: &i32) { | ||
// If `x` and `y` alias, retagging is fine with this... but we really | ||
// shouldn't be allowed to write to `x` at all because `y` was assumed to be | ||
// immutable for the duration of this call. | ||
unsafe { *x = 0 }; //~ ERROR: protect | ||
} | ||
|
||
fn main() { | ||
unsafe { | ||
let ptr = alloc(Layout::for_value(&0i32)) as *mut i32; | ||
inner(ptr, &*ptr); | ||
}; | ||
} |
30 changes: 30 additions & 0 deletions
30
tests/fail/stacked_borrows/invalidate_against_protector3.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
error: Undefined Behavior: not granting access to tag <TAG> because that would remove [SharedReadOnly for <TAG>] which is protected because it is an argument of call ID | ||
--> $DIR/invalidate_against_protector3.rs:LL:CC | ||
| | ||
LL | unsafe { *x = 0 }; | ||
| ^^^^^^ not granting access to tag <TAG> because that would remove [SharedReadOnly for <TAG>] which is protected because it is an argument of 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 here, as the base tag for ALLOC | ||
--> $DIR/invalidate_against_protector3.rs:LL:CC | ||
| | ||
LL | let ptr = alloc(Layout::for_value(&0i32)) as *mut i32; | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
help: <TAG> is this argument | ||
--> $DIR/invalidate_against_protector3.rs:LL:CC | ||
| | ||
LL | fn inner(x: *mut i32, _y: &i32) { | ||
| ^^ | ||
= note: BACKTRACE: | ||
= note: inside `inner` at $DIR/invalidate_against_protector3.rs:LL:CC | ||
note: inside `main` at $DIR/invalidate_against_protector3.rs:LL:CC | ||
--> $DIR/invalidate_against_protector3.rs:LL:CC | ||
| | ||
LL | inner(ptr, &*ptr); | ||
| ^^^^^^^^^^^^^^^^^ | ||
|
||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace | ||
|
||
error: aborting due to previous error | ||
|