Rust 团队很高兴地宣布 Rust 的新版本 1.81.0。Rust 是一种编程语言,旨在帮助每个人构建可靠且高效的软件。
如果您之前通过 rustup
安装了 Rust 版本,您可以使用以下命令获取 1.81.0:
$ rustup update stable
如果您还没有安装,您可以从我们网站上的相应页面获取 rustup
,并查看 1.81.0 的详细发行说明。
如果您想通过测试未来的版本来帮助我们,您可以考虑在本地更新以使用 beta 频道 (rustup default beta
) 或 nightly 频道 (rustup default nightly
)。请报告您遇到的任何错误!
1.81.0 稳定版中的新内容
core::error::Error
1.81 版本稳定了 core
中的 Error
trait,允许在 #![no_std]
库中使用该 trait。这主要使更广泛的 Rust 生态系统能够在相同的 Error trait 上实现标准化,而无需考虑库的目标环境。
新的排序实现
标准库中稳定和不稳定的排序实现都已更新为新的算法,从而提高了它们的运行时性能和编译时间。
此外,新的排序算法都尝试检测 Ord
的不正确实现,这些实现会阻止它们产生有意义的排序结果,并且现在会在这种情况下 panic,而不是返回实际上随机排列的数据。遇到这些 panic 的用户应审核其排序实现,以确保它们满足 PartialOrd 和 Ord 中记录的要求。
#[expect(lint)]
1.81 版本稳定了一个新的 lint 级别 expect
,它允许显式地指出应该发生特定的 lint,并在它没有发生时发出警告。其预期用例是临时抑制 lint,无论是由于 lint 实现错误还是正在进行的重构,同时希望知道何时不再需要该 lint。
例如,如果您正在移动代码库以符合通过 Clippy lint(如 undocumented_unsafe_blocks
)强制执行的新限制,您可以在转换过程中使用 #[expect(clippy::undocumented_unsafe_blocks)]
,确保一旦所有不安全代码块都已记录在案,您就可以选择拒绝 lint 以强制执行它。
Clippy 还有两个 lint 来强制使用此功能并帮助迁移现有属性
clippy::allow_attributes
用于限制 allow 属性以支持#[expect]
,或将#[allow]
属性迁移到#[expect]
clippy::allow_attributes_without_reason
用于要求#[allow]
属性提供原因
Lint 原因
更改 lint 级别通常是出于某些特定原因。例如,如果代码在没有浮点支持的环境中运行,您可以使用 Clippy 通过 #![deny(clippy::float_arithmetic)]
来 lint 此类用法。但是,如果项目的新开发人员看到此 lint 触发,他们需要查找(希望)关于 deny 的注释,解释为什么添加它。在 Rust 1.81 中,他们可以直接在编译器消息中获得通知
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")]
| ^^^^^^^^^^^^^^^^^^^^^^^^
稳定的 API
core::error
hint::assert_unchecked
fs::exists
AtomicBool::fetch_not
Duration::abs_diff
IoSlice::advance
IoSlice::advance_slices
IoSliceMut::advance
IoSliceMut::advance_slices
PanicHookInfo
PanicInfo::message
PanicMessage
这些 API 现在在 const 上下文中是稳定的
兼容性说明
分离 panic hook 和 panic handler 参数
我们已将 std::panic::PanicInfo
重命名为 std::panic::PanicHookInfo
。旧名称将继续作为别名工作,但从 Rust 1.82.0 开始将导致弃用警告。
但是,core::panic::PanicInfo
将保持不变,因为这现在是不同的类型。
原因是这些类型具有不同的角色:std::panic::PanicHookInfo
是 std 上下文(panic 可以具有任意 payload)中 panic hook 的参数,而 core::panic::PanicInfo
是 #![no_std]
上下文(panic 始终携带格式化的消息)中 #[panic_handler]
的参数。分离这些类型使我们能够向这些类型添加更有用的方法,例如 std::panic::PanicHookInfo::payload_as_str()
和 core::panic::PanicInfo::message()
。
extern "C"
函数中,当 panic 未被捕获时中止
在 这完成了在 1.71 版本中开始的转换,该版本添加了专用的 "C-unwind"
(以及其他 -unwind
变体)ABI,用于在预期跨 ABI 边界展开时使用。从 1.81 版本开始,非展开 ABI(例如 "C"
)现在将在未捕获的展开时中止,从而解决了长期存在的健全性问题。
依赖于展开的程序应过渡到使用带有 -unwind
后缀的 ABI 变体。
WASI 0.1 目标命名已更改
使用 wasm32-wasi
目标(目标为 WASI 0.1)现在将发出编译器警告,并请求用户切换到 wasm32-wasip1
目标。这两个目标是相同的,wasm32-wasi
只是被重命名,并且对 WASI 目标的此更改是为了能够在 2025 年 1 月删除 wasm32-wasi
。
修复 CVE-2024-43402
std::process::Command
现在在 Windows 上调用批处理文件时,如果存在尾随空格或句点(Windows 会忽略并剥离),则会正确转义参数。
有关更多详细信息,请参阅之前关于此更改的公告。
其他更改
查看 Rust, Cargo, 和 Clippy 中的所有更改。
1.81.0 的贡献者
许多人齐心协力创建了 Rust 1.81.0。没有你们大家,我们就无法做到。 谢谢!