G.TRA.BLN.06 不要对实现 Copy 或引用类型调用 std::mem::dropstd::mem::forgot

【级别】 要求

【描述】

std::mem::drop 函数只是利用 Rust 所有权的一个技巧,对于 实现了 Copy 的类型 或引用,是无效的。如果使用它,对导致代码可读方便产生误导作用。

另外std::mem::drop 也无法 Drop 掉 ManuallyDrop 类型。

std::mem::forgot 同理。

但是也存在例外的情况。

【反例】


#![allow(unused)]
fn main() {
// 不符合
let x: i32 = 42; // i32 implements Copy
std::mem::drop(x) // A copy of x is passed to the function, leaving the
                  // original unaffected
}

【例外】

在某些情况下,虽然不会有实际效果,但是为了提升语义,也可以使用。

下面代码中,为了防止自引用的问题,使用 drop(self) ,提升了代码语义,但实际并不会 drop。


#![allow(unused)]
fn main() {
// From: https://docs.rs/crate/dhall/0.10.1/source/src/error/builder.rs

#[allow(clippy::drop_ref)]
pub fn format(&mut self) -> String {
    if self.consumed {
        panic!("tried to format the same ErrorBuilder twice")
    }
    let this = std::mem::take(self);
    self.consumed = true;
    drop(self); // 显式 drop self,避免后面误用它
    // ...
}
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
drop_copyyesnocorrectnessdeny
drop_refyesnocorrectnessdeny
forget_copyyesnocorrectnessdeny
forget_refyesnocorrectnessdeny
undropped_manually_dropsyesnocorrectnessdeny