RS.CLIPPY.MULTIPLE_UNSAFE_OPS_PER_BLOCK
More than one unsafe operation per `unsafe` block
This checker is a Clippy lint created by The Rust Project Contributors. The documentation shown here is a copy of the original documentation for: multiple_unsafe_ops_per_block. Copyright ©2025 The Rust Team. All rights reserved.
What it does
Checks for unsafe blocks that contain more than one unsafe operation.
Why restrict this?
Combined with undocumented_unsafe_blocks,
this lint ensures that each unsafe operation must be independently justified.
Combined with unused_unsafe, this lint also ensures
elimination of unnecessary unsafe blocks through refactoring.
Example
/// Reads a `char` from the given pointer.
///
/// # Safety
///
/// `ptr` must point to four consecutive, initialized bytes which
/// form a valid `char` when interpreted in the native byte order.
fn read_char(ptr: *const u8) -> char {
// SAFETY: The caller has guaranteed that the value pointed
// to by `bytes` is a valid `char`.
unsafe { char::from_u32_unchecked(*ptr.cast::<u32>()) }
}
Use instead:
/// Reads a `char` from the given pointer.
///
/// # Safety
///
/// - `ptr` must be 4-byte aligned, point to four consecutive
/// initialized bytes, and be valid for reads of 4 bytes.
/// - The bytes pointed to by `ptr` must represent a valid
/// `char` when interpreted in the native byte order.
fn read_char(ptr: *const u8) -> char {
// SAFETY: `ptr` is 4-byte aligned, points to four consecutive
// initialized bytes, and is valid for reads of 4 bytes.
let int_value = unsafe { *ptr.cast::<u32>() };
// SAFETY: The caller has guaranteed that the four bytes
// pointed to by `bytes` represent a valid `char`.
unsafe { char::from_u32_unchecked(int_value) }
}