E0793: Clarify that it applies to unions as well
This commit is contained in:
parent
0f35336396
commit
57901fe092
1 changed files with 33 additions and 1 deletions
|
|
@ -1,4 +1,9 @@
|
|||
An unaligned reference to a field of a [packed] struct got created.
|
||||
An unaligned reference to a field of a [packed] `struct` or `union` was created.
|
||||
|
||||
The `#[repr(packed)]` attribute removes padding between fields, which can
|
||||
cause fields to be stored at unaligned memory addresses. Creating references
|
||||
to such fields violates Rust's memory safety guarantees and can lead to
|
||||
undefined behavior in optimized code.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
|
|
@ -45,9 +50,36 @@ unsafe {
|
|||
// For formatting, we can create a copy to avoid the direct reference.
|
||||
let copy = foo.field1;
|
||||
println!("{}", copy);
|
||||
|
||||
// Creating a copy can be written in a single line with curly braces.
|
||||
// (This is equivalent to the two lines above.)
|
||||
println!("{}", { foo.field1 });
|
||||
|
||||
// A reference to a field that will always be sufficiently aligned is safe:
|
||||
println!("{}", foo.field2);
|
||||
}
|
||||
```
|
||||
|
||||
### Unions
|
||||
|
||||
Although creating a reference to a `union` field is `unsafe`, this error
|
||||
will still be triggered if the referenced field is not sufficiently
|
||||
aligned. Use `addr_of!` and raw pointers in the same way as for struct fields.
|
||||
|
||||
```compile_fail,E0793
|
||||
#[repr(packed)]
|
||||
pub union Foo {
|
||||
field1: u64,
|
||||
field2: u8,
|
||||
}
|
||||
|
||||
unsafe {
|
||||
let foo = Foo { field1: 0 };
|
||||
// Accessing the field directly is fine.
|
||||
let val = foo.field1;
|
||||
|
||||
// A reference to a packed union field causes an error.
|
||||
let val = &foo.field1; // ERROR
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue