Rust 团队隆重宣布 Rust 1.81.0 版本正式发布!Rust 是一门赋能开发者构建可靠高效软件的编程语言。
升级至 Rust 1.81.0如果您已通过 rustup 安装了 Rust,只需运行以下命令即可升级至 1.81.0 版本:
$ rustup update stable如果您尚未安装 Rust,请访问 Rust 官网 下载 rustup 工具,并查阅 1.81.0 版本的详细发行说明。
我们鼓励您更新至 beta (rustup default beta) 或 nightly (rustup default nightly) 通道,以帮助我们测试未来版本。如果您在使用过程中遇到任何问题,请及时 提交错误报告。
1.81.0 稳定版新特性详解core::error::Error特性稳定化
1.81 版本稳定了 core 模块中的 Error 特性,使得在 #![no_std] 库中使用该特性成为可能。这将推动更广泛的 Rust 生态系统在相同的 Error 特性上进行标准化,无论库的目标环境如何。
全新排序算法
标准库中的稳定排序和不稳定排序实现都已更新为全新算法,显著提升了运行时性能和编译速度。
此外,这两种新排序算法会尝试检测 Ord 特性的错误实现,这些错误实现会导致排序结果毫无意义。如果检测到此类错误,算法将直接 panic,而不是返回随机排列的数据。遇到此类 panic 的用户应仔细检查其排序实现,确保其满足 PartialOrd 和 Ord 文档中规定的要求。
#[expect(lint)]属性
1.81 版本稳定了一个新的 lint 级别——expect,允许开发者明确指出特定 lint 应该 出现,并在未出现时发出警告。此功能的主要用例是在 lint 实现存在 bug 或代码正在重构时,临时禁用某个 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 触发,他们需要查找(希望有)注释来解释禁用原因。在 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 supportnote: 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 上下文中稳定:
char::from_u32_unchecked (函数)char::from_u32_unchecked (方法)CStr::count_bytesCStr::from_ptr兼容性说明Panic Hook 和 Panic Handler 参数分离
我们已将 std::panic::PanicInfo 重命名为 std::panic::PanicHookInfo。旧名称将继续作为别名使用,但从 Rust 1.82.0 开始,将发出弃用警告。
core::panic::PanicInfo 将保持不变,因为它现在是_不同的类型_。
这样做的原因是,这些类型具有不同的作用:std::panic::PanicHookInfo 是 std 上下文中 panic hook 的参数(其中 panic 可以具有任意负载),而 core::panic::PanicInfo 是 #![no_std] 上下文中 #[panic_handler] 的参数(其中 panic 始终携带格式化的_消息_)。分离这些类型允许我们向这些类型添加更有用的方法,例如 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 会忽略并删除这些字符)的参数。