diff options
| author | Dylan DPC <99973273+Dylan-DPC@users.noreply.github.com> | 2022-05-25 07:31:44 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-25 07:31:44 +0200 |
| commit | 02c0c768c1cc39e9b372bc85368ab58664463623 (patch) | |
| tree | 8b5955d17d93a6cd2fe79de93753c0bb5c5f56ca /src/test | |
| parent | 89bdbd0294ddb4ecfa4b75ccd8446d4d5c4d60e9 (diff) | |
| parent | dd9f31d000a33c52383f9af9e1dbf44f754590c3 (diff) | |
| download | rust-02c0c768c1cc39e9b372bc85368ab58664463623.tar.gz rust-02c0c768c1cc39e9b372bc85368ab58664463623.zip | |
Rollup merge of #97323 - 5225225:strict_init_checks, r=oli-obk
Introduce stricter checks for might_permit_raw_init under a debug flag This is intended to be a version of the strict checks tried out in #79296, but also checking number validity (under the assumption that `let _ = std::mem::uninitialized::<u32>()` is UB, which seems to be what https://github.com/rust-lang/unsafe-code-guidelines/issues/71 is leaning towards.)
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/intrinsics/panic-uninitialized-zeroed.rs | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/src/test/ui/intrinsics/panic-uninitialized-zeroed.rs b/src/test/ui/intrinsics/panic-uninitialized-zeroed.rs index 98fd13553c0..3ffd35ecdb8 100644 --- a/src/test/ui/intrinsics/panic-uninitialized-zeroed.rs +++ b/src/test/ui/intrinsics/panic-uninitialized-zeroed.rs @@ -1,8 +1,9 @@ // run-pass // needs-unwind // ignore-wasm32-bare compiled with panic=abort by default -// revisions: mir thir +// revisions: mir thir strict // [thir]compile-flags: -Zthir-unsafeck +// [strict]compile-flags: -Zstrict-init-checks // ignore-tidy-linelength // This test checks panic emitted from `mem::{uninitialized,zeroed}`. @@ -54,6 +55,8 @@ enum LR_NonZero { Right(num::NonZeroI64), } +struct ZeroSized; + fn test_panic_msg<T>(op: impl (FnOnce() -> T) + panic::UnwindSafe, msg: &str) { let err = panic::catch_unwind(op).err(); assert_eq!( @@ -228,11 +231,40 @@ fn main() { let _val = mem::zeroed::<[!; 0]>(); let _val = mem::uninitialized::<MaybeUninit<bool>>(); let _val = mem::uninitialized::<[!; 0]>(); + let _val = mem::uninitialized::<()>(); + let _val = mem::uninitialized::<ZeroSized>(); + + if cfg!(strict) { + test_panic_msg( + || mem::uninitialized::<i32>(), + "attempted to leave type `i32` uninitialized, which is invalid" + ); + + test_panic_msg( + || mem::uninitialized::<*const ()>(), + "attempted to leave type `*const ()` uninitialized, which is invalid" + ); + + test_panic_msg( + || mem::uninitialized::<[i32; 1]>(), + "attempted to leave type `[i32; 1]` uninitialized, which is invalid" + ); + + test_panic_msg( + || mem::zeroed::<NonNull<()>>(), + "attempted to zero-initialize type `core::ptr::non_null::NonNull<()>`, which is invalid" + ); - // These are UB because they have not been officially blessed, but we await the resolution - // of <https://github.com/rust-lang/unsafe-code-guidelines/issues/71> before doing - // anything about that. - let _val = mem::uninitialized::<i32>(); - let _val = mem::uninitialized::<*const ()>(); + test_panic_msg( + || mem::zeroed::<[NonNull<()>; 1]>(), + "attempted to zero-initialize type `[core::ptr::non_null::NonNull<()>; 1]`, which is invalid" + ); + } else { + // These are UB because they have not been officially blessed, but we await the resolution + // of <https://github.com/rust-lang/unsafe-code-guidelines/issues/71> before doing + // anything about that. + let _val = mem::uninitialized::<i32>(); + let _val = mem::uninitialized::<*const ()>(); + } } } |
