Clippy lints / Correctness
Clippy lint · Correctness · checked with Clippy 0.1.99
clippy::mem_replace_with_uninit: Checks for mem::replace(&mut _, mem::uninitialized()) and mem::replace(&mut _, mem::zeroed())
What it meansChecks for mem::replace(&mut _, mem::uninitialized()) and mem::replace(&mut _, mem::zeroed()). It is in the correctness group and denied by default (the build fails).
Does it matter?
This will lead to undefined behavior even if the value is overwritten later, because the uninitialized value may be observed in the case of a panic.
Code that is almost certainly wrong. Denied by default: the build fails until you fix it or allow it.
How to fix it
Clippy can fix this one for you: run cargo clippy --fix (add --allow-dirty if you have uncommitted changes). Review the diff before you commit.
Flagged
use std::mem;
#[allow(deprecated, invalid_value)]
fn myfunc (v: &mut Vec<i32>) {
let taken_v = unsafe { mem::replace(v, mem::uninitialized()) };
let new_v = may_panic(taken_v); // undefined behavior on panic
mem::forget(mem::replace(v, new_v));
}
Turn it off, or on
Allow it where it does not fit your code, as narrowly as you can:
On one item
#[allow(clippy::mem_replace_with_uninit)]
fn my_function() { /* ... */ }Whole crate (Cargo.toml)
[lints.clippy]
mem_replace_with_uninit = "allow"One run
cargo clippy -- -A clippy::mem-replace-with-uninitThe [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 mem::replace(&mut _, mem::uninitialized())
and mem::replace(&mut _, mem::zeroed()).
Why is this bad?
This will lead to undefined behavior even if the value is overwritten later, because the uninitialized value may be observed in the case of a panic.
Example
use std::mem;
#[allow(deprecated, invalid_value)]
fn myfunc (v: &mut Vec<i32>) {
let taken_v = unsafe { mem::replace(v, mem::uninitialized()) };
let new_v = may_panic(taken_v); // undefined behavior on panic
mem::forget(mem::replace(v, new_v));
}
The take_mut crate offers a sound solution, at the cost of either lazily creating a replacement value or aborting on panic, to ensure that the uninitialized value cannot be observed.
From the Clippy lint list (0.1.99), part of the Rust project, MIT or Apache-2.0. Official entry.
Related lints
- let_underscore_lockChecks for let _ = sync_lock
- lint_groups_priorityChecks for lint groups with the same priority as lints in the Cargo.toml [lints] table. This lint will be removed once cargo#12918 is resolved
- match_str_case_mismatchChecks for match expressions modifying the case of a string with non-compliant arms
- min_maxChecks for expressions where std::cmp::min and max are used to clamp values, but switched so that the result is constant
- mistyped_literal_suffixesWarns for mistyped suffix in literals
- modulo_oneChecks for getting the remainder of integer division by one or minus one
All 847 Clippy lints · Rust compiler errors · Cargo.toml checker
Up next
Related lintclippy::let_underscore_lockChecks for let _ = sync_lockRead it next →Did this answer your question?