P.UNS.SAS.09 在任何 Unsafe 块之前都应该加 SAFETY 注释

【描述】

在任何 unsafe 块(即 unsafe {...})之前都应该加 # SAFETY 注释,用于表明 Unsafe 块里面的代码为什么是正确的。并且 # SAFETY 是全大写,注意区分与文档注释中 # Safety 的用法。

虽然有时原因可能看起来微不足道或很明显,但编写这些注释不仅是记录所考虑内容的好方法,而且最重要的是,它提供了一种知道没有额外隐含约束的方法。

【反例】

未在 unsafe 块之前增加 # SAFETY 注释。


#![allow(unused)]

fn main() {
// 注意这里 Safety 是用于文档注释,用于说明 unsafe 方法或函数的 安全边界
/// Returns the contained [`Some`] value, consuming the `self` value,
/// without checking that the value is not [`None`].
///
/// # Safety
///
/// Calling this method on [`None`] is *[undefined behavior]*.
///
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
///
/// # Examples
///
/// ```
/// let x = Some("air");
/// assert_eq!(unsafe { x.unwrap_unchecked() }, "air");
/// ```
pub unsafe fn unwrap_unchecked(self) -> T {
        match self {
                Some(val) => val,
                // 这里存在一个 Unsafe block ,应该为其增加 SAFETY 注释来说明其
                // 但是现在没有相关注释
                None => unsafe { hint::unreachable_unchecked() },
        }
}
}

【正例】

已在 unsafe 块之前增加 # SAFETY 注释。


#![allow(unused)]

fn main() {
// 注意这里 Safety 是用于文档注释,用于说明 unsafe 方法或函数的 安全边界
/// Returns the contained [`Some`] value, consuming the `self` value,
/// without checking that the value is not [`None`].
///
/// # Safety
///
/// Calling this method on [`None`] is *[undefined behavior]*.
///
/// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
///
/// # Examples
///
/// ```
/// let x = Some("air");
/// assert_eq!(unsafe { x.unwrap_unchecked() }, "air");
/// ```
pub unsafe fn unwrap_unchecked(self) -> T {
        match self {
                Some(val) => val,
                // 这里存在一个 Unsafe block ,为其增加 SAFETY 注释来说明其
                // SAFETY: The safety contract must be upheld by the caller.
                None => unsafe { hint::unreachable_unchecked() },
        }
}
}