Skip to content

Commit 2d83af6

Browse files
traviscrossspastorino
authored andcommitted
Revise changes for unsafe extern blocks
We made an editing pass on the changes for `unsafe extern` blocks. We fixed some editorial items and aligned some stylistic points with the rest of the Reference. We did some rewording that also had the effect of minimizing the changes a bit further. In the examples, we added `safe` and `unsafe` qualifiers to items, as the RFC suggests that this is the preferred way to write these.
1 parent d4b5620 commit 2d83af6

File tree

3 files changed

+27
-24
lines changed

3 files changed

+27
-24
lines changed

src/items/external-blocks.md

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,39 @@ blocks is only allowed in an `unsafe` context.
2323

2424
The external block defines its functions and statics in the [value namespace] of the module or block where it is located.
2525

26-
Starting in edition 2024, the `unsafe` keyword is required to appear before the
27-
`extern` keyword. In previous editions is accepted but not required.
26+
**Edition differences**: Starting in the 2024 edition, the `unsafe` keyword is
27+
required to appear before the `extern` keyword on external blocks. In previous
28+
editions, it is accepted but not required.
2829

2930
## Functions
3031

3132
Functions within external blocks are declared in the same way as other Rust
3233
functions, with the exception that they must not have a body and are instead
3334
terminated by a semicolon. Patterns are not allowed in parameters, only
34-
[IDENTIFIER] or `_` may be used. Only safety funcion qualifiers are allowed
35-
(`unsafe`, `safe`), other function qualifiers (`const`, `async`, and `extern`)
36-
are not allowed.
35+
[IDENTIFIER] or `_` may be used. The `safe` and `unsafe` function qualifiers are
36+
allowed, but other function qualifiers (e.g. `const`, `async`, `extern`) are
37+
not.
3738

3839
Functions within external blocks may be called by Rust code, just like
3940
functions defined in Rust. The Rust compiler automatically translates between
4041
the Rust ABI and the foreign ABI.
4142

42-
A function declared with an explicit safety qualifier (`unsafe`, `safe`) would
43-
take such safety qualification, if no qualifier is present is implicitly
44-
`unsafe`. When coerced to a function pointer, a function declared in an extern
45-
block has type `unsafe extern "abi" for<'l1, ..., 'lm> fn(A1, ..., An) -> R`,
46-
where `'l1`, ... `'lm` are its lifetime parameters, `A1`, ..., `An` are the
47-
declared types of its parameters and `R` is the declared return type.
43+
A function declared in an extern block is implicitly `unsafe` unless the `safe`
44+
function qualifier is present.
45+
46+
When coerced to a function pointer, a function declared in an extern block has
47+
type `extern "abi" for<'l1, ..., 'lm> fn(A1, ..., An) -> R`, where `'l1`,
48+
... `'lm` are its lifetime parameters, `A1`, ..., `An` are the declared types of
49+
its parameters, `R` is the declared return type.
4850

4951
## Statics
5052

5153
Statics within external blocks are declared in the same way as [statics] outside of external blocks,
5254
except that they do not have an expression initializing their value.
53-
It is `unsafe` by default or if the item is declared as `unsafe` to access a static item declared in
54-
an extern block, unless the item was explicitly declared as `safe`.
55-
It does not matter if it's mutable, because there is nothing guaranteeing that the bit pattern at
56-
the static's memory is valid for the type it is declared with, since some arbitrary (e.g. C) code is
57-
in charge of initializing the static.
55+
Unless a static item declared in an extern block is qualified as `safe`, it is `unsafe` to access that item, whether or
56+
not it's mutable, because there is nothing guaranteeing that the bit pattern at the static's
57+
memory is valid for the type it is declared with, since some arbitrary (e.g. C) code is in charge
58+
of initializing the static.
5859

5960
Extern statics can be either immutable or mutable just like [statics] outside of external blocks.
6061
An immutable static *must* be initialized before any Rust code is executed. It is not enough for
@@ -107,9 +108,9 @@ identifier.
107108

108109
```rust
109110
unsafe extern "C" {
110-
fn foo(...);
111-
fn bar(x: i32, ...);
112-
fn with_name(format: *const u8, args: ...);
111+
safe fn foo(...);
112+
unsafe fn bar(x: i32, ...);
113+
unsafe fn with_name(format: *const u8, args: ...);
113114
}
114115
```
115116

@@ -280,7 +281,7 @@ uses the [_MetaNameValueStr_] syntax to specify the name of the symbol.
280281
```rust
281282
unsafe extern {
282283
#[link_name = "actual_symbol_name"]
283-
fn name_in_rust();
284+
safe fn name_in_rust();
284285
}
285286
```
286287

@@ -309,7 +310,7 @@ it, and that assigned ordinal may change between builds of the binary.
309310
#[link(name = "exporter", kind = "raw-dylib")]
310311
unsafe extern "stdcall" {
311312
#[link_ordinal(15)]
312-
fn imported_function_stdcall(i: i32);
313+
safe fn imported_function_stdcall(i: i32);
313314
}
314315
```
315316

src/items/functions.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,11 @@ their _definition_:
158158
<!-- ignore: fake ABI -->
159159
```rust,ignore
160160
unsafe extern "ABI" {
161-
fn foo(); /* no body */
161+
unsafe fn foo(); /* no body */
162+
safe fn bar(); /* no body */
162163
}
163-
unsafe { foo() }
164+
unsafe { foo() };
165+
bar();
164166
```
165167

166168
When `"extern" Abi?*` is omitted from `FunctionQualifiers` in function items,

src/types/never.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ fn foo() -> ! {
1818

1919
```rust
2020
unsafe extern "C" {
21-
pub fn no_return_extern_func() -> !;
21+
pub safe fn no_return_extern_func() -> !;
2222
}
2323
```

0 commit comments

Comments
 (0)