Skip to content

Conversation

@chriskrycho
Copy link
Contributor

@chriskrycho chriskrycho commented Oct 9, 2024

This makes three major changes to the unsafe section:

  • It uses the newly-stabilized1 &raw borrow operator to more safely get raw pointers, with &raw const and &raw mut respectively. These provide a safe way of getting raw pointers. These are part of the Rust effort to handle provenance correctly and thereby make unsafe safer and easier to work with—and while we’re not going to get into those details, this is definitely a better way to work than the cast as *const i32 and as *mut i32.

  • It updates the static mut COUNTER example to use an unsafe fn instead of a safe function around an unsafe block, since it is necessary for the caller to guarantee that the function is not called from multiple threads. To make the existing safe function actually safe, it would need to introduce some kind of locking mechanism, I think. Leaving it as an unsafe function gives us a nice opportunity to include // SAFETY: … comments, though, and thus to teach a bit more about idiomatic authoring and usage of unsafe code.

  • It introduces Miri at the end of the section! I used Miri to investigate some of the issues folks had flagged up, and credit to the Miri team: it is very easy to use. The main thing I think we should think about here is whether we need more prose or explanation around installing nightly Rust.

Footnotes

  1. as of Rust 1.82.0, which landed on 2024/10/16

Note: this requires Rust 1.82.0, and will be easiest to merge after that
version is stabilized in two weeks. Since it is blocked on that anyway,
I am also basing it on top of the listing changes.
- Add `SAFETY` documentation on the unsafe function and comments on the
  unsafe invocation in the code samples.
- Discuss the soundness issues in more depth and explain the idiomatic
  use of those `SAFETY` comments.
We no longer get the raw pointers from references, although we *could*,
because we can now use the raw pointer operator rather than an `as` cast
and thus can get them directly from a variable in scope.
@chriskrycho chriskrycho marked this pull request as ready for review November 6, 2024 19:37
@chriskrycho chriskrycho merged commit 777a5ba into main Nov 6, 2024
@chriskrycho chriskrycho deleted the unsafe-fixes branch November 7, 2024 20:46
abemassry added a commit to abemassry/book that referenced this pull request Jun 12, 2025
Fixes rust-lang#4338 Wrong concept in subsection "Using Miri to check unsafe code"
of section "20.1. Unsafe Rust"

This is a followup to PR rust-lang#4062

This PR adds a working example of using Miri where the code will compile
and run without warnings or errors, but with undefined behavior while it
runs. After running it through Miri though it correctly identifies the
data race.

Feedback welcome on matching the text to the books style. Or if anyone
wants to collaborate on other examples of Miri output.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant