Skip to content

Warn on transmutes that could use pre-defined methods instead #1675

Open
@clarfonthey

Description

@clarfonthey

I've been rather exhaustively adding methods to the standard library that allow "safe" transmutes that we know work, like between [u8] and str (see: rust-lang/rust#41119 and rust-lang/rust#40380). It'd be nice if we had a framework to detect transmutes specifically between these types and suggest other methods instead.

For example, &str -> &u8 is str::as_bytes, and the reverse is str::from_utf8_unchecked. If someone does a raw transmute here, they should be redirected to the standard library functions that do these conversions.

I've been slowly adding methods to do less common conversions, like &mut [u8] -> &mut str. In general it makes sense to have some sort of framework to recognise transmutes and suggest to replace them with more explicit functions, especially as these other methods get stabilised.

If we want to go all-out, we could detect functions that do these conversions and suggest them instead of transmutes.

Current list:

  • transmute::<&str, &[u8]> => str::as_bytes
  • transmute::<&mut str, &mut [u8]> => str::as_mut_bytes
  • transmute::<&[u8], &str> => std::str::from_utf8_unchecked
  • transmute::<&mut [u8], &mut str> => std::str::from_utf8_unchecked_mut
  • transmute::<&CStr, &[u8]> => CStr::to_bytes_with_nul
  • transmute::<&[u8], &CStr> => CStr::from_bytes_with_nul_unchecked
  • transmute::<f32, u32> => f32::to_bits
  • transmute::<f64, u64> => f64::to_bits
  • transmute::<u32, f32> => f32::from_bits
  • transmute::<u64, f64> => f64::from_bits

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-lintArea: New lintsE-mediumCall for participation: Medium difficulty level problem and requires some initial experience.T-middleType: Probably requires verifiying types

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions