无恐慌的 Rust:系统编程的一种好技巧

主要观点:探讨 Rust 是否能替代 C,重点介绍“无恐慌 Rust”技术及其在系统库中的应用,包括其优点和面临的问题。
关键信息:

  • 恐慌(Panics)是 Rust 用于处理不可恢复错误的机制,应仅用于代码中的错误,否则会导致代码大小增加、不可恢复的退出和运行时开销等问题。
  • 无恐慌 Rust 是 Rust 的一个子集,其中panic!()不可达,程序在任何情况下都不会恐慌,但实现起来有难度,如println!()可能导致恐慌,标准库中的一些 API 也可能引发恐慌。
  • 对于数值操作等,Rust 在调试模式下会插入溢出检查(可能导致恐慌),而在优化模式下则会省略,这创造了“优化模式下无恐慌,但调试模式下可能恐慌”的代码类别。
  • 标准库如Vec并非设计为无恐慌的,使用时可能会导致恐慌,需要避免大部分标准库或使用#![no_std]
  • 通过与优化器“跳舞”,可以让 Rust 理解程序中的不变量,从而消除不必要的边界检查,使代码在优化模式下无恐慌,但需要小心使用unsafe代码。
    重要细节:
  • 在 macOS 上可以使用-why_live选项来诊断恐慌的来源,帮助确定代码是否为无恐慌的。
  • 为了实现无恐慌 Rust,需要工具来诊断恐慌处理程序的可达性,目前 macOS 的-why_live选项比较适用,希望其他链接器也能支持。
  • 希望 Rust 能更方便地保持在无恐慌子集内,例如函数或 crate 可以声明为无恐慌的,并让编译器强制传递。
  • 作者尚未在大规模上尝试无恐慌 Rust 技术,目前只是 upb 的一个未来方向。
阅读 10
0 条评论