Rust 安全编码规范

Rust 语言虽然以类型安全、内存安全、线程安全和高性能等特性著称,但对于开发者而言,还是需要遵循一定的编码规范,更有助于写出地道安全的 Rust 代码。

虽然 Rust 也提供了 Clippy 这样的静态检查工具来帮助开发者识别代码中的坏味道,但是 Clippy 内部为什么要遵循这些规则,以及它们的分类等,对于大部分开发者还是不太透明。这方面也需要一个文档来进行梳理。

另外,Clippy 也有其局限性:无法检测代码中的语义。 语义在 Rust 里对于写出好代码来说,也是比较重要的参考因素。有时候 clippy 的建议反而会产生负面效果。

所以,为了更好地在公司内落地 Rust, 追求更好的代码质量,制定安全编码规范是必须的。

注意:本规范并不是 Rust 教程。

本规范的指导原则:

编码规范 和 Clippy 的关系是相辅相成的。

本规范要做的,就是根据 Clippy 里的lint ,结合社区生态中的一些实践,提炼出一些规则,进一步从语义角度思考这些 lint 的实用性,明确它们的使用边界,帮助开发者在编写代码和使用 Clippy 等工具检查的时候,可以更加有理有据地做出选择。

本规范的目标如下:

  1. 提高 Unsafe Rust 代码编写的安全性。
  2. 提高 代码的健壮性。
  3. 提高 代码的可读性、可维护性和可移植性。
  4. 编程规范条款力争系统化、易应用、易检查。

规范条款分为原则和规则两个类别,

  • 原则,就是编程开发时指导的一个大方向,或是指一类情况,没有那么具体。原则只是一种建议。
  • 规则,是相对原则而言,是更加具体的条目。规则里面有写【建议】还是【必须】遵守。规则一般是可lint检测的。

本规范中的规则也分三种类型:

  1. 大部分默认是Clippy支持lint检测的
  2. 也有一些是当前clippy 无法检测但可以定制 lint 的规则
  3. 编译器可以检测,警告或报错,但是开发者值得了解的一些规则

原则没有办法去检测,所以只能是建议。

通过标题前的编号来标识:

  • 标识为P为原则(Principle)。编号方式为P.Element.Number
  • 标识为G为规则(Guideline)。编号方式为G.Element.Number
  • 当有子目录时。编号方式为 P.Element.SubElement.NumberG.Element.SubElement.Number

Number 从01开始递增。Element为领域知识中关键元素的三位英文字母缩略语。

Element解释Element解释
NAM命名CMT注释
FMT格式TYP数据类型
CNS常量VAR变量
EXP表达式CTL流程控制
RFE引用PTR指针
STR字符串INT整数
MOD模块CAR包管理
MEM内存FUD函数设计
MACSTV静态变量
GEN泛型TRA特质
ASY异步UNS非安全
SafeAbstract安全抽象FFI外部函数调用
LAY内存布局ERR错误处理
CLT集合MTH多线程
EMB嵌入式RustIO输入输出
Security信息安全OTH其他

鸣谢

本指南参考《华为 C 语言编程指南 V 1.0》,感谢华为 开源能力中心 提供编程指南规范协助!