Rust 1.92.0 发布:新增默认拒绝 lint、优化无用结果警告与栈展开表

Rust 1.92.0 稳定版发布,引入多项重要更新:默认拒绝涉及 never 类型的未来兼容性 lint,优化 unused_must_use 对不可构造错误类型的警告,并在 Linux 上默认启用栈展开表以支持 -Cpanic=abort 时的回溯。同时,加强了对

宣布 Rust 1.92.0

2025年12月11日 · Rust 发布团队

Rust 团队很高兴地宣布新版本 Rust 1.92.0。Rust 是一种编程语言,旨在让每个人都能构建可靠且高效的软件。

如果您已经通过 rustup 安装了旧版本的 Rust,您可以通过以下命令获取 1.92.0:

1
$ rustup update stable

如果尚未安装 rustup,您可以从我们网站的相关页面获取,并查看 1.92.0 的详细发布说明。

如果您想通过测试未来版本来帮助我们,可以考虑在本地更新到 beta 频道 (rustup default beta) 或 nightly 频道 (rustup default nightly)。请报告您可能遇到的任何错误!

1.92.0 稳定版中的内容

默认拒绝的 never 类型 lint

语言和编译器团队继续致力于稳定 never 类型。在此版本中,never_type_fallback_flowing_into_unsafedependency_on_unit_never_type_fallback 这两个未来兼容性 lint 被设置为默认拒绝,这意味着检测到它们时会导致编译错误。

值得注意的是,虽然这可能导致编译错误,但它仍然是一个 lint;这些 lint 都可以通过 #[allow] 来允许。此外,这些 lint 只会在直接构建受影响的 crate 时触发,而不会在它们作为依赖项构建时触发(不过 Cargo 在这种情况下会报告警告)。

这些 lint 检测可能因 never 类型稳定化而被破坏的代码。如果它们在您的 crate 图中被报告,强烈建议修复它们。

我们认为大约有 500 个 crate 受到此 lint 的影响。尽管如此,我们认为这是可以接受的,因为 lint 不是破坏性变更,并且它将允许未来稳定 never 类型。更深入的论证,请参阅语言团队的评估。

unused_must_use 不再对 Result<(), UninhabitedType> 发出警告

Rust 的 unused_must_use lint 会在忽略函数的返回值时发出警告,如果函数或其返回类型带有 #[must_use] 注解。例如,如果忽略 Result 返回类型,它会发出警告,以提醒您使用 ? 或类似 .expect("...") 的处理。

然而,有些函数返回 Result,但它们使用的错误类型实际上不是“可构造的”,意味着您无法构造该类型的任何值(例如 !Infallible 类型)。

unused_must_use lint 现在不再对 Result<(), UninhabitedType>ControlFlow<UninhabitedType, ()> 发出警告。例如,它不会对 Result<(), Infallible> 发出警告。这避免了必须检查永远不会发生的错误。

1
2
3
4
5
6
7
8
9
use core::convert::Infallible;
fn can_never_fail() -> Result<(), Infallible> {
    // ...
    Ok(())
}

fn main() {
    can_never_fail();
}

这对于带有关联错误类型的 trait 的常见模式特别有用,其中错误类型有时可能是不可失败的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
trait UsesAssocErrorType {
    type Error;
    fn method(&self) -> Result<(), Self::Error>;
}

struct CannotFail;
impl UsesAssocErrorType for CannotFail {
    type Error = core::convert::Infallible;
    fn method(&self) -> Result<(), Self::Error> {
        Ok(())
    }
}

struct CanFail;
impl UsesAssocErrorType for CanFail {
    type Error = std::io::Error;
    fn method(&self) -> Result<(), Self::Error> {
        Err(std::io::Error::other("something went wrong"))
    }
}

fn main() {
    CannotFail.method(); // 无警告
    CanFail.method(); // 警告:未使用的必须使用的 `Result`
}

在 Linux 上即使启用 -Cpanic=abort 也生成展开表

在 Rust 1.22 中,带有 -Cpanic=abort 的堆栈回溯可以工作,但在 Rust 1.23 中被破坏,因为我们停止在使用 -Cpanic=abort 时生成展开表。在 Rust 1.45 中,以 -Cforce-unwind-tables=yes 形式的工作区被稳定。

在 Rust 1.92 中,即使指定了 -Cpanic=abort,默认也会生成展开表,从而允许堆栈回溯正常工作。如果不需要展开表,用户应使用 -Cforce-unwind-tables=no 来显式禁用其生成。

验证 #[macro_export] 的输入

在过去的几个版本中,编译器处理内置属性的方式发生了许多变化。这应该会大大改善 Rust 对内置属性给出的错误信息和警告,尤其是使这些诊断信息在所有 100 多个内置属性中更加一致。

举个小例子,在这个版本中,Rust 在检查 macro_export 允许哪些参数时变得更加严格,通过将该检查升级为“默认拒绝的 lint”,该 lint 将在依赖项中被报告。

稳定化的 API

  • NonZero<u{N}>::div_ceil
  • Location::file_as_c_str
  • RwLockWriteGuard::downgrade
  • Box::new_zeroed
  • Box::new_zeroed_slice
  • Rc::new_zeroed
  • Rc::new_zeroed_slice
  • Arc::new_zeroed
  • Arc::new_zeroed_slice
  • btree_map::Entry::insert_entry
  • btree_map::VacantEntry::insert_entry
  • impl Extend<proc_macro::Group> for proc_macro::TokenStream
  • impl Extend<proc_macro::Literal> for proc_macro::TokenStream
  • impl Extend<proc_macro::Punct> for proc_macro::TokenStream
  • impl Extend<proc_macro::Ident> for proc_macro::TokenStream

以下先前已稳定的 API 现在在常量上下文中稳定:

  • <[_]>::rotate_left
  • <[_]>::rotate_right

其他更改

查看 Rust、Cargo 和 Clippy 中的所有更改。

1.92.0 的贡献者

许多人齐心协力创造了 Rust 1.92.0。没有你们所有人,我们无法完成这项工作。谢谢!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计