|
|
@ -41,9 +41,9 @@ be forced to accept your program on the assumption that it is correct.
|
|
|
|
This will never happen to Rust. It's up to the programmer to prove to the
|
|
|
|
This will never happen to Rust. It's up to the programmer to prove to the
|
|
|
|
compiler that everything is sound.
|
|
|
|
compiler that everything is sound.
|
|
|
|
|
|
|
|
|
|
|
|
Of course, Rust's story around ownership is much more complicated than just
|
|
|
|
Of course, Rust's story around ownership is much more complicated than simply
|
|
|
|
verifying that references don't escape the scope of their referent. That's
|
|
|
|
gauranteeing that references cannot outlive their target. That is
|
|
|
|
because ensuring pointers are always valid is much more complicated than this.
|
|
|
|
because ensuring pointers are always valid in the general case is much more complicated.
|
|
|
|
For instance in this code,
|
|
|
|
For instance in this code,
|
|
|
|
|
|
|
|
|
|
|
|
```rust,compile_fail
|
|
|
|
```rust,compile_fail
|
|
|
@ -59,7 +59,10 @@ data.push(4);
|
|
|
|
println!("{}", x);
|
|
|
|
println!("{}", x);
|
|
|
|
```
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
naive scope analysis would be insufficient to prevent this bug, because `data`
|
|
|
|
a naive scope analysis would be insufficient to prevent this bug because `data`
|
|
|
|
does in fact live as long as we needed. However it was *changed* while we had
|
|
|
|
does indeed live as long as required. However, `data` is *changed* by `push(4)`
|
|
|
|
a reference into it. This is why Rust requires any references to freeze the
|
|
|
|
and now may have been realocated to accommodate the new value.
|
|
|
|
referent and its owners.
|
|
|
|
Consequently, `x` may now be referring to the old
|
|
|
|
|
|
|
|
value or memory already put to use in another process (pre-emptive multi-tasking).
|
|
|
|
|
|
|
|
This is why Rust requires the code to also treat the target as frozen; and so,
|
|
|
|
|
|
|
|
will refuse the expression, `data.push(4)`.
|
|
|
|