Skip to content

deny transmute &T to &U where size_of::<T> < size_of::<U> #10287

@KisaragiEffective

Description

@KisaragiEffective

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

No one assigned

    Labels

    A-lintArea: New lints

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions