RS.CLIPPY.DEFAULT_UNION_REPRESENTATION
Unions without a `#[repr(C)]` attribute
This checker is a Clippy lint created by The Rust Project Contributors. The documentation shown here is a copy of the original documentation for: default_union_representation. Copyright ©2025 The Rust Team. All rights reserved.
What it does
Displays a warning when a union is declared with the default representation (without a #[repr(C)] attribute).
Why restrict this?
Unions in Rust have unspecified layout by default, despite many people thinking that they lay out each field at the start of the union (like C does). That is, there are no guarantees about the offset of the fields for unions with multiple non-ZST fields without an explicitly specified layout. These cases may lead to undefined behavior in unsafe blocks.
Example
union Foo {
a: i32,
b: u32,
}
fn main() {
let _x: u32 = unsafe {
Foo { a: 0_i32 }.b // Undefined behavior: `b` is allowed to be padding
};
}
Use instead:
#[repr(C)]
union Foo {
a: i32,
b: u32,
}
fn main() {
let _x: u32 = unsafe {
Foo { a: 0_i32 }.b // Now defined behavior, this is just an i32 -> u32 transmute
};
}