Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ch. 20: Address soundness issues and introduce Miri #4062

Merged
merged 6 commits into from
Nov 6, 2024
Merged

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(r) 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
6 checks passed
@chriskrycho chriskrycho deleted the unsafe-fixes branch November 7, 2024 20:46
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