安全卫生的三个基本规则

主要观点:

  • 初学者常对unsafe感到困惑,需理解“(非)安全”的本质,Rust 的安全工具背后有更深层次的习惯用法,即“安全卫生”。
  • “安全卫生”实践基于三个原则:用关键字引入和说明安全义务,用关键字解除安全义务,无安全义务时避免使用关键字和安全注释。
  • 在 Rust 中,unsafe是关键关键字,相关工具是这三个规则的实现,包括函数安全卫生和 trait 安全卫生等。
  • 这三个原则可用于理解 Rust 工具所鼓励的习惯用法,也可用于实践超出当前工具限制的安全卫生。
  • 已有很多改进 Rust 安全工具的提案,如区分安全条件的定义和解除、区分前置条件和后置条件、结构化安全文档等。
  • 可采取一些基本步骤来改进现有安全工具的一致性和实用性,如调整 lint 默认值、为字段安全卫生提供工具、安全联合等。

关键信息:

  • 函数安全卫生:用unsafe标记有安全条件的函数,调用时也用unsafe并提供安全注释,Rust 工具提供相应支持。
  • trait 安全卫生:类似函数安全卫生,标记unsafe的 trait 和实现也有相应工具支持。
  • 字段安全卫生:在zerocopyitertools中实践,虽受 Rust 工具限制,但可利用函数安全卫生工具弥补。
  • 提案方面:区分定义和解除的提案、区分前置和后置条件的提案、结构化安全文档的提案等。
  • 改进安全工具的基本步骤:调整 lint 默认值、为字段安全卫生提供工具、处理安全联合等。

重要细节:

  • zerocopy中通过Ptr类型展示字段安全卫生,在字段定义和初始化时进行注释。
  • Rust 对字段使用unsafe有语法限制,如不能直接将unsafe应用于字段。
  • 不同提案对unsafe的使用和语义进行了不同的改进建议。
  • 安全联合在 Rust 中存在问题,可能导致状态无效,可通过迁移为显式unsafe来解决。
阅读 7
0 条评论