You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nomicon/src
Vlad Ion b825a46d15
Fix small typo in the Drop Check chapter
4 years ago
..
img Add @aldeka's safe and unsafe Ferris 8 years ago
README.md Move word "reading" out of the link to "The Book" 5 years ago
SUMMARY.md Arc revisions (pt1/2(+?)) 4 years ago
aliasing.md Fix double "the" in aliasing.md 6 years ago
arc-and-mutex.md Simple Arc implementation (without Weak refs) 4 years ago
arc-base.md Arc revisions (pt1/2(+?)) 4 years ago
arc-clone.md Fix small punctuation error 4 years ago
arc-drop.md Remove TODO 4 years ago
arc-final.md Arc revisions (Clone atomic explanation) (pt2/3(+?)) 4 years ago
arc-layout.md Arc revisions (pt1/2(+?)) 4 years ago
arc.md Simple Arc implementation (without Weak refs) 4 years ago
atomics.md Update link to c++ atomic ordering docs (#264) 4 years ago
beneath-std.md document #[panic_implementation] 7 years ago
borrow-splitting.md Update implementation code of `split_at_mut` 5 years ago
casts.md Update casts.md 4 years ago
checked-uninit.md Minor improvements 6 years ago
coercions.md Update src/coercions.md 4 years ago
concurrency.md Port Nomicon to mdbook 8 years ago
constructors.md Port Nomicon to mdbook 8 years ago
conversions.md Port Nomicon to mdbook 8 years ago
data.md Fix link to type layout reference [skip ci] 6 years ago
destructors.md Rename `AllocRef` to `Allocator` and `(de)alloc` to `(de)allocate` 4 years ago
dot-operator.md Port Nomicon to mdbook 8 years ago
drop-flags.md Add missing source code language hints in drop-flags and phantom-data. 6 years ago
dropck.md Fix small typo in the Drop Check chapter 4 years ago
exception-safety.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
exotic-sizes.md Fix alloc link in exotic-sizes for local docs 4 years ago
ffi.md Fix opaque type representation. 4 years ago
hrtb.md Port Nomicon to mdbook 8 years ago
leaking.md Discuss thread::scoped API in past tense 6 years ago
lifetime-elision.md Replace occurrences of `uint` with `usize` 8 years ago
lifetime-mismatch.md Adds compile error for example in improperly reduced borrows 4 years ago
lifetimes.md fix typo in Lifetimes mutable reference aliasing section 4 years ago
meet-safe-and-unsafe.md Cleanup the first chapter 7 years ago
obrm.md Port Nomicon to mdbook 8 years ago
other-reprs.md Uppercase `repr(Rust)` 4 years ago
ownership.md Port Nomicon to mdbook 8 years ago
panic-handler.md ignore tests 6 years ago
phantom-data.md fix a typo 4 years ago
poisoning.md Port Nomicon to mdbook 8 years ago
races.md Data Race definition should be more precise 5 years ago
references.md rewrite references.md, splitting it out into aliasing.md 8 years ago
repr-rust.md Clarify that any alignment is valid for ZSTs 4 years ago
safe-unsafe-meaning.md Clarify some of the language around marking traits safe/unsafe. (#268) 4 years ago
send-and-sync.md Add example of thinking about Send/Sync's soundness (#259) 4 years ago
subtyping.md follow-up to review from Centril 5 years ago
transmutes.md Improve formatting of "Transmutes" chapter 4 years ago
unbounded-lifetimes.md Port Nomicon to mdbook 8 years ago
unchecked-uninit.md fix links for copy, copy_nonoverlapping 5 years ago
uninitialized.md Port Nomicon to mdbook 8 years ago
unwinding.md Use simpler link syntax 5 years ago
vec-alloc.md Adjust Vec to build on stable Rust (#223) 4 years ago
vec-dealloc.md Adjust Vec to build on stable Rust (#223) 4 years ago
vec-deref.md Use just `std::_` instead of `::std::_` 5 years ago
vec-drain.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-final.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-insert-remove.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-into-iter.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-layout.md Adjust Vec to build on stable Rust (#223) 4 years ago
vec-push-pop.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-raw.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec-zsts.md Use pointer 'add' instead of 'offset' (#265) 4 years ago
vec.md Adjust Vec to build on stable Rust (#223) 4 years ago
what-unsafe-does.md Merge pull request #180 from jyn514/master 4 years ago
working-with-unsafe.md Use pointer 'add' instead of 'offset' (#265) 4 years ago

README.md

The Rustonomicon

The Dark Arts of Unsafe Rust

THE KNOWLEDGE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF UNLEASHING INDESCRIBABLE HORRORS THAT SHATTER YOUR PSYCHE AND SET YOUR MIND ADRIFT IN THE UNKNOWABLY INFINITE COSMOS.

The Rustonomicon digs into all the awful details that you need to understand when writing Unsafe Rust programs.

Should you wish a long and happy career of writing Rust programs, you should turn back now and forget you ever saw this book. It is not necessary. However if you intend to write unsafe code — or just want to dig into the guts of the language — this book contains lots of useful information.

Unlike The Rust Programming Language, we will be assuming considerable prior knowledge. In particular, you should be comfortable with basic systems programming and Rust. If you don't feel comfortable with these topics, you should consider reading The Book first. That said, we won't assume you have read it, and we will take care to occasionally give a refresher on the basics where appropriate. You can skip straight to this book if you want; just know that we won't be explaining everything from the ground up.

This book exists primarily as a high-level companion to The Reference. Where The Reference exists to detail the syntax and semantics of every part of the language, The Rustonomicon exists to describe how to use those pieces together, and the issues that you will have in doing so.

The Reference will tell you the syntax and semantics of references, destructors, and unwinding, but it won't tell you how combining them can lead to exception-safety issues, or how to deal with those issues.

It should be noted that when The Rustonomicon was originally written, The Reference was in a state of complete disrepair, and so many things that should have been covered by The Reference were originally only documented here. Since then, The Reference has been revitalized and is properly maintained, although it is still far from complete. In general, if the two documents disagree, The Reference should be assumed to be correct (it isn't yet considered normative, it's just better maintained).

Topics that are within the scope of this book include: the meaning of (un)safety, unsafe primitives provided by the language and standard library, techniques for creating safe abstractions with those unsafe primitives, subtyping and variance, exception-safety (panic/unwind-safety), working with uninitialized memory, type punning, concurrency, interoperating with other languages (FFI), optimization tricks, how constructs lower to compiler/OS/hardware primitives, how to not make the memory model people angry, how you're going to make the memory model people angry, and more.

The Rustonomicon is not a place to exhaustively describe the semantics and guarantees of every single API in the standard library, nor is it a place to exhaustively describe every feature of Rust.