-
Notifications
You must be signed in to change notification settings - Fork 301
1.81.0 release announcement #1386
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
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,173 @@ | ||
--- | ||
layout: post | ||
title: "Announcing Rust 1.81.0" | ||
author: The Rust Release Team | ||
release: true | ||
--- | ||
|
||
The Rust team is happy to announce a new version of Rust, 1.81.0. Rust is a programming language empowering everyone to build reliable and efficient software. | ||
|
||
If you have a previous version of Rust installed via `rustup`, you can get 1.81.0 with: | ||
|
||
```console | ||
$ rustup update stable | ||
``` | ||
|
||
If you don't have it already, you can [get `rustup`](https://www.rust-lang.org/install.html) from the appropriate page on our website, and check out the [detailed release notes for 1.81.0](https://doc.rust-lang.org/nightly/releases.html#version-1810-2024-09-05). | ||
|
||
If you'd like to help us out by testing future releases, you might consider updating locally to use the beta channel (`rustup default beta`) or the nightly channel (`rustup default nightly`). Please [report](https://github.com/rust-lang/rust/issues/new/choose) any bugs you might come across! | ||
|
||
## What's in 1.81.0 stable | ||
|
||
### `core::error::Error` | ||
|
||
1.81 stabilizes the `Error` trait in `core`, allowing usage of the trait in | ||
`#![no_std]` libraries. This primarily enables the wider Rust ecosystem to | ||
standardize on the same Error trait, regardless of what environments the | ||
library targets. | ||
|
||
### New sort implementations | ||
|
||
Both the stable and unstable sort implementations in the standard library have | ||
been updated to new algorithms, improving their runtime performance and | ||
compilation time. | ||
|
||
Additionally, both of the new sort algorithms try to detect incorrect | ||
implementations of `Ord` that prevent them from being able to produce a | ||
meaningfully sorted result, and will now panic on such cases rather than | ||
returning effectively randomly arranged data. Users encountering these panics | ||
should audit their ordering implementations to ensure they satisfy the | ||
requirements documented in [PartialOrd] and [Ord]. | ||
|
||
[PartialOrd]: https://doc.rust-lang.org/nightly/std/cmp/trait.PartialOrd.html | ||
[Ord]: https://doc.rust-lang.org/nightly/std/cmp/trait.Ord.html | ||
|
||
### `#[expect(lint)]` | ||
|
||
1.81 stabilizes a new lint level, `expect`, which allows explicitly noting that | ||
a particular lint *should* occur, and warning if it doesn't. The intended use | ||
case for this is temporarily silencing a lint, whether due to lint | ||
implementation bugs or ongoing refactoring, while wanting to know when the lint | ||
is no longer required. | ||
|
||
For example, if you're moving a code base to comply with a new restriction | ||
enforced via a Clippy lint like | ||
[`undocumented_unsafe_blocks`](https://rust-lang.github.io/rust-clippy/stable/index.html#/undocumented_unsafe_blocks), | ||
you can use `#[expect(clippy::undocumented_unsafe_blocks)]` as you transition, | ||
ensuring that once all unsafe blocks are documented you can opt into denying | ||
the lint to enforce it. | ||
|
||
Clippy also has two lints to enforce the usage of this feature and help with | ||
migrating existing attributes: | ||
|
||
* [`clippy::allow_attributes`](https://rust-lang.github.io/rust-clippy/master/index.html#/allow_attributes) to restrict allow attributes in favor of `#[expect]` or to migrate `#[allow]` attributes to `#[expect]` | ||
* [`clippy::allow_attributes_without_reason`](https://rust-lang.github.io/rust-clippy/master/index.html#/allow_attributes_without_reason) To require a reason for `#[allow]` attributes | ||
|
||
### Lint reasons | ||
|
||
Changing the lint level is often done for some particular reason. For example, | ||
if code runs in an environment without floating point support, you could use | ||
Clippy to lint on such usage with `#![deny(clippy::float_arithmetic)]`. | ||
However, if a new developer to the project sees this lint fire, they need to | ||
look for (hopefully) a comment on the deny explaining why it was added. With | ||
Rust 1.71, they can be informed directly in the compiler message: | ||
Mark-Simulacrum marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
```text | ||
error: floating-point arithmetic detected | ||
--> src/lib.rs:4:5 | ||
| | ||
4 | a + b | ||
| ^^^^^ | ||
| | ||
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#float_arithmetic | ||
= note: no hardware float support | ||
note: the lint level is defined here | ||
--> src/lib.rs:1:9 | ||
| | ||
1 | #![deny(clippy::float_arithmetic, reason = "no hardware float support")] | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ||
``` | ||
Mark-Simulacrum marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Stabilized APIs | ||
|
||
- [`core::error`](https://doc.rust-lang.org/stable/core/error/index.html) | ||
- [`hint::assert_unchecked`](https://doc.rust-lang.org/stable/core/hint/fn.assert_unchecked.html) | ||
- [`fs::exists`](https://doc.rust-lang.org/stable/std/fs/fn.exists.html) | ||
- [`AtomicBool::fetch_not`](https://doc.rust-lang.org/stable/core/sync/atomic/struct.AtomicBool.html#method.fetch_not) | ||
- [`Duration::abs_diff`](https://doc.rust-lang.org/stable/core/time/struct.Duration.html#method.abs_diff) | ||
- [`IoSlice::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance) | ||
- [`IoSlice::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSlice.html#method.advance_slices) | ||
- [`IoSliceMut::advance`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance) | ||
- [`IoSliceMut::advance_slices`](https://doc.rust-lang.org/stable/std/io/struct.IoSliceMut.html#method.advance_slices) | ||
- [`PanicHookInfo`](https://doc.rust-lang.org/stable/std/panic/struct.PanicHookInfo.html) | ||
- [`PanicInfo::message`](https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message) | ||
- [`PanicMessage`](https://doc.rust-lang.org/stable/core/panic/struct.PanicMessage.html) | ||
|
||
These APIs are now stable in const contexts: | ||
|
||
- [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/char/fn.from_u32_unchecked.html) (function) | ||
- [`char::from_u32_unchecked`](https://doc.rust-lang.org/stable/core/primitive.char.html#method.from_u32_unchecked) (method) | ||
- [`CStr::count_bytes`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.count_bytes) | ||
- [`CStr::from_ptr`](https://doc.rust-lang.org/stable/core/ffi/c_str/struct.CStr.html#method.from_ptr) | ||
|
||
### Compatibility notes | ||
|
||
#### Split panic hook and panic handler arguments | ||
|
||
We have renamed [`std::panic::PanicInfo`] to [`std::panic::PanicHookInfo`]. The old | ||
name will continue to work as an alias, but will result in a deprecation | ||
warning starting in Rust 1.82.0. | ||
|
||
`core::panic::PanicInfo` will remain unchanged, however, as this is now a | ||
*different type*. cuviper marked this conversation as resolved. | ||
Mark-Simulacrum marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
The reason is that these types have different roles: | ||
`std::panic::PanicHookInfo` is the argument to the [panic hook](https://doc.rust-lang.org/stable/std/panic/fn.set_hook.html) in std | ||
context (where panics can have an arbitrary payload), while | ||
`core::panic::PanicInfo` is the argument to the | ||
[`#[panic_handler]`](https://doc.rust-lang.org/nomicon/panic-handler.html) in | ||
`#![no_std]` context (where panics always carry a formatted *message*). Separating | ||
these types allows us to add more useful methods to these types, such as | ||
[`std::panic::PanicHookInfo::payload_as_str()`]() and | ||
[`core::panic::PanicInfo::message()`](https://doc.rust-lang.org/stable/core/panic/struct.PanicInfo.html#method.message). | ||
|
||
[`std::panic::PanicInfo`]: https://doc.rust-lang.org/stable/std/panic/type.PanicInfo.html | ||
[`std::panic::PanicHookInfo`]: https://doc.rust-lang.org/stable/std/panic/type.PanicHookInfo.html | ||
|
||
#### Abort on uncaught panics in `extern "C"` functions | ||
|
||
This completes the transition started in [1.71](https://blog.rust-lang.org/2023/07/13/Rust-1.71.0.html#c-unwind-abi), | ||
which added dedicated `"C-unwind"` (amongst other `-unwind` variants) ABIs for | ||
when unwinding across the ABI boundary is expected. As of 1.81, the non-unwind | ||
ABIs (e.g., `"C"`) will now abort on uncaught unwinds, closing the longstanding | ||
soundess problem. | ||
|
||
Programs relying on unwinding should transition to using `-unwind` suffixed ABI | ||
variants. | ||
|
||
#### WASI 0.1 target naming changed | ||
|
||
Usage of the `wasm32-wasi` target (which targets WASI 0.1) will now issue a | ||
compiler warning and request users switch to the `wasm32-wasip1` target | ||
instead. Both targets are the same, `wasm32-wasi` is only being renamed, and | ||
this [change to the WASI target](https://blog.rust-lang.org/2024/04/09/updates-to-rusts-wasi-targets.html) | ||
is being done to enable removing `wasm32-wasi` in January 2025. | ||
|
||
The `wasm32-wasip2` target, which targets WASI 0.2, is now also a tier 2 target. | ||
See [the announcement post](https://blog.rust-lang.org/2024/09/05/wasip2-tier-2.html) for more details. | ||
|
||
#### Fixes CVE-2024-43402 | ||
|
||
`std::process::Command` now correctly escapes arguments when invoking batch | ||
files on Windows in the presence of trailing whitespace or periods (which are | ||
ignored and stripped by Windows). | ||
|
||
See more details in the previous [announcement of this change](https://blog.rust-lang.org/2024/09/04/cve-2024-43402.html). | ||
|
||
### Other changes | ||
|
||
Check out everything that changed in [Rust](https://github.com/rust-lang/rust/releases/tag/1.81.0), [Cargo](https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-181-2024-09-05), and [Clippy](https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-181). | ||
|
||
## Contributors to 1.81.0 | ||
|
||
Many people came together to create Rust 1.81.0. We couldn't have done it without all of you. [Thanks!](https://thanks.rust-lang.org/rust/1.81.0/) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.