|
1 | 1 | # The `unsafe` keyword
|
2 | 2 |
|
3 | 3 | The `unsafe` keyword can occur in several different contexts:
|
4 |
| -unsafe functions (`unsafe fn`), unsafe blocks (`unsafe {}`), unsafe traits (`unsafe trait`), unsafe trait implementations (`unsafe impl`), and unsafe external blocks (`unsafe extern`). |
| 4 | +unsafe functions (`unsafe fn`), unsafe blocks (`unsafe {}`), unsafe traits (`unsafe trait`), unsafe trait implementations (`unsafe impl`), unsafe external blocks (`unsafe extern`), and unsafe attributes (`#[unsafe(attr)]`). |
5 | 5 | It plays several different roles, depending on where it is used and whether the `unsafe_op_in_unsafe_fn` lint is enabled:
|
6 | 6 | - 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`], `unsafe extern`) |
| 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`], `unsafe extern`, `#[unsafe(attr)]`) |
8 | 8 |
|
9 | 9 | The following discusses each of these cases.
|
10 | 10 | See the [keyword documentation][keyword] for some illustrative examples.
|
@@ -62,3 +62,9 @@ Unsafe trait implementations are the logical dual to unsafe traits: where unsafe
|
62 | 62 | The programmer who declares an [external block] must assure that the signatures of the items contained within are correct. Failing to do so may lead to undefined behavior. That this obligation has been met is indicated by writing `unsafe extern`.
|
63 | 63 |
|
64 | 64 | [external block]: items/external-blocks.md
|
| 65 | + |
| 66 | +## Unsafe attributes (`#[unsafe(attr)]`) |
| 67 | + |
| 68 | +An [unsafe attribute] is one that has extra safety conditions that must be upheld when using the attribute. The compiler cannot check whether these conditions have been upheld. To assert that they have been, these attributes must be wrapped in `unsafe(..)`, e.g. `#[unsafe(no_mangle)]`. |
| 69 | + |
| 70 | +[unsafe attribute]: attributes.md |
0 commit comments