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 落地等。

相关链接

相关推荐
AI大模型7 小时前
一文读懂大模型智能体(Agent):从理论到实践
程序员·llm·agent
古城小栈7 小时前
Go 与 Rust:系统编程语言的竞争与融合
开发语言·golang·rust
柒儿吖7 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——terminal_size完整适配案例
后端·rust·harmonyos
江公望8 小时前
为什么Rust的编译工具依赖C语言的编译工具?
开发语言·rust
Chen--Xing9 小时前
LeetCode 11.盛最多水的容器
c++·python·算法·leetcode·rust·双指针
fegggye9 小时前
创建一个rust写的python库
开发语言·后端·rust
唐僧洗头爱飘柔95271 天前
【软考:程序员(01)】如何考得程序员证书?本片知识点:操作系统基本概念、操作系统的分类、进程管理、三态模型、信号量机制、同步与互斥模型
程序员·软考·实时操作系统·信号量机制·批处理操作系统·三态模型·同步与互斥模型
受之以蒙1 天前
Rust 与 dora-rs:吃透核心概念,手把手打造跨语言的机器人实时数据流应用
人工智能·笔记·rust
程序员老刘1 天前
百度裁员N+3.5,程序员如何建立第二曲线
程序员·客户端·投资