Skip to content

Commit 1dd4eea

Browse files
committed
apply feedback
1 parent 1423936 commit 1dd4eea

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/unsafe-keyword.md

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,25 @@ The `unsafe` keyword can occur in several different contexts:
44
unsafe functions (`unsafe fn`), unsafe blocks (`unsafe {}`), unsafe traits (`unsafe trait`), and unsafe trait implementations (`unsafe impl`).
55
It plays several different roles, depending on where it is used and whether the `unsafe_op_in_unsafe_fn` lint is enabled:
66
- it is used to mark code that *defines* extra safety conditions (`unsafe fn`, `unsafe trait`)
7-
- it is used to mark code that needs to *satisfy* extra safety conditions (`unsafe {}`, `unsafe impl`, `unsafe fn` without `unsafe_op_in_unsafe_fn`)
7+
- it is used to mark code that needs to *satisfy* extra safety conditions (`unsafe {}`, `unsafe impl`, `unsafe fn` without [`unsafe_op_in_unsafe_fn`])
88

99
The following discusses each of these cases.
1010
See the [keyword documentation][keyword] for some illustrative examples.
1111

12-
[keyword]: ../std/keyword.unsafe.html
13-
1412
## Unsafe functions (`unsafe fn`)
1513

1614
Unsafe functions are functions that are not safe in all contexts and/or for all possible inputs.
1715
We say they have *extra safety conditions*, which are requirements that must be upheld by all callers and that the compiler does not check.
18-
For example, `get_unchecked` has the extra safety condition that the index must be in-bounds.
16+
For example, [`get_unchecked`] has the extra safety condition that the index must be in-bounds.
1917
The module defining an unsafe function is responsible for documenting what those extra safety conditions are.
2018

21-
Such a function must be prefixed with the keyword `unsafe` and can only be called from inside an `unsafe` block.
19+
Such a function must be prefixed with the keyword `unsafe` and can only be called from inside an `unsafe` block, or inside `unsafe fn` without the [`unsafe_op_in_unsafe_fn`] lint.
2220

2321
## Unsafe blocks (`unsafe {}`)
2422

2523
A block of code can be prefixed with the `unsafe` keyword, to permit calling `unsafe` functions or dereferencing raw pointers.
2624
By default, the body of an unsafe function is also considered to be an unsafe block;
27-
this can be changed by enabling the `unsafe_op_in_unsafe_fn` lint.
25+
this can be changed by enabling the [`unsafe_op_in_unsafe_fn`] lint.
2826

2927
By putting operations into an unsafe block, the programmer states that they have taken care of satisfying the extra safety conditions of all operations inside that block.
3028

@@ -39,6 +37,7 @@ For example, Rust provides the language features necessary to implement memory-s
3937
Rust's type system is a conservative approximation of the dynamic safety requirements, so in some cases there is a performance cost to using safe code.
4038
For example, a doubly-linked list is not a tree structure and can only be represented with reference-counted pointers in safe code.
4139
By using `unsafe` blocks to represent the reverse links as raw pointers, it can be implemented without reference counting.
40+
(See ["Learn Rust With Entirely Too Many Linked Lists"](https://rust-unofficial.github.io/too-many-lists/) for a more in-depth exploration of this particular example.)
4241

4342
## Unsafe traits (`unsafe trait`)
4443

@@ -53,3 +52,7 @@ When implementing an unsafe trait, the implementation needs to be prefixed with
5352
By writing `unsafe impl`, the programmer states that they have taken care of satisfying the extra safety conditions required by the trait.
5453

5554
Unsafe trait implementations are the logical dual to unsafe traits: where unsafe traits define a proof obligation that implementations must uphold, unsafe implementations state that all relevant proof obligations have been discharged.
55+
56+
[keyword]: ../std/keyword.unsafe.html
57+
[`get_unchecked`]: ../std/primitive.slice.html#method.get_unchecked
58+
[`unsafe_op_in_unsafe_fn`]: ../rustc/lints/listing/allowed-by-default.html#unsafe-op-in-unsafe-fn

0 commit comments

Comments
 (0)