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)。请报告您遇到的任何 bug!
1.81.0 stable 中的内容
core::error::Error
1.81 版本稳定了 core 中的 Error trait,允许在 #![no_std] 库中使用该 trait。这主要使更广泛的 Rust 生态系统能够标准化使用相同的 Error trait,无论库面向何种环境。
新的排序实现
标准库中的 stable 和 unstable 排序实现都已更新为新的算法,提高了它们的运行时性能和编译时间。
此外,这两个新的排序算法都会尝试检测 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)],确保一旦所有 unsafe 块都被文档化,你就可以选择禁用该 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::errorhint::assert_uncheckedfs::existsAtomicBool::fetch_notDuration::abs_diffIoSlice::advanceIoSlice::advance_slicesIoSliceMut::advanceIoSliceMut::advance_slicesPanicHookInfoPanicInfo::messagePanicMessage
这些 API 现在在 const 上下文中稳定
兼容性说明
分离 panic hook 和 panic handler 参数
我们将 std::panic::PanicInfo 重命名为 std::panic::PanicHookInfo。旧名称仍然可以作为别名使用,但在 Rust 1.82.0 开始会发出弃用警告。
然而,core::panic::PanicInfo 将保持不变,因为现在这是一个不同的类型。
原因是这些类型有不同的作用:在 std 上下文(panic 可以有任意载荷)中,std::panic::PanicHookInfo 是传递给 panic hook 的参数;而在 #![no_std] 上下文(panic 总是携带格式化的消息)中,core::panic::PanicInfo 是传递给 #[panic_handler] 的参数。分离这些类型使我们能够为它们添加更多有用的方法,例如 std::panic::PanicHookInfo::payload_as_str() 和 core::panic::PanicInfo::message()。
在 extern "C" 函数中捕获不到的 panic 会导致程序终止
这完成了在 1.71 版本中开始的过渡,该版本添加了专用的 "C-unwind"(以及其他带有 -unwind 变体)ABI,用于预期跨越 ABI 边界进行 unwinding 的情况。截至 1.81 版本,非 unwind ABI(例如 "C")现在会在捕获不到的 unwinds 时导致程序终止,从而解决了长期存在的健全性问题。
依赖于 unwinding 的程序应该过渡到使用带有 -unwind 后缀的 ABI 变体。
WASI 0.1 target 命名更改
使用 wasm32-wasi target(目标 WASI 0.1)现在会发出编译器警告,并要求用户改用 wasm32-wasip1 target。这两个 target 是一样的,wasm32-wasi 只是被重命名,并且进行此项WASI target 的更改是为了能够在 2025 年 1 月移除 wasm32-wasi。
修复 CVE-2024-43402
在 Windows 上调用批处理文件时,当参数末尾存在尾随空格或句点(Windows 会忽略并去除这些字符)时,std::process::Command 现在能正确地转义参数。
更多详细信息请参见之前的此更改的公告。
其他更改
查看 Rust、Cargo 和 Clippy 中的所有更改。
1.81.0 的贡献者
许多人齐心协力促成了 Rust 1.81.0 的发布。没有你们所有人,这是不可能完成的。感谢大家!