rust 变量寿命和安全性

2skhul33  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(139)

我无法理解Rust保护此程序的原因:

fn foo() -> &i32 { 
    let x: i32 = 0;
    &x
}

fn main () {
    let p = foo();
    *p = 42 ; // attempt to store 42 at address p => error!
}

为什么会出现错误?我知道是局部变量lifetime导致的,但我不明白的是,它是为了防止什么常见的漏洞?
Rust采用的这个系统是为了防止释放后使用吗?这个程序的C等价物是如何脆弱的?

fkaflof6

fkaflof61#

在您的示例中,x在函数foo的末尾被丢弃(https://doc.rust-lang.org/std/ops/trait.Drop.html)。

fn foo() -> &i32 { 
    let x: i32 = 0;
    &x
} // <-- `x` is dropped (or freed) at this point

fn main () {
    let p = foo(); <-- `p` would be a pointer to an area of memory that has been freed if the compiler allowed this
    *p = 42 ; <-- this would set some arbitrary memory address to 42 if it was allowed
}

这可以防止您将值指派给不再指向有效内存位置的指涉。

相关问题