把不安全因素放在小模块中
描述
如果你有unsafe
的代码,创建一个尽可能小的模块,它可以坚持在不安全的基础上建立一个最小的安全接口所需的不变量。
将其嵌入到一个更大的模块中,该模块只包含安全代码,并提供一个符合人体工程学的接口。
注意,外部模块可以包含直接调用不安全代码的不安全函数和方法。用户可以用它来获得速度上的好处。
优势
- 限制必须被审计的不安全代码。
- 编写外部模块要容易得多,因为你可以依靠内部模块的保证。
劣势
- 有时,可能很难找到一个合适的接口。
- 抽象可能会带来效率低下的问题。
例子
toolshed
crate在子模块中包含其不安全的操作,为用户提供了一个安全的接口。std
的String
类是对Vec<u8>
的封装,增加了内容必须是有效UTF-8的不变量。对String
的操作确保了这种行为。 然而,用户可以选择使用一个unsafe
的方法来创建一个String
,在这种情况下,他们有责任保证内容的有效性。
参见
Latest commit 044d365 on 25 Nov 2021