Clippy lints / Correctness
Clippy lint · Correctness · checked with Clippy 0.1.99
clippy::uninit_assumed_init: this call for this type may be undefined behavior
What it meansChecks for MaybeUninit::uninit().assume_init(). It is in the correctness group and denied by default (the build fails).
What you see
error: this call for this type may be undefined behavior --> main.rs:6:25 | 6 | let _: usize = unsafe { MaybeUninit::uninit().assume_init() }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = help: for further information visit https://rust-lang.github.io/rust-clippy/stable/index.html#uninit_assumed_init = note: `#[deny(clippy::uninit_assumed_init)]` on by default
Real output of Clippy 0.1.99 (Rust 1.99) on the example below. Names and line numbers in yours will differ.
Does it matter?
For most types, this is undefined behavior.
Code that is almost certainly wrong. Denied by default: the build fails until you fix it or allow it.
How to fix it
Clippy does not fix this one automatically. Change the code by hand:
Flagged
// Beware the UB
use std::mem::MaybeUninit;
let _: usize = unsafe { MaybeUninit::uninit().assume_init() };
Write this instead
use std::mem::MaybeUninit;
let _: [MaybeUninit<bool>; 5] = unsafe {
MaybeUninit::uninit().assume_init()
};
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::uninit_assumed_init)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
uninit_assumed_init = "allow"One run
cargo clippy -- -A clippy::uninit-assumed-initThe [lints] table needs Rust 1.74 or newer. In a workspace, put it under [workspace.lints.clippy] and add [lints] workspace = true to each member.
Clippy's own documentation
What it does
Checks for MaybeUninit::uninit().assume_init().
Why is this bad?
For most types, this is undefined behavior.
Known problems
For now, we accept empty tuples and tuples / arrays
of MaybeUninit. There may be other types that allow uninitialized
data, but those are not yet rigorously defined.
Example
// Beware the UB
use std::mem::MaybeUninit;
let _: usize = unsafe { MaybeUninit::uninit().assume_init() };
Note that the following is OK:
use std::mem::MaybeUninit;
let _: [MaybeUninit<bool>; 5] = unsafe {
MaybeUninit::uninit().assume_init()
};
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- suspicious_splitnChecks for calls to [splitn] (https://doc.rust-lang.org/std/primitive.str.html#method.splitn) and related functions with either zero or one splits
- transmute_null_to_fntransmuting a known null pointer into a function pointer
- transmuting_nulltransmuting a known null pointer into a reference
- uninit_vecChecks for set_len() call that creates Vec with uninitialized elements. This is commonly caused by calling set_len() right after allocating or reserving a buffer with new(), default(), with_capacity(), or reserve()
- unit_cmpChecks for comparisons to unit
- unit_hashDetects ().hash(_)
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::suspicious_splitnChecks for calls to [splitn] (https://doc.rust-lang.org/std/primitive.str.html#method.splitn) and related functions with either zero or one splitsRead it next →Did this answer your question?