File tree 6 files changed +125
-0
lines changed
6 files changed +125
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Make sure we find these even with many checks disabled.
2
+ //@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation
3
+ #![ feature( core_intrinsics) ]
4
+ #![ feature( custom_mir) ]
5
+
6
+ use std:: intrinsics:: mir:: * ;
7
+
8
+ #[ custom_mir( dialect = "runtime" , phase = "optimized" ) ]
9
+ fn cast ( ptr : * const char ) -> u32 {
10
+ mir ! {
11
+ {
12
+ RET = * ptr as u32 ; //~ERROR: interpreting an invalid 32-bit value as a char
13
+ Return ( )
14
+ }
15
+ }
16
+ }
17
+
18
+ pub fn main ( ) {
19
+ let v = u32:: MAX ;
20
+ cast ( & v as * const u32 as * const char ) ;
21
+ }
Original file line number Diff line number Diff line change
1
+ error: Undefined Behavior: interpreting an invalid 32-bit value as a char: $HEX
2
+ --> $DIR/invalid_char_cast.rs:LL:CC
3
+ |
4
+ LL | RET = *ptr as u32;
5
+ | ^^^^^^^^^^^^^^^^^ interpreting an invalid 32-bit value as a char: $HEX
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 `cast` at $DIR/invalid_char_cast.rs:LL:CC
11
+ note: inside `main`
12
+ --> $DIR/invalid_char_cast.rs:LL:CC
13
+ |
14
+ LL | cast(&v as *const u32 as *const char);
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
+
Original file line number Diff line number Diff line change
1
+ // Make sure we find these even with many checks disabled.
2
+ //@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation
3
+ #![ feature( core_intrinsics) ]
4
+ #![ feature( custom_mir) ]
5
+
6
+ use std:: intrinsics:: mir:: * ;
7
+
8
+ #[ custom_mir( dialect = "runtime" , phase = "optimized" ) ]
9
+ fn switch_int ( ptr : * const char ) {
10
+ mir ! {
11
+ {
12
+ match * ptr { //~ERROR: interpreting an invalid 32-bit value as a char
13
+ '0' => ret,
14
+ _ => ret,
15
+ }
16
+ }
17
+ ret = {
18
+ Return ( )
19
+ }
20
+ }
21
+ }
22
+
23
+ pub fn main ( ) {
24
+ let v = u32:: MAX ;
25
+ switch_int ( & v as * const u32 as * const char ) ;
26
+ }
Original file line number Diff line number Diff line change
1
+ error: Undefined Behavior: interpreting an invalid 32-bit value as a char: $HEX
2
+ --> $DIR/invalid_char_match.rs:LL:CC
3
+ |
4
+ LL | / match *ptr {
5
+ LL | | '0' => ret,
6
+ LL | | _ => ret,
7
+ LL | | }
8
+ | |_____________^ interpreting an invalid 32-bit value as a char: $HEX
9
+ |
10
+ = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
11
+ = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
12
+ = note: BACKTRACE:
13
+ = note: inside `switch_int` at $DIR/invalid_char_match.rs:LL:CC
14
+ note: inside `main`
15
+ --> $DIR/invalid_char_match.rs:LL:CC
16
+ |
17
+ LL | switch_int(&v as *const u32 as *const char);
18
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
19
+
20
+ note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
21
+
22
+ error: aborting due to 1 previous error
23
+
Original file line number Diff line number Diff line change
1
+ // Make sure we find these even with many checks disabled.
2
+ //@compile-flags: -Zmiri-disable-alignment-check -Zmiri-disable-stacked-borrows -Zmiri-disable-validation
3
+
4
+ #[ derive( Copy , Clone ) ]
5
+ #[ allow( unused) ]
6
+ enum E { A , B , C }
7
+
8
+ fn cast ( ptr : * const E ) { unsafe {
9
+ let _val = * ptr as u32 ; //~ERROR: enum value has invalid tag
10
+ } }
11
+
12
+ pub fn main ( ) {
13
+ let v = u32:: MAX ;
14
+ cast ( & v as * const u32 as * const E ) ;
15
+ }
Original file line number Diff line number Diff line change
1
+ error: Undefined Behavior: enum value has invalid tag: 0xff
2
+ --> $DIR/invalid_enum_cast.rs:LL:CC
3
+ |
4
+ LL | let _val = *ptr as u32;
5
+ | ^^^^^^^^^^^ enum value has invalid tag: 0xff
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 `cast` at $DIR/invalid_enum_cast.rs:LL:CC
11
+ note: inside `main`
12
+ --> $DIR/invalid_enum_cast.rs:LL:CC
13
+ |
14
+ LL | cast(&v as *const u32 as *const E);
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