File tree Expand file tree Collapse file tree 6 files changed +137
-0
lines changed
src/tools/miri/tests/fail/upvars Expand file tree Collapse file tree 6 files changed +137
-0
lines changed Original file line number Diff line number Diff line change 1+ // This test serves to document the change in semantics introduced by #138961.
2+ //
3+ // A corollary of partial-pattern.rs: while the tuple access showcases the
4+ // utility, it is actually the dereference performed by the pattern that
5+ // matters.
6+
7+ fn main ( ) {
8+ // the inner reference is dangling
9+ let x: & & u32 = unsafe {
10+ let x: u32 = 42 ;
11+ & & * & raw const x
12+ } ;
13+
14+ let _ = || { //~ ERROR: encountered a dangling reference
15+ match x {
16+ & & _y => { } ,
17+ }
18+ } ;
19+ }
Original file line number Diff line number Diff line change 1+ error: Undefined Behavior: constructing invalid value: encountered a dangling reference (use-after-free)
2+ --> tests/fail/upvars/deref-in-pattern.rs:LL:CC
3+ |
4+ LL | let _ = || {
5+ | _____________^
6+ LL | | match x {
7+ LL | | &&_y => {},
8+ LL | | }
9+ LL | | };
10+ | |_____^ constructing invalid value: encountered a dangling reference (use-after-free)
11+ |
12+ = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
13+ = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
14+ = note: BACKTRACE:
15+ = note: inside `main` at tests/fail/upvars/deref-in-pattern.rs:LL:CC
16+
17+ note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
18+
19+ error: aborting due to 1 previous error
20+
Original file line number Diff line number Diff line change 1+ // This test serves to document the change in semantics introduced by #138961.
2+ //
3+ // Previously, the closure would capture the entirety of x, and access *(*x).0
4+ // when called. Now, the closure only captures *(*x).0, which means that
5+ // a &*(*x).0 reborrow happens when the closure is constructed.
6+ //
7+ // Hence, if one of the references is dangling, this constitutes newly introduced UB
8+ // in the case where the closure doesn't get called. This isn't a big deal,
9+ // because why opsem only now considers this to be UB, the unsafe code
10+ // guidelines have long recommended against any handling of dangling references.
11+
12+ fn main ( ) {
13+ // the inner references are dangling
14+ let x: & ( & u32 , & u32 ) = unsafe {
15+ let a = 21 ;
16+ let b = 37 ;
17+ let ra = & * & raw const a;
18+ let rb = & * & raw const b;
19+ & ( ra, rb)
20+ } ;
21+
22+ let _ = || { //~ ERROR: encountered a dangling reference
23+ match x {
24+ ( & _y, _) => { } ,
25+ }
26+ } ;
27+ }
Original file line number Diff line number Diff line change 1+ error: Undefined Behavior: constructing invalid value: encountered a dangling reference (use-after-free)
2+ --> tests/fail/upvars/partial-pattern.rs:LL:CC
3+ |
4+ LL | let _ = || {
5+ | _____________^
6+ LL | | match x {
7+ LL | | (&_y, _) => {},
8+ LL | | }
9+ LL | | };
10+ | |_____^ constructing invalid value: encountered a dangling reference (use-after-free)
11+ |
12+ = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
13+ = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
14+ = note: BACKTRACE:
15+ = note: inside `main` at tests/fail/upvars/partial-pattern.rs:LL:CC
16+
17+ note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
18+
19+ error: aborting due to 1 previous error
20+
Original file line number Diff line number Diff line change 1+ // Motivated by #138961, this shows how invalid discriminants interact with
2+ // closure captures.
3+ #![ feature( never_type) ]
4+
5+ #[ repr( C ) ]
6+ #[ allow( dead_code) ]
7+ enum E {
8+ V0 , // discriminant: 0
9+ V1 , // 1
10+ V2 ( !) , // 2
11+ }
12+
13+ fn main ( ) {
14+ assert_eq ! ( std:: mem:: size_of:: <E >( ) , 4 ) ;
15+
16+ let val = 2u32 ;
17+ let ptr = ( & raw const val) . cast :: < E > ( ) ;
18+ let r = unsafe { & * ptr } ;
19+ let f = || {
20+ // After #138961, constructing the closure performs a reborrow of r.
21+ // Nevertheless, the discriminant is only actually inspected when the closure
22+ // is called.
23+ match r { //~ ERROR: read discriminant of an uninhabited enum variant
24+ E :: V0 => { }
25+ E :: V1 => { }
26+ E :: V2 ( _) => { }
27+ }
28+ } ;
29+
30+ f ( ) ;
31+ }
Original file line number Diff line number Diff line change 1+ error: Undefined Behavior: read discriminant of an uninhabited enum variant
2+ --> tests/fail/upvars/uninhabited-variant.rs:LL:CC
3+ |
4+ LL | match r {
5+ | ^ read discriminant of an uninhabited enum variant
6+ |
7+ = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
8+ = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
9+ = note: BACKTRACE:
10+ = note: inside closure at tests/fail/upvars/uninhabited-variant.rs:LL:CC
11+ note: inside `main`
12+ --> tests/fail/upvars/uninhabited-variant.rs:LL:CC
13+ |
14+ LL | f();
15+ | ^^^
16+
17+ note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
18+
19+ error: aborting due to 1 previous error
20+
You can’t perform that action at this time.
0 commit comments