forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
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 rust-lang#2537 - saethlin:dont-back-up-too-far, r=RalfJung
Don't back up past the caller when looking for an FnEntry span Fixes rust-lang/miri#2536 This adds a fix for the logic as well as a regression test. In the new test `tests/fail/stacked_borrows/fnentry_invalidation2.rs`, before this PR, we display this diagnostic: ``` help: <3278> was later invalidated at offsets [0x0..0xc] by a Unique FnEntry retag --> tests/fail/stacked_borrows/fnentry_invalidation2.rs:13:5 | 13 | inner(&mut t); | ^^^^^^^^^^^^^ ``` Which is very misleading. It is not this call itself, but what happens within the call that invalidates the tag we want. With this PR, we get: ``` help: <2798> was later invalidated at offsets [0x0..0xc] by a Unique FnEntry retag inside this call --> tests/fail/stacked_borrows/fnentry_invalidation2.rs:20:13 | 20 | let _ = t.sli.as_mut_ptr(); | ^^^^^^^^^^^^^^^^^^ ``` Which is much better.
- Loading branch information
Showing
6 changed files
with
77 additions
and
19 deletions.
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
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
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
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
21 changes: 21 additions & 0 deletions
21
src/tools/miri/tests/fail/stacked_borrows/fnentry_invalidation2.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,21 @@ | ||
// Regression test for https://github.com/rust-lang/miri/issues/2536 | ||
// This tests that we don't try to back too far up the stack when selecting a span to report. | ||
// We should display the as_mut_ptr() call as the location of the invalidation, not the call to | ||
// inner | ||
|
||
struct Thing<'a> { | ||
sli: &'a mut [i32], | ||
} | ||
|
||
fn main() { | ||
let mut t = Thing { sli: &mut [0, 1, 2] }; | ||
let ptr = t.sli.as_ptr(); | ||
inner(&mut t); | ||
unsafe { | ||
let _oof = *ptr; //~ ERROR: /read access .* tag does not exist in the borrow stack/ | ||
} | ||
} | ||
|
||
fn inner(t: &mut Thing) { | ||
let _ = t.sli.as_mut_ptr(); | ||
} |
28 changes: 28 additions & 0 deletions
28
src/tools/miri/tests/fail/stacked_borrows/fnentry_invalidation2.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,28 @@ | ||
error: Undefined Behavior: attempting a read access using <TAG> at ALLOC[0x0], but that tag does not exist in the borrow stack for this location | ||
--> $DIR/fnentry_invalidation2.rs:LL:CC | ||
| | ||
LL | let _oof = *ptr; | ||
| ^^^^ | ||
| | | ||
| attempting a read access using <TAG> at ALLOC[0x0], but that tag does not exist in the borrow stack for this location | ||
| this error occurs as part of an access at ALLOC[0x0..0x4] | ||
| | ||
= 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 SharedReadOnly retag at offsets [0x0..0xc] | ||
--> $DIR/fnentry_invalidation2.rs:LL:CC | ||
| | ||
LL | let ptr = t.sli.as_ptr(); | ||
| ^^^^^^^^^^^^^^ | ||
help: <TAG> was later invalidated at offsets [0x0..0xc] by a Unique FnEntry retag inside this call | ||
--> $DIR/fnentry_invalidation2.rs:LL:CC | ||
| | ||
LL | let _ = t.sli.as_mut_ptr(); | ||
| ^^^^^^^^^^^^^^^^^^ | ||
= note: BACKTRACE: | ||
= note: inside `main` at $DIR/fnentry_invalidation2.rs:LL:CC | ||
|
||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace | ||
|
||
error: aborting due to previous error | ||
|