-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mem::zeroed/uninit: panic on types that do not permit zero-initialization #66059
Conversation
@pietroalbini how strapped are we on crater resources these days? This PR has the potential to "break" unsafe code that causes UB but got away with it so far. We have linted against some instances of this (on stable for 1 cycle now) but the static check has false negatives, of course, and probably not all affected code got updated. So, it would be good to get a full crater run (with tests) to estimate the fallout. (Also, looks like CI failed but the but didn't post anything?) |
Crater queue is pretty empty so you can probably queue yourself, we're decently okay on resources these days (and I imagine this is good to land at start of cycle, so you're likely waiting ~3 days anyway for beta branching to finish). |
lol, the first thing this finds is an illegal zero-inititalization in the compiler itself.^^
@Mark-Simulacrum Great! I don't have crater powers, but I'll let you know when we have something worth testing. And indeed this should land after beta branching; I expected review + bors queuing to take that long anyway. |
The backtrace points to smallvec:
This is thus likely already fixed upstream by servo/rust-smallvec#162. @mbrubeck @emilio any chance of a patch release with the fix? This is blocking landing better checks for incorrect uses of uninitialized memory, as right now rustc itself violates those checks. |
Yup! Just published smallvec which contains servo/rust-smallvec#175 :) |
Wow, 1.0. :) But that's a major bump, which we should likely do in a separate PR first. |
For now I exempted arrays from the check; given that smallvec 1.0 was only just released, it's probably too early to break users of the 0.6 series. (I also hope we can get a patch release out so users don't need to make a major version bump.) |
All right, let's prepare for a crater run @bors try |
Need another try build due to the stricter @bors try |
⌛ Trying commit f8c69b0 with merge 7469e97dd62119e27ee51feeb04cfdb202e66b2a... |
implement zeroed and uninitialized with MaybeUninit This is the second attempt of doing such a change (first PR: rust-lang#62150). The last change [got reverted](rust-lang#63343) because it [caused](rust-lang#62825) some [issues](rust-lang#52898 (comment)) in [code that incorrectly used these functions](AltF02/x11-rs#99). Since then, the [problematic code has been fixed](AltF02/x11-rs#101), and rustc [gained a lint](rust-lang#63346) that is able to detect many misuses of these functions statically and a [dynamic check that panics](rust-lang#66059) instead of causing UB for some incorrect uses. Fixes rust-lang#62825
implement zeroed and uninitialized with MaybeUninit This is the second attempt of doing such a change (first PR: rust-lang#62150). The last change [got reverted](rust-lang#63343) because it [caused](rust-lang#62825) some [issues](rust-lang#52898 (comment)) in [code that incorrectly used these functions](AltF02/x11-rs#99). Since then, the [problematic code has been fixed](AltF02/x11-rs#101), and rustc [gained a lint](rust-lang#63346) that is able to detect many misuses of these functions statically and a [dynamic check that panics](rust-lang#66059) instead of causing UB for some incorrect uses. Fixes rust-lang#62825
implement zeroed and uninitialized with MaybeUninit This is the second attempt of doing such a change (first PR: rust-lang#62150). The last change [got reverted](rust-lang#63343) because it [caused](rust-lang#62825) some [issues](rust-lang#52898 (comment)) in [code that incorrectly used these functions](AltF02/x11-rs#99). Since then, the [problematic code has been fixed](AltF02/x11-rs#101), and rustc [gained a lint](rust-lang#63346) that is able to detect many misuses of these functions statically and a [dynamic check that panics](rust-lang#66059) instead of causing UB for some incorrect uses. Fixes rust-lang#62825
Pkgsrc changes: * Remove a couple diffs which are now integrated upstream. * Adjust cargo checksums after upstream upgrades. * Belatedly bump the curl dependency * Unset DESTDIR during the build phase, to work around a mysterious build bug deep in the bowels of llvm. * Bump nearly all bootstraps to 1.43.1. Upstream changes: Version 1.44.0 (2020-06-04) ========================== Language -------- - [You can now use `async/.await` with `#[no_std]` enabled.][69033] - [Added the `unused_braces` lint.][70081] **Syntax-only changes** - [Expansion-driven outline module parsing][69838] ```rust #[cfg(FALSE)] mod foo { mod bar { mod baz; // `foo/bar/baz.rs` doesn't exist, but no error! } } ``` These are still rejected semantically, so you will likely receive an error but these changes can be seen and parsed by macros and conditional compilation. Compiler -------- - [Rustc now respects the `-C codegen-units` flag in incremental mode.][70156] Additionally when in incremental mode rustc defaults to 256 codegen units. - [Refactored `catch_unwind`, to have zero-cost unless unwinding is enabled and a panic is thrown.][67502] - [Added tier 3\* support for the `aarch64-unknown-none` and `aarch64-unknown-none-softfloat` targets.][68334] - [Added tier 3 support for `arm64-apple-tvos` and `x86_64-apple-tvos` targets.][68191] Libraries --------- - [Special cased `vec![]` to map directly to `Vec::new()`.][70632] This allows `vec![]` to be able to be used in `const` contexts. - [`convert::Infallible` now implements `Hash`.][70281] - [`OsString` now implements `DerefMut` and `IndexMut` returning a `&mut OsStr`.][70048] - [Unicode 13 is now supported.][69929] - [`String` now implements `From<&mut str>`.][69661] - [`IoSlice` now implements `Copy`.][69403] - [`Vec<T>` now implements `From<[T; N]>`.][68692] Where `N` is less than 32. - [`proc_macro::LexError` now implements `fmt::Display` and `Error`.][68899] - [`from_le_bytes`, `to_le_bytes`, `from_be_bytes`, `to_be_bytes`, `from_ne_bytes`, and `to_ne_bytes` methods are now `const` for all integer types.][69373] Stabilized APIs --------------- - [`PathBuf::with_capacity`] - [`PathBuf::capacity`] - [`PathBuf::clear`] - [`PathBuf::reserve`] - [`PathBuf::reserve_exact`] - [`PathBuf::shrink_to_fit`] - [`f32::to_int_unchecked`] - [`f64::to_int_unchecked`] - [`Layout::align_to`] - [`Layout::pad_to_align`] - [`Layout::array`] - [`Layout::extend`] Cargo ----- - [Added the `cargo tree` command which will print a tree graph of your dependencies.][cargo/8062] E.g. ``` mdbook v0.3.2 (/Users/src/rust/mdbook) +-- ammonia v3.0.0 | +-- html5ever v0.24.0 | | +-- log v0.4.8 | | | +-- cfg-if v0.1.9 | | +-- mac v0.1.1 | | +-- markup5ever v0.9.0 | | +-- log v0.4.8 (*) | | +-- phf v0.7.24 | | | +-- phf_shared v0.7.24 | | | +-- siphasher v0.2.3 | | | +-- unicase v1.4.2 | | | [build-dependencies] | | | +-- version_check v0.1.5 ... ``` You can also display dependencies on multiple versions of the same crate with `cargo tree -d` (short for `cargo tree --duplicates`). Misc ---- - [Rustdoc now allows you to specify `--crate-version` to have rustdoc include the version in the sidebar.][69494] Compatibility Notes ------------------- - [Rustc now correctly generates static libraries on Windows GNU targets with the `.a` extension, rather than the previous `.lib`.][70937] - [Removed the `-C no_integrated_as` flag from rustc.][70345] - [The `file_name` property in JSON output of macro errors now points the actual source file rather than the previous format of `<NAME macros>`.][70969] **Note:** this may not point a file that actually exists on the user's system. - [The minimum required external LLVM version has been bumped to LLVM 8.][71147] - [`mem::{zeroed, uninitialised}` will now panic when used with types that do not allow zero initialization such as `NonZeroU8`.][66059] This was previously a warning. - [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as` operator has been defined as a saturating operation.][71269] This was previously undefined behaviour, you can use the `{f64, f32}::to_int_unchecked` methods to continue using the current behaviour which may desirable in rare performance sensitive situations. Internal Only ------------- These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools. - [dep_graph Avoid allocating a set on when the number reads are small.][69778] - [Replace big JS dict with JSON parsing.][71250] [69373]: rust-lang/rust#69373 [66059]: rust-lang/rust#66059 [68191]: rust-lang/rust#68191 [68899]: rust-lang/rust#68899 [71147]: rust-lang/rust#71147 [71250]: rust-lang/rust#71250 [70937]: rust-lang/rust#70937 [70969]: rust-lang/rust#70969 [70632]: rust-lang/rust#70632 [70281]: rust-lang/rust#70281 [70345]: rust-lang/rust#70345 [70048]: rust-lang/rust#70048 [70081]: rust-lang/rust#70081 [70156]: rust-lang/rust#70156 [71269]: rust-lang/rust#71269 [69838]: rust-lang/rust#69838 [69929]: rust-lang/rust#69929 [69661]: rust-lang/rust#69661 [69778]: rust-lang/rust#69778 [69494]: rust-lang/rust#69494 [69403]: rust-lang/rust#69403 [69033]: rust-lang/rust#69033 [68692]: rust-lang/rust#68692 [68334]: rust-lang/rust#68334 [67502]: rust-lang/rust#67502 [cargo/8062]: rust-lang/cargo#8062 [`PathBuf::with_capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.with_capacity [`PathBuf::capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.capacity [`PathBuf::clear`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.clear [`PathBuf::reserve`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve [`PathBuf::reserve_exact`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve_exact [`PathBuf::shrink_to_fit`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.shrink_to_fit [`f32::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_int_unchecked [`f64::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_int_unchecked [`Layout::align_to`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.align_to [`Layout::pad_to_align`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.pad_to_align [`Layout::array`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.array [`Layout::extend`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
Version 1.44.0 (2020-06-04) ========================== Language -------- - [You can now use `async/.await` with `#[no_std]` enabled.][69033] - [Added the `unused_braces` lint.][70081] **Syntax-only changes** - [Expansion-driven outline module parsing][69838] ```rust #[cfg(FALSE)] mod foo { mod bar { mod baz; // `foo/bar/baz.rs` doesn't exist, but no error! } } ``` These are still rejected semantically, so you will likely receive an error but these changes can be seen and parsed by macros and conditional compilation. Compiler -------- - [Rustc now respects the `-C codegen-units` flag in incremental mode.][70156] Additionally when in incremental mode rustc defaults to 256 codegen units. - [Refactored `catch_unwind` to have zero-cost, unless unwinding is enabled and a panic is thrown.][67502] - [Added tier 3\* support for the `aarch64-unknown-none` and `aarch64-unknown-none-softfloat` targets.][68334] - [Added tier 3 support for `arm64-apple-tvos` and `x86_64-apple-tvos` targets.][68191] Libraries --------- - [Special cased `vec![]` to map directly to `Vec::new()`.][70632] This allows `vec![]` to be able to be used in `const` contexts. - [`convert::Infallible` now implements `Hash`.][70281] - [`OsString` now implements `DerefMut` and `IndexMut` returning a `&mut OsStr`.][70048] - [Unicode 13 is now supported.][69929] - [`String` now implements `From<&mut str>`.][69661] - [`IoSlice` now implements `Copy`.][69403] - [`Vec<T>` now implements `From<[T; N]>`.][68692] Where `N` is at most 32. - [`proc_macro::LexError` now implements `fmt::Display` and `Error`.][68899] - [`from_le_bytes`, `to_le_bytes`, `from_be_bytes`, `to_be_bytes`, `from_ne_bytes`, and `to_ne_bytes` methods are now `const` for all integer types.][69373] Stabilized APIs --------------- - [`PathBuf::with_capacity`] - [`PathBuf::capacity`] - [`PathBuf::clear`] - [`PathBuf::reserve`] - [`PathBuf::reserve_exact`] - [`PathBuf::shrink_to_fit`] - [`f32::to_int_unchecked`] - [`f64::to_int_unchecked`] - [`Layout::align_to`] - [`Layout::pad_to_align`] - [`Layout::array`] - [`Layout::extend`] Cargo ----- - [Added the `cargo tree` command which will print a tree graph of your dependencies.][cargo/8062] E.g. ``` mdbook v0.3.2 (/Users/src/rust/mdbook) ├── ammonia v3.0.0 │ ├── html5ever v0.24.0 │ │ ├── log v0.4.8 │ │ │ └── cfg-if v0.1.9 │ │ ├── mac v0.1.1 │ │ └── markup5ever v0.9.0 │ │ ├── log v0.4.8 (*) │ │ ├── phf v0.7.24 │ │ │ └── phf_shared v0.7.24 │ │ │ ├── siphasher v0.2.3 │ │ │ └── unicase v1.4.2 │ │ │ [build-dependencies] │ │ │ └── version_check v0.1.5 ... ``` You can also display dependencies on multiple versions of the same crate with `cargo tree -d` (short for `cargo tree --duplicates`). Misc ---- - [Rustdoc now allows you to specify `--crate-version` to have rustdoc include the version in the sidebar.][69494] Compatibility Notes ------------------- - [Rustc now correctly generates static libraries on Windows GNU targets with the `.a` extension, rather than the previous `.lib`.][70937] - [Removed the `-C no_integrated_as` flag from rustc.][70345] - [The `file_name` property in JSON output of macro errors now points the actual source file rather than the previous format of `<NAME macros>`.][70969] **Note:** this may not point to a file that actually exists on the user's system. - [The minimum required external LLVM version has been bumped to LLVM 8.][71147] - [`mem::{zeroed, uninitialised}` will now panic when used with types that do not allow zero initialization such as `NonZeroU8`.][66059] This was previously a warning. - [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as` operator has been defined as a saturating operation.][71269] This was previously undefined behaviour, but you can use the `{f64, f32}::to_int_unchecked` methods to continue using the current behaviour, which may be desirable in rare performance sensitive situations. Internal Only ------------- These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools. - [dep_graph Avoid allocating a set on when the number reads are small.][69778] - [Replace big JS dict with JSON parsing.][71250] [69373]: rust-lang/rust#69373 [66059]: rust-lang/rust#66059 [68191]: rust-lang/rust#68191 [68899]: rust-lang/rust#68899 [71147]: rust-lang/rust#71147 [71250]: rust-lang/rust#71250 [70937]: rust-lang/rust#70937 [70969]: rust-lang/rust#70969 [70632]: rust-lang/rust#70632 [70281]: rust-lang/rust#70281 [70345]: rust-lang/rust#70345 [70048]: rust-lang/rust#70048 [70081]: rust-lang/rust#70081 [70156]: rust-lang/rust#70156 [71269]: rust-lang/rust#71269 [69838]: rust-lang/rust#69838 [69929]: rust-lang/rust#69929 [69661]: rust-lang/rust#69661 [69778]: rust-lang/rust#69778 [69494]: rust-lang/rust#69494 [69403]: rust-lang/rust#69403 [69033]: rust-lang/rust#69033 [68692]: rust-lang/rust#68692 [68334]: rust-lang/rust#68334 [67502]: rust-lang/rust#67502 [cargo/8062]: rust-lang/cargo#8062 [`PathBuf::with_capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.with_capacity [`PathBuf::capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.capacity [`PathBuf::clear`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.clear [`PathBuf::reserve`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve [`PathBuf::reserve_exact`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve_exact [`PathBuf::shrink_to_fit`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.shrink_to_fit [`f32::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_int_unchecked [`f64::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_int_unchecked [`Layout::align_to`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.align_to [`Layout::pad_to_align`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.pad_to_align [`Layout::array`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.array [`Layout::extend`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
Pkgsrc changes: * Remove the clutter caused by the cross-compile setup from Makefile (Now consigned to my own private cross.mk file.) * Remove a couple of patches which are now integrated upstream. * Minor adjustments to a couple of other patches. * Adjust cargo checksums after upstream upgrades. * Belatedly bump the curl dependency * If doing a "dist" build, unset DESTDIR during the build phase, to work around a mysterious build bug deep in the bowels of llvm, causing llvm tools to be installed to a directory unexpecetd by the rest of the rust build, ref. rust-lang/rust#73132 A "dist" build is not expected to be followed by an "install". * Bump nearly all bootstraps to 1.43.1; NetBSD earmv7hf bootstrap bumped to 1.44.0, as that one now finally builds and works. Upstream changes: Version 1.44.0 (2020-06-04) ========================== Language -------- - [You can now use `async/.await` with `#[no_std]` enabled.][69033] - [Added the `unused_braces` lint.][70081] **Syntax-only changes** - [Expansion-driven outline module parsing][69838] ```rust #[cfg(FALSE)] mod foo { mod bar { mod baz; // `foo/bar/baz.rs` doesn't exist, but no error! } } ``` These are still rejected semantically, so you will likely receive an error but these changes can be seen and parsed by macros and conditional compilation. Compiler -------- - [Rustc now respects the `-C codegen-units` flag in incremental mode.][70156] Additionally when in incremental mode rustc defaults to 256 codegen units. - [Refactored `catch_unwind`, to have zero-cost unless unwinding is enabled and a panic is thrown.][67502] - [Added tier 3\* support for the `aarch64-unknown-none` and `aarch64-unknown-none-softfloat` targets.][68334] - [Added tier 3 support for `arm64-apple-tvos` and `x86_64-apple-tvos` targets.][68191] Libraries --------- - [Special cased `vec![]` to map directly to `Vec::new()`.][70632] This allows `vec![]` to be able to be used in `const` contexts. - [`convert::Infallible` now implements `Hash`.][70281] - [`OsString` now implements `DerefMut` and `IndexMut` returning a `&mut OsStr`.][70048] - [Unicode 13 is now supported.][69929] - [`String` now implements `From<&mut str>`.][69661] - [`IoSlice` now implements `Copy`.][69403] - [`Vec<T>` now implements `From<[T; N]>`.][68692] Where `N` is less than 32. - [`proc_macro::LexError` now implements `fmt::Display` and `Error`.][68899] - [`from_le_bytes`, `to_le_bytes`, `from_be_bytes`, `to_be_bytes`, `from_ne_bytes`, and `to_ne_bytes` methods are now `const` for all integer types.][69373] Stabilized APIs --------------- - [`PathBuf::with_capacity`] - [`PathBuf::capacity`] - [`PathBuf::clear`] - [`PathBuf::reserve`] - [`PathBuf::reserve_exact`] - [`PathBuf::shrink_to_fit`] - [`f32::to_int_unchecked`] - [`f64::to_int_unchecked`] - [`Layout::align_to`] - [`Layout::pad_to_align`] - [`Layout::array`] - [`Layout::extend`] Cargo ----- - [Added the `cargo tree` command which will print a tree graph of your dependencies.][cargo/8062] E.g. ``` mdbook v0.3.2 (/Users/src/rust/mdbook) +-- ammonia v3.0.0 | +-- html5ever v0.24.0 | | +-- log v0.4.8 | | | +-- cfg-if v0.1.9 | | +-- mac v0.1.1 | | +-- markup5ever v0.9.0 | | +-- log v0.4.8 (*) | | +-- phf v0.7.24 | | | +-- phf_shared v0.7.24 | | | +-- siphasher v0.2.3 | | | +-- unicase v1.4.2 | | | [build-dependencies] | | | +-- version_check v0.1.5 ... ``` You can also display dependencies on multiple versions of the same crate with `cargo tree -d` (short for `cargo tree --duplicates`). Misc ---- - [Rustdoc now allows you to specify `--crate-version` to have rustdoc include the version in the sidebar.][69494] Compatibility Notes ------------------- - [Rustc now correctly generates static libraries on Windows GNU targets with the `.a` extension, rather than the previous `.lib`.][70937] - [Removed the `-C no_integrated_as` flag from rustc.][70345] - [The `file_name` property in JSON output of macro errors now points the actual source file rather than the previous format of `<NAME macros>`.][70969] **Note:** this may not point a file that actually exists on the user's system. - [The minimum required external LLVM version has been bumped to LLVM 8.][71147] - [`mem::{zeroed, uninitialised}` will now panic when used with types that do not allow zero initialization such as `NonZeroU8`.][66059] This was previously a warning. - [In 1.45.0 (the next release) converting a `f64` to `u32` using the `as` operator has been defined as a saturating operation.][71269] This was previously undefined behaviour, you can use the `{f64, f32}::to_int_unchecked` methods to continue using the current behaviour which may desirable in rare performance sensitive situations. Internal Only ------------- These changes provide no direct user facing benefits, but represent significant improvements to the internals and overall performance of rustc and related tools. - [dep_graph Avoid allocating a set on when the number reads are small.][69778] - [Replace big JS dict with JSON parsing.][71250] [69373]: rust-lang/rust#69373 [66059]: rust-lang/rust#66059 [68191]: rust-lang/rust#68191 [68899]: rust-lang/rust#68899 [71147]: rust-lang/rust#71147 [71250]: rust-lang/rust#71250 [70937]: rust-lang/rust#70937 [70969]: rust-lang/rust#70969 [70632]: rust-lang/rust#70632 [70281]: rust-lang/rust#70281 [70345]: rust-lang/rust#70345 [70048]: rust-lang/rust#70048 [70081]: rust-lang/rust#70081 [70156]: rust-lang/rust#70156 [71269]: rust-lang/rust#71269 [69838]: rust-lang/rust#69838 [69929]: rust-lang/rust#69929 [69661]: rust-lang/rust#69661 [69778]: rust-lang/rust#69778 [69494]: rust-lang/rust#69494 [69403]: rust-lang/rust#69403 [69033]: rust-lang/rust#69033 [68692]: rust-lang/rust#68692 [68334]: rust-lang/rust#68334 [67502]: rust-lang/rust#67502 [cargo/8062]: rust-lang/cargo#8062 [`PathBuf::with_capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.with_capacity [`PathBuf::capacity`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.capacity [`PathBuf::clear`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.clear [`PathBuf::reserve`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve [`PathBuf::reserve_exact`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.reserve_exact [`PathBuf::shrink_to_fit`]: https://doc.rust-lang.org/std/path/struct.PathBuf.html#method.shrink_to_fit [`f32::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f32.html#method.to_int_unchecked [`f64::to_int_unchecked`]: https://doc.rust-lang.org/std/primitive.f64.html#method.to_int_unchecked [`Layout::align_to`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.align_to [`Layout::pad_to_align`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.pad_to_align [`Layout::array`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.array [`Layout::extend`]: https://doc.rust-lang.org/std/alloc/struct.Layout.html#method.extend
r? @eddyb @oli-obk
Cc #62825
Also see this summary comment