update uninit example so that it still works in current Rust
authorRalf Jung <post@ralfj.de>
Thu, 17 Nov 2022 13:52:50 +0000 (14:52 +0100)
committerRalf Jung <post@ralfj.de>
Thu, 17 Nov 2022 13:52:50 +0000 (14:52 +0100)
personal/_posts/2019-07-14-uninit.md

index e5d973bf644ae21a87eb9ad8ef5ff4b52217f380..bbb1468535f65b94a406fcf6b2d2205485484842 100644 (file)
@@ -40,14 +40,16 @@ fn always_returns_true(x: u8) -> bool {
 }
 
 fn main() {
-    let x: u8 = unsafe { mem::uninitialized() };
+    let x: u8 = unsafe { mem::MaybeUninit::uninit().assume_init() };
     assert!(always_returns_true(x));
 }
 {% endhighlight %}
+**Update (2022-11-17):** Switched to `MaybeUninit` to keep the example working in newer versions of Rust.
+
 `always_returns_true` is a function that, clearly, will return `true` for any possible 8-bit unsigned integer.
 After all, *every* possible value for `x` will be either less than 120, equal to 120, or bigger than 120.
 A quick loop [confirms this](https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=65b690fa3c1691e11d4d45955358cdbe).
-However, if you [run the example](https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=812fe3c8655bfedcea37bb18bb70a945), you can see the assertion fail.[^godbolt]
+However, if you [run the example](https://play.rust-lang.org/?version=stable&mode=release&edition=2018&gist=c17d299cacd626c572def0c4262aed69), you can see the assertion fail.[^godbolt]
 
 [^godbolt]: In case this changes with future Rust versions, [here is the same example on godbolt](https://godbolt.org/z/9G67hP); the `xor eax, eax` indicates that the function returns 0, aka `false`. And [here is a version for C++](https://godbolt.org/z/TWrvcq).