From 28b44d970c0b58a7e4d683580ecee4bf9c8cb073 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 5 Jul 2020 12:53:00 +0200 Subject: [PATCH 1/3] test validation of uninit memory (used to ICE) --- .../validity/invalid_bool_uninit.rs | 10 + .../validity/invalid_char_uninit.rs | 10 + .../invalid_enum_tag_256variants_uninit.rs | 270 ++++++++++++++++++ .../validity/invalid_fnptr_uninit.rs | 10 + 4 files changed, 300 insertions(+) create mode 100644 tests/compile-fail/validity/invalid_bool_uninit.rs create mode 100644 tests/compile-fail/validity/invalid_char_uninit.rs create mode 100644 tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs create mode 100644 tests/compile-fail/validity/invalid_fnptr_uninit.rs diff --git a/tests/compile-fail/validity/invalid_bool_uninit.rs b/tests/compile-fail/validity/invalid_bool_uninit.rs new file mode 100644 index 00000000000..89b57b2d50d --- /dev/null +++ b/tests/compile-fail/validity/invalid_bool_uninit.rs @@ -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 +} diff --git a/tests/compile-fail/validity/invalid_char_uninit.rs b/tests/compile-fail/validity/invalid_char_uninit.rs new file mode 100644 index 00000000000..34798dfbc65 --- /dev/null +++ b/tests/compile-fail/validity/invalid_char_uninit.rs @@ -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`) +} diff --git a/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs b/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs new file mode 100644 index 00000000000..c0f53d72a29 --- /dev/null +++ b/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs @@ -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, but expected a valid enum tag +} diff --git a/tests/compile-fail/validity/invalid_fnptr_uninit.rs b/tests/compile-fail/validity/invalid_fnptr_uninit.rs new file mode 100644 index 00000000000..dbd6711dc65 --- /dev/null +++ b/tests/compile-fail/validity/invalid_fnptr_uninit.rs @@ -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 +} From 6c2521f54f22254fe7fdfea4d22b7abbf243e2cf Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 5 Jul 2020 13:43:20 +0200 Subject: [PATCH 2/3] adjust error messages --- tests/compile-fail/validity/invalid_enum_tag.rs | 2 +- .../validity/invalid_enum_tag_256variants_uninit.rs | 2 +- tests/compile-fail/validity/transmute_through_ptr.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/compile-fail/validity/invalid_enum_tag.rs b/tests/compile-fail/validity/invalid_enum_tag.rs index 897bfa90a70..39e8eed683a 100644 --- a/tests/compile-fail/validity/invalid_enum_tag.rs +++ b/tests/compile-fail/validity/invalid_enum_tag.rs @@ -4,5 +4,5 @@ pub enum Foo { } fn main() { - let _f = unsafe { std::mem::transmute::(42) }; //~ ERROR encountered 0x0000002a, but expected a valid enum tag + let _f = unsafe { std::mem::transmute::(42) }; //~ ERROR encountered 0x0000002a at ., but expected a valid enum tag } diff --git a/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs b/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs index c0f53d72a29..74e24491e61 100644 --- a/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs +++ b/tests/compile-fail/validity/invalid_enum_tag_256variants_uninit.rs @@ -266,5 +266,5 @@ union MyUninit { } fn main() { - let _a = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes, but expected a valid enum tag + let _a = unsafe { MyUninit { init: () }.uninit }; //~ ERROR encountered uninitialized bytes at ., but expected a valid enum tag } diff --git a/tests/compile-fail/validity/transmute_through_ptr.rs b/tests/compile-fail/validity/transmute_through_ptr.rs index 1d5cf16aa5e..6a88fdaea1e 100644 --- a/tests/compile-fail/validity/transmute_through_ptr.rs +++ b/tests/compile-fail/validity/transmute_through_ptr.rs @@ -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 ., but expected a valid enum tag } From 04019eec3cc17684fff1790b0d15a5df89a9aa79 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Tue, 7 Jul 2020 22:57:58 +0200 Subject: [PATCH 3/3] rustup --- rust-version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust-version b/rust-version index e14dd73c70f..e339c77f1ac 100644 --- a/rust-version +++ b/rust-version @@ -1 +1 @@ -9491f18c5de3ff1c4bf9c3fdacf52d9859e26f7c +e1beee4992ad4b235fc700bf7af1ee86f894ea53