1

我的问题是如何在 Rust 中获得最精确的不安全块。目前,Rust 允许在不安全的块内进行安全操作。例如,以下代码来自 rust 的 stdlib Vec:

pub fn push(&mut self, value: T) {
    // This will panic or abort if we would allocate > isize::MAX bytes
    // or if the length increment would overflow for zero-sized types.
    if self.len == self.buf.capacity() {
        self.reserve(1);
    }
    unsafe {
        let end = self.as_mut_ptr().add(self.len);
        ptr::write(end, value);
        self.len += 1;
    }
}

这里我们有 3 行不安全的语句。但是,正在执行增量的第三行实际上是安全的。

我的问题是如何获得精确的不安全块,例如:

pub fn push(&mut self, value: T) {
    // This will panic or abort if we would allocate > isize::MAX bytes
    // or if the length increment would overflow for zero-sized types.
    if self.len == self.buf.capacity() {
        self.reserve(1);
    }
    unsafe { 
        let end = self.as_mut_ptr().add(self.len);
        ptr::write(end, value);
    }
    self.len += 1;
}

或者是否有任何工具/库可能有帮助?

我可以想出一个直截了当的方法,在 syn crate 的帮助下逐渐缩小范围,只是想看看是否有更好的想法。

更新: 我终于通过对 rustc 编译器进行简单修改来解决这个问题。在 rust ( 1.55.0 )的最新版本中。你可以得到他们的支票

compiler/rustc_mir_transform/src/check_unsafety.rs

这就是 rustc 检查不安全块/函数的地方。通过修改require_unsafe函数,您可以记录源代码中执行不安全操作的所有位置。注意,通过这种方式,您可以获得最精确的不安全操作的原因。

4

0 回答 0