如果我想在 Rust 中安全地编码,我应该在不使用指针算法的情况下编码吗?

If I want to code in Rust securely, should I code without using pointer arithmetic?

我读过 Rust 中的指针算法可以通过 pointer.offset() 函数完成,但它总是必须在 unsafe code:

中实现
fn main() {
    let buf: [u32; 5] = [1, 2, 3, 4, 5];
    let mut ptr1: *const u32 = buf.as_ptr();
    unsafe {
        let ptr2: *const u32 = buf.as_ptr().offset(buf.len() as isize);
        while ptr1 < ptr2 {
            println!("Address {:?} | Value {}", ptr1, *ptr1);
            ptr1 = ptr1.offset(1);
        }
    }
}

如果我想在 Rust 中安全地编码,我是否应该不使用指针算法而只使用数组的相应索引来编码?或者还有其他方法吗?

使用这样的原始指针是非常不可能的[1] 比迭代器上的惯用 for 循环更快:

fn main() {
    let buf: [u32; 5] = [1, 2, 3, 4, 5];
    for val in buf.iter() {
        println!("Address {:?} | Value {}", val as *const u32, val);
    }
}

这也更易于阅读,并且不会引入内存不安全风险。


1 实际上,您的代码每次迭代都会比较两个指针值,因此可能比惯用的 for 循环慢得多,后者通常可以省略所有边界检查。

If I want to code in Rust securely

那么你不应该使用unsafeunsafe 有几个合理的理由(例如访问已知且可以安全使用的内存位置,例如在微控制器上有几个寄存器),但通常您不应该使用它。

should I code without using pointer arithmetic and just using the corresponding index of an array for example

是的。根本没有理由(在这种特定情况下)使用 unsafe 。只需使用

for i in 0..buf.len() {
    println!("Value {}", buf[i]);
}

然而,此代码不被视为 "rusty",而是使用 for 循环

for i in &buf {
    println!("Value {}", i);
}