From 4c2e82a3f7cc25046ca2984c1d93f19c212236f2 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Mon, 15 Jul 2019 13:50:28 +0200 Subject: [PATCH] be more explicit about the abstract machine earlier --- personal/_posts/2019-07-14-uninit.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/personal/_posts/2019-07-14-uninit.md b/personal/_posts/2019-07-14-uninit.md index 5aa60df..f925b79 100644 --- a/personal/_posts/2019-07-14-uninit.md +++ b/personal/_posts/2019-07-14-uninit.md @@ -54,7 +54,7 @@ However, if you [run the example](https://play.rust-lang.org/?version=stable&mod ## What *is* uninitialized memory? How is this possible? -The answer is that, in the "abstract machine" that is used to specify the behavior of our program, every byte in memory cannot just have a value in `0..256` (this is Rust/Ruby syntax for a left-inclusive right-exclusive range), it can also be "uninitialized". +The answer is that, in the "abstract machine" that is used to specify the behavior of our program, every byte in memory cannot just have a value in `0..256` (this is Rust/Ruby syntax for a left-inclusive right-exclusive range), it can also be "uninitialized". Memory *remembers* if you initialized it. The `x` that is passed to `always_return_true` is *not* the 8-bit representation of some number, it is an uninitialized byte. Performing operations such as comparison on uninitialized bytes is undefined behavior. @@ -69,7 +69,8 @@ So, one time we "look" at `x` it can be at least 150, and then when we look at i `x` was just uninitialized all the time. That explains why our compiled example program behaves the way it does. -When thinking about Rust (or C, or C++), you have to imagine that every byte in memory is either initialized to some value in `0..256`, or *uninitialized*. +When thinking about Rust (or C, or C++), you have to think in terms of an "abstract machine", not the real hardware you are using. +Imagine that every byte in memory is either initialized to some value in `0..256`, or *uninitialized*. You can think of memory as storing an `Option` at every location.[^pointers] When new memory gets allocated for a local variable (on the stack) or on the heap, there is actually nothing random happening, everything is completely deterministic: every single byte of this memory is marked as *uninitialized*. Every location stores a `None`. -- 2.30.2