Rust 1.92.0 发布:为 Never 类型铺路,强化调试与安全性

Rust 1.92.0 稳定版已正式发布。这个版本并没有带来重大变化和主要新功能,而是一个较为保守的版本,它只是巧妙地调整和优化了语言规范和编译器工具链等。其中最引人注目的是为最终稳定化"Never Type"所做的准备,改善了对Linux平台调试体验,以及完善文档与调试能力。

下面介绍一下 Rust 1.92.0 的主要内容:涉及语言核心、编译器和标准库层面的一系列更新。

语言特性与编译器更新

1、语言核心:向 Never 类型的最终稳定化迈进

语言和编译器团队继续推进 Never 类型的稳定化工作。为了推进Never类型( ! )(表示永远不会返回的类型)的最终稳定化,在此版本中,编译器团队将 never_type_fallback_flowing_into_unsafedependency_on_unit_never_type_fallback 这两个相关的未来兼容性提示(lint)提升为 Deny-by-default (默认为拒绝) 级别。当编译器检测到可能因 Never 类型类型回退规则变化而受损的代码时,这两个lint 将触发编译错误 ,而非警告,这显然是编译器团队有意让开发者更加关注 Never 类型而做出的做铺垫工作(不过,铺垫归铺垫,因为 never!这个关键字起得太过玄学,难怪网友调侃:我们都知道"永不"类型的真正稳定日期😉)。

不过此更改仅在直接构建受影响的 crate 时生效;如果这些 crate 是作为依赖项被构建,则不会触发错误。虽然开发者可以通过 #[allow(...)] 属性暂时绕过这些错误,但官方强烈建议修复被报告的问题。

此外,unused_must_use lint 变得更加智能。对于返回类型为 Result<(), !>ControlFlow<!, ()> 的函数,该lint将不再发出"未使用必须使用的值"的警告。

2、编译器方面:Linux 下 panic=abort 问题修复

在编译器方面,Rust 1.92.0 解决了一个长期影响Linux开发者调试体验的问题。

过去,当使用 -C panic=abort 编译选项(即在panic 时直接终止程序而非展开)时,编译器默认不会生成展开表(unwind tables) ,这导致无法获取有意义的栈回溯信息(backtrace)。

从这个版本开始,即使在Linux上使用 -C panic=abort,编译器也会默认生成展开表(unwind tables)。这意味着程序异常(panic )终止时,开发者能够获得准确的函数调用栈信息(backtrace),极大地便利了线上问题的调试和诊断。

当然,如果出于极致的二进制体积优化考虑,开发者仍可以通过 -C force-unwind-tables=no 选项显式关闭此功能。

3、宏导出参数校验

#[macro_export] 属性的参数输入进行了更严格的校验,invalid_macro_export_arguments lint 现在默认拒绝(deny)。

4、Lint 改进

unused_must_use lint 现在更加智能,不再对返回Result<(), Uninhabited>(例如 Result<(), !>)的函数发出警告,因为这种情况下错误分支在逻辑上是不可能发生的。

标准库:实用的新API与零开销抽象

Rust 1.92.0 在标准库中稳定了一批新的API,涵盖了内存操作、并发控制和数据结构等多个方面。

零初始化智能指针: 这是本次更新的一个亮点。新增的 Box::new_zeroedBox::new_zeroed_slice 以及对应的 RcArc 版本,允许开发者直接创建内存内容为零的智能指针。

这在处理需要清零内存的FFI(外部函数接口)交互或对安全性有极高要求的场景中非常有用。

在并发编程方面: RwLockWriteGuard::downgrade 方法现已稳定。它允许开发者将一个写锁"降级"为一个读锁,而无需先释放写锁再竞争读锁。

这个原子性操作对于需要先修改数据、再以只读方式长时间持有访问权的场景至关重要,能有效避免不必要的锁竞争。

其它值得关注的稳定API还包括:

  • NonZero<uN>::div_ceil:对非零整数进行向上取整的除法。
  • Location::file_as_c_str:获取当前源代码文件名的C字符串表示,便于与C语言交互。
  • BTreeMap 的入口API扩展:如 btree_map::Entry::insert_entry
  • proc_macro::TokenStream 实现了对 GroupLiteral 等类型的 Extend trait,增强了过程宏编写的灵活性。

此外,切片的 rotate_leftrotate_right 方法现在可以在常量上下文(const context)中使用了。

工具链 :更智能的文档搜索与构建指南

Rust 的工具链(Rustdoc & Cargo)在此版本中也获得了实用性改进。

Rustdoc(文档工具)的搜索功能 变得更加智能和友好。

  • 搜索结果去重 :当搜索结果中包含某个trait定义的方法时,Rustdoc会自动隐藏那些具体实现该trait的类型中的同名方法。例如,搜索"last"将主要显示 Iterator::last,而不会用各个迭代器实现的 last 方法刷屏,使得像 BTreeSet::last 这样的固有方法更容易被找到。
  • 放宽搜索词限制:现在可以搜索不完全符合Rust标识符规则的词(例如以数字开头的词条),从而提升了搜索体验。

Cargo 新增了关于 "构建性能优化"的官方文档章节。这对于想要加快项目编译速度的开发者而言,是一个很实用的参考。

Rust 版本升级指南

升级到 Rust 1.92.0 非常简单,只需在终端执行以下命令:

shell 复制代码
rustup update stable

对于实际项目,建议先在持续集成(CI)环境中测试升级,确保新的默认拒绝 lint(如 invalid_macro_export_arguments)不会中断构建。根据官方说明,最低支持的LLVM版本已更新至20。

总结

Rust 1.92.0正式发布,核心改进包括 Never 类型稳定化准备、Linux下 panic 回溯修复,以及智能指针零初始化等标准库 API 落地等。

相关链接

相关推荐
techdashen2 分钟前
Async Rust 近况补课:从 `async-trait` 到原生 async trait
网络·算法·rust
techdashen1 小时前
在 Async Rust 中实现请求合并(Request Coalescing)
开发语言·后端·rust
程序员三时1 小时前
看我你就不焦虑了,程序员!失踪人口回归,我去干嘛了!!!!
程序员·ai编程
文心快码BaiduComate15 小时前
干货|Comate Harness Engineering工程实践指南
前端·后端·程序员
hyunbar77717 小时前
Git 死亡三连实录:pull 冲突 → push 被拒 → merge 炸锅,完整抢救指南
程序员
咸甜适中17 小时前
rust语言学习笔记Trait(八)Iterator(迭代器)
笔记·学习·rust
Captaincc19 小时前
转载:如何一眼看出别人的财富量级
程序员
DogDaoDao21 小时前
Windows 下 Git 报错:`touch` 无法识别 —— 原因分析与 7 种解决方案(从入门到精通)
windows·git·程序员·npm·powershell·cmd·touch
小孔龙1 天前
Android `<activity-alias>` 指南:动态图标 · 多入口 · 重命名兼容
android·程序员·掘金·日新计划
彩票管理中心秘书长1 天前
智能体状态指示:何时思考、何时调用工具、何时出错
前端·后端·程序员