我的问题是如何在 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函数,您可以记录源代码中执行不安全操作的所有位置。注意,通过这种方式,您可以获得最精确的不安全操作的原因。