Description
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