-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Closed
Labels
A-lintArea: New lintsArea: New lints
Description
What it does
Consider following example:
let u8_ref: &u8 = &0u8;
let u64_ref: &u64 = unsafe { std::mem::transmute(u8_ref) };
This is UB, reported by miri.
Above example can be written:
let u8_ref: &u8 = &0u8;
let u64_ref: &u64 = &(*u8_ref as u64);
Generalize:
let Original
is original type, and Dest
is destination type.
If Original: Clone
and can be coerced into Dest
by as
-cast, this can be written as:
let original_ref: &Original = Original;
let dest_ref: &Dest = &(original_ref.clone() as Dest);
If Original: Clone + Into<Dest>
, this can be written as:
let original_ref: &Original = Original;
let dest_ref: &Dest = &(original_ref.clone().into());
If Original: AsRef<Dest>
, this can be written as:
let original_ref: &Original = Original;
let dest_ref: &Dest = original_ref.as_ref();
Lint Name
transmute_to_reference_to_larger_content
Category
correctness
Advantage
- Prevents UB.
Drawbacks
- None.
Example
let u8_ref: &u8 = &0u8;
let u64_ref: &u64 = unsafe { std::mem::transmute(u8_ref) };
Could be written:
let u8_ref: &u8 = &0u8;
let u64_ref: &u64 = &(*u8_ref as u64);
Metadata
Metadata
Assignees
Labels
A-lintArea: New lintsArea: New lints