Skip to content

Commit

Permalink
Auto merge of #1468 - RalfJung:uninit-validation, r=RalfJung
Browse files Browse the repository at this point in the history
Test uninit memory validation

This adds the tests for rust-lang/rust#74059.
  • Loading branch information
bors committed Jul 7, 2020
2 parents 9755137 + 04019ee commit 5e94f57
Show file tree
Hide file tree
Showing 7 changed files with 303 additions and 3 deletions.
2 changes: 1 addition & 1 deletion rust-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
9491f18c5de3ff1c4bf9c3fdacf52d9859e26f7c
e1beee4992ad4b235fc700bf7af1ee86f894ea53
10 changes: 10 additions & 0 deletions tests/compile-fail/validity/invalid_bool_uninit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![allow(invalid_value)]

union MyUninit {
init: (),
uninit: bool,
}

fn main() {
let _b = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes, but expected a boolean
}
10 changes: 10 additions & 0 deletions tests/compile-fail/validity/invalid_char_uninit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![allow(invalid_value)]

union MyUninit {
init: (),
uninit: char,
}

fn main() {
let _b = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes, but expected a valid unicode scalar value (in `0..=0x10FFFF` but not in `0xD800..=0xDFFF`)
}
2 changes: 1 addition & 1 deletion tests/compile-fail/validity/invalid_enum_tag.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ pub enum Foo {
}

fn main() {
let _f = unsafe { std::mem::transmute::<i32, Foo>(42) }; //~ ERROR encountered 0x0000002a, but expected a valid enum tag
let _f = unsafe { std::mem::transmute::<i32, Foo>(42) }; //~ ERROR encountered 0x0000002a at .<enum-tag>, but expected a valid enum tag
}
270 changes: 270 additions & 0 deletions tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
#![allow(unused, deprecated, invalid_value)]

#[derive(Copy, Clone)]
enum A {
A0,
A1,
A2,
A3,
A4,
A5,
A6,
A7,
A8,
A9,
A10,
A11,
A12,
A13,
A14,
A15,
A16,
A17,
A18,
A19,
A20,
A21,
A22,
A23,
A24,
A25,
A26,
A27,
A28,
A29,
A30,
A31,
A32,
A33,
A34,
A35,
A36,
A37,
A38,
A39,
A40,
A41,
A42,
A43,
A44,
A45,
A46,
A47,
A48,
A49,
A50,
A51,
A52,
A53,
A54,
A55,
A56,
A57,
A58,
A59,
A60,
A61,
A62,
A63,
A64,
A65,
A66,
A67,
A68,
A69,
A70,
A71,
A72,
A73,
A74,
A75,
A76,
A77,
A78,
A79,
A80,
A81,
A82,
A83,
A84,
A85,
A86,
A87,
A88,
A89,
A90,
A91,
A92,
A93,
A94,
A95,
A96,
A97,
A98,
A99,
A100,
A101,
A102,
A103,
A104,
A105,
A106,
A107,
A108,
A109,
A110,
A111,
A112,
A113,
A114,
A115,
A116,
A117,
A118,
A119,
A120,
A121,
A122,
A123,
A124,
A125,
A126,
A127,
A128,
A129,
A130,
A131,
A132,
A133,
A134,
A135,
A136,
A137,
A138,
A139,
A140,
A141,
A142,
A143,
A144,
A145,
A146,
A147,
A148,
A149,
A150,
A151,
A152,
A153,
A154,
A155,
A156,
A157,
A158,
A159,
A160,
A161,
A162,
A163,
A164,
A165,
A166,
A167,
A168,
A169,
A170,
A171,
A172,
A173,
A174,
A175,
A176,
A177,
A178,
A179,
A180,
A181,
A182,
A183,
A184,
A185,
A186,
A187,
A188,
A189,
A190,
A191,
A192,
A193,
A194,
A195,
A196,
A197,
A198,
A199,
A200,
A201,
A202,
A203,
A204,
A205,
A206,
A207,
A208,
A209,
A210,
A211,
A212,
A213,
A214,
A215,
A216,
A217,
A218,
A219,
A220,
A221,
A222,
A223,
A224,
A225,
A226,
A227,
A228,
A229,
A230,
A231,
A232,
A233,
A234,
A235,
A236,
A237,
A238,
A239,
A240,
A241,
A242,
A243,
A244,
A245,
A246,
A247,
A248,
A249,
A250,
A251,
A252,
A253,
A254,
A255,
}

union MyUninit {
init: (),
uninit: A,
}

fn main() {
let _a = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes at .<enum-tag>, but expected a valid enum tag
}
10 changes: 10 additions & 0 deletions tests/compile-fail/validity/invalid_fnptr_uninit.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#![allow(invalid_value)]

union MyUninit {
init: (),
uninit: fn(),
}

fn main() {
let _b = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes, but expected a function pointer
}
2 changes: 1 addition & 1 deletion tests/compile-fail/validity/transmute_through_ptr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ fn main() {
let mut x = Bool::True;
evil(&mut x);
let _y = x; // reading this ought to be enough to trigger validation
//~^ ERROR encountered 0x0000002c, but expected a valid enum tag
//~^ ERROR encountered 0x0000002c at .<enum-tag>, but expected a valid enum tag
}

0 comments on commit 5e94f57

Please sign in to comment.