mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
Auto merge of #5068 - JohnTitor:split-up-transmute, r=phansch
Split up `transmute` ui test Part of #2038 changelog: none
This commit is contained in:
commit
f78cc07509
@ -7,7 +7,7 @@ use std::io::prelude::*;
|
|||||||
// The maximum length allowed for stderr files.
|
// The maximum length allowed for stderr files.
|
||||||
//
|
//
|
||||||
// We limit this because small files are easier to deal with than bigger files.
|
// We limit this because small files are easier to deal with than bigger files.
|
||||||
const LIMIT: usize = 275;
|
const LIMIT: usize = 245;
|
||||||
|
|
||||||
pub fn check() {
|
pub fn check() {
|
||||||
let stderr_files = stderr_files();
|
let stderr_files = stderr_files();
|
||||||
|
@ -27,46 +27,6 @@ unsafe fn _generic<'a, T, U: 'a>(t: &'a T) {
|
|||||||
let _: *const U = core::intrinsics::transmute(t);
|
let _: *const U = core::intrinsics::transmute(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[warn(clippy::transmute_ptr_to_ref)]
|
|
||||||
unsafe fn _ptr_to_ref<T, U>(p: *const T, m: *mut T, o: *const U, om: *mut U) {
|
|
||||||
let _: &T = std::mem::transmute(p);
|
|
||||||
let _: &T = &*p;
|
|
||||||
|
|
||||||
let _: &mut T = std::mem::transmute(m);
|
|
||||||
let _: &mut T = &mut *m;
|
|
||||||
|
|
||||||
let _: &T = std::mem::transmute(m);
|
|
||||||
let _: &T = &*m;
|
|
||||||
|
|
||||||
let _: &mut T = std::mem::transmute(p as *mut T);
|
|
||||||
let _ = &mut *(p as *mut T);
|
|
||||||
|
|
||||||
let _: &T = std::mem::transmute(o);
|
|
||||||
let _: &T = &*(o as *const T);
|
|
||||||
|
|
||||||
let _: &mut T = std::mem::transmute(om);
|
|
||||||
let _: &mut T = &mut *(om as *mut T);
|
|
||||||
|
|
||||||
let _: &T = std::mem::transmute(om);
|
|
||||||
let _: &T = &*(om as *const T);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[warn(clippy::transmute_ptr_to_ref)]
|
|
||||||
fn issue1231() {
|
|
||||||
struct Foo<'a, T> {
|
|
||||||
bar: &'a T,
|
|
||||||
}
|
|
||||||
|
|
||||||
let raw = 42 as *const i32;
|
|
||||||
let _: &Foo<u8> = unsafe { std::mem::transmute::<_, &Foo<_>>(raw) };
|
|
||||||
|
|
||||||
let _: &Foo<&u8> = unsafe { std::mem::transmute::<_, &Foo<&_>>(raw) };
|
|
||||||
|
|
||||||
type Bar<'a> = &'a u8;
|
|
||||||
let raw = 42 as *const i32;
|
|
||||||
unsafe { std::mem::transmute::<_, Bar>(raw) };
|
|
||||||
}
|
|
||||||
|
|
||||||
#[warn(clippy::useless_transmute)]
|
#[warn(clippy::useless_transmute)]
|
||||||
fn useless() {
|
fn useless() {
|
||||||
unsafe {
|
unsafe {
|
||||||
@ -131,58 +91,4 @@ fn bytes_to_str(b: &[u8], mb: &mut [u8]) {
|
|||||||
let _: &mut str = unsafe { std::mem::transmute(mb) };
|
let _: &mut str = unsafe { std::mem::transmute(mb) };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make sure we can modify lifetimes, which is one of the recommended uses
|
|
||||||
// of transmute
|
|
||||||
|
|
||||||
// Make sure we can do static lifetime transmutes
|
|
||||||
#[warn(clippy::transmute_ptr_to_ptr)]
|
|
||||||
unsafe fn transmute_lifetime_to_static<'a, T>(t: &'a T) -> &'static T {
|
|
||||||
std::mem::transmute::<&'a T, &'static T>(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure we can do non-static lifetime transmutes
|
|
||||||
#[warn(clippy::transmute_ptr_to_ptr)]
|
|
||||||
unsafe fn transmute_lifetime<'a, 'b, T>(t: &'a T, u: &'b T) -> &'b T {
|
|
||||||
std::mem::transmute::<&'a T, &'b T>(t)
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LifetimeParam<'a> {
|
|
||||||
s: &'a str,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct GenericParam<T> {
|
|
||||||
t: T,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[warn(clippy::transmute_ptr_to_ptr)]
|
|
||||||
fn transmute_ptr_to_ptr() {
|
|
||||||
let ptr = &1u32 as *const u32;
|
|
||||||
let mut_ptr = &mut 1u32 as *mut u32;
|
|
||||||
unsafe {
|
|
||||||
// pointer-to-pointer transmutes; bad
|
|
||||||
let _: *const f32 = std::mem::transmute(ptr);
|
|
||||||
let _: *mut f32 = std::mem::transmute(mut_ptr);
|
|
||||||
// ref-ref transmutes; bad
|
|
||||||
let _: &f32 = std::mem::transmute(&1u32);
|
|
||||||
let _: &f64 = std::mem::transmute(&1f32);
|
|
||||||
// ^ this test is here because both f32 and f64 are the same TypeVariant, but they are not
|
|
||||||
// the same type
|
|
||||||
let _: &mut f32 = std::mem::transmute(&mut 1u32);
|
|
||||||
let _: &GenericParam<f32> = std::mem::transmute(&GenericParam { t: 1u32 });
|
|
||||||
}
|
|
||||||
|
|
||||||
// these are recommendations for solving the above; if these lint we need to update
|
|
||||||
// those suggestions
|
|
||||||
let _ = ptr as *const f32;
|
|
||||||
let _ = mut_ptr as *mut f32;
|
|
||||||
let _ = unsafe { &*(&1u32 as *const u32 as *const f32) };
|
|
||||||
let _ = unsafe { &mut *(&mut 1u32 as *mut u32 as *mut f32) };
|
|
||||||
|
|
||||||
// transmute internal lifetimes, should not lint
|
|
||||||
let s = "hello world".to_owned();
|
|
||||||
let lp = LifetimeParam { s: &s };
|
|
||||||
let _: &LifetimeParam<'static> = unsafe { std::mem::transmute(&lp) };
|
|
||||||
let _: &GenericParam<&LifetimeParam<'static>> = unsafe { std::mem::transmute(&GenericParam { t: &lp }) };
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -24,112 +24,50 @@ error: transmute from a reference to a pointer
|
|||||||
LL | let _: *const U = core::intrinsics::transmute(t);
|
LL | let _: *const U = core::intrinsics::transmute(t);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `t as *const T as *const U`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `t as *const T as *const U`
|
||||||
|
|
||||||
error: transmute from a pointer type (`*const T`) to a reference type (`&T`)
|
|
||||||
--> $DIR/transmute.rs:32:17
|
|
||||||
|
|
|
||||||
LL | let _: &T = std::mem::transmute(p);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*p`
|
|
||||||
|
|
|
||||||
= note: `-D clippy::transmute-ptr-to-ref` implied by `-D warnings`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*mut T`) to a reference type (`&mut T`)
|
|
||||||
--> $DIR/transmute.rs:35:21
|
|
||||||
|
|
|
||||||
LL | let _: &mut T = std::mem::transmute(m);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *m`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*mut T`) to a reference type (`&T`)
|
|
||||||
--> $DIR/transmute.rs:38:17
|
|
||||||
|
|
|
||||||
LL | let _: &T = std::mem::transmute(m);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*m`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*mut T`) to a reference type (`&mut T`)
|
|
||||||
--> $DIR/transmute.rs:41:21
|
|
||||||
|
|
|
||||||
LL | let _: &mut T = std::mem::transmute(p as *mut T);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(p as *mut T)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*const U`) to a reference type (`&T`)
|
|
||||||
--> $DIR/transmute.rs:44:17
|
|
||||||
|
|
|
||||||
LL | let _: &T = std::mem::transmute(o);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(o as *const T)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*mut U`) to a reference type (`&mut T`)
|
|
||||||
--> $DIR/transmute.rs:47:21
|
|
||||||
|
|
|
||||||
LL | let _: &mut T = std::mem::transmute(om);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(om as *mut T)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*mut U`) to a reference type (`&T`)
|
|
||||||
--> $DIR/transmute.rs:50:17
|
|
||||||
|
|
|
||||||
LL | let _: &T = std::mem::transmute(om);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(om as *const T)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*const i32`) to a reference type (`&issue1231::Foo<'_, u8>`)
|
|
||||||
--> $DIR/transmute.rs:61:32
|
|
||||||
|
|
|
||||||
LL | let _: &Foo<u8> = unsafe { std::mem::transmute::<_, &Foo<_>>(raw) };
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const Foo<_>)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*const i32`) to a reference type (`&issue1231::Foo<'_, &u8>`)
|
|
||||||
--> $DIR/transmute.rs:63:33
|
|
||||||
|
|
|
||||||
LL | let _: &Foo<&u8> = unsafe { std::mem::transmute::<_, &Foo<&_>>(raw) };
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const Foo<&_>)`
|
|
||||||
|
|
||||||
error: transmute from a pointer type (`*const i32`) to a reference type (`&u8`)
|
|
||||||
--> $DIR/transmute.rs:67:14
|
|
||||||
|
|
|
||||||
LL | unsafe { std::mem::transmute::<_, Bar>(raw) };
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const u8)`
|
|
||||||
|
|
||||||
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
||||||
--> $DIR/transmute.rs:73:27
|
--> $DIR/transmute.rs:33:27
|
||||||
|
|
|
|
||||||
LL | let _: Vec<i32> = core::intrinsics::transmute(my_vec());
|
LL | let _: Vec<i32> = core::intrinsics::transmute(my_vec());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
||||||
--> $DIR/transmute.rs:75:27
|
--> $DIR/transmute.rs:35:27
|
||||||
|
|
|
|
||||||
LL | let _: Vec<i32> = core::mem::transmute(my_vec());
|
LL | let _: Vec<i32> = core::mem::transmute(my_vec());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
||||||
--> $DIR/transmute.rs:77:27
|
--> $DIR/transmute.rs:37:27
|
||||||
|
|
|
|
||||||
LL | let _: Vec<i32> = std::intrinsics::transmute(my_vec());
|
LL | let _: Vec<i32> = std::intrinsics::transmute(my_vec());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
||||||
--> $DIR/transmute.rs:79:27
|
--> $DIR/transmute.rs:39:27
|
||||||
|
|
|
|
||||||
LL | let _: Vec<i32> = std::mem::transmute(my_vec());
|
LL | let _: Vec<i32> = std::mem::transmute(my_vec());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
error: transmute from a type (`std::vec::Vec<i32>`) to itself
|
||||||
--> $DIR/transmute.rs:81:27
|
--> $DIR/transmute.rs:41:27
|
||||||
|
|
|
|
||||||
LL | let _: Vec<i32> = my_transmute(my_vec());
|
LL | let _: Vec<i32> = my_transmute(my_vec());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from an integer to a pointer
|
error: transmute from an integer to a pointer
|
||||||
--> $DIR/transmute.rs:83:31
|
--> $DIR/transmute.rs:43:31
|
||||||
|
|
|
|
||||||
LL | let _: *const usize = std::mem::transmute(5_isize);
|
LL | let _: *const usize = std::mem::transmute(5_isize);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `5_isize as *const usize`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `5_isize as *const usize`
|
||||||
|
|
||||||
error: transmute from an integer to a pointer
|
error: transmute from an integer to a pointer
|
||||||
--> $DIR/transmute.rs:87:31
|
--> $DIR/transmute.rs:47:31
|
||||||
|
|
|
|
||||||
LL | let _: *const usize = std::mem::transmute(1 + 1usize);
|
LL | let _: *const usize = std::mem::transmute(1 + 1usize);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(1 + 1usize) as *const usize`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `(1 + 1usize) as *const usize`
|
||||||
|
|
||||||
error: transmute from a type (`*const Usize`) to the type that it points to (`Usize`)
|
error: transmute from a type (`*const Usize`) to the type that it points to (`Usize`)
|
||||||
--> $DIR/transmute.rs:102:24
|
--> $DIR/transmute.rs:62:24
|
||||||
|
|
|
|
||||||
LL | let _: Usize = core::intrinsics::transmute(int_const_ptr);
|
LL | let _: Usize = core::intrinsics::transmute(int_const_ptr);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -137,25 +75,25 @@ LL | let _: Usize = core::intrinsics::transmute(int_const_ptr);
|
|||||||
= note: `-D clippy::crosspointer-transmute` implied by `-D warnings`
|
= note: `-D clippy::crosspointer-transmute` implied by `-D warnings`
|
||||||
|
|
||||||
error: transmute from a type (`*mut Usize`) to the type that it points to (`Usize`)
|
error: transmute from a type (`*mut Usize`) to the type that it points to (`Usize`)
|
||||||
--> $DIR/transmute.rs:104:24
|
--> $DIR/transmute.rs:64:24
|
||||||
|
|
|
|
||||||
LL | let _: Usize = core::intrinsics::transmute(int_mut_ptr);
|
LL | let _: Usize = core::intrinsics::transmute(int_mut_ptr);
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`Usize`) to a pointer to that type (`*const Usize`)
|
error: transmute from a type (`Usize`) to a pointer to that type (`*const Usize`)
|
||||||
--> $DIR/transmute.rs:106:31
|
--> $DIR/transmute.rs:66:31
|
||||||
|
|
|
|
||||||
LL | let _: *const Usize = core::intrinsics::transmute(my_int());
|
LL | let _: *const Usize = core::intrinsics::transmute(my_int());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a type (`Usize`) to a pointer to that type (`*mut Usize`)
|
error: transmute from a type (`Usize`) to a pointer to that type (`*mut Usize`)
|
||||||
--> $DIR/transmute.rs:108:29
|
--> $DIR/transmute.rs:68:29
|
||||||
|
|
|
|
||||||
LL | let _: *mut Usize = core::intrinsics::transmute(my_int());
|
LL | let _: *mut Usize = core::intrinsics::transmute(my_int());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: transmute from a `u32` to a `char`
|
error: transmute from a `u32` to a `char`
|
||||||
--> $DIR/transmute.rs:114:28
|
--> $DIR/transmute.rs:74:28
|
||||||
|
|
|
|
||||||
LL | let _: char = unsafe { std::mem::transmute(0_u32) };
|
LL | let _: char = unsafe { std::mem::transmute(0_u32) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::char::from_u32(0_u32).unwrap()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::char::from_u32(0_u32).unwrap()`
|
||||||
@ -163,13 +101,13 @@ LL | let _: char = unsafe { std::mem::transmute(0_u32) };
|
|||||||
= note: `-D clippy::transmute-int-to-char` implied by `-D warnings`
|
= note: `-D clippy::transmute-int-to-char` implied by `-D warnings`
|
||||||
|
|
||||||
error: transmute from a `i32` to a `char`
|
error: transmute from a `i32` to a `char`
|
||||||
--> $DIR/transmute.rs:115:28
|
--> $DIR/transmute.rs:75:28
|
||||||
|
|
|
|
||||||
LL | let _: char = unsafe { std::mem::transmute(0_i32) };
|
LL | let _: char = unsafe { std::mem::transmute(0_i32) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::char::from_u32(0_i32 as u32).unwrap()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::char::from_u32(0_i32 as u32).unwrap()`
|
||||||
|
|
||||||
error: transmute from a `u8` to a `bool`
|
error: transmute from a `u8` to a `bool`
|
||||||
--> $DIR/transmute.rs:120:28
|
--> $DIR/transmute.rs:80:28
|
||||||
|
|
|
|
||||||
LL | let _: bool = unsafe { std::mem::transmute(0_u8) };
|
LL | let _: bool = unsafe { std::mem::transmute(0_u8) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `0_u8 != 0`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `0_u8 != 0`
|
||||||
@ -177,7 +115,7 @@ LL | let _: bool = unsafe { std::mem::transmute(0_u8) };
|
|||||||
= note: `-D clippy::transmute-int-to-bool` implied by `-D warnings`
|
= note: `-D clippy::transmute-int-to-bool` implied by `-D warnings`
|
||||||
|
|
||||||
error: transmute from a `u32` to a `f32`
|
error: transmute from a `u32` to a `f32`
|
||||||
--> $DIR/transmute.rs:125:27
|
--> $DIR/transmute.rs:85:27
|
||||||
|
|
|
|
||||||
LL | let _: f32 = unsafe { std::mem::transmute(0_u32) };
|
LL | let _: f32 = unsafe { std::mem::transmute(0_u32) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `f32::from_bits(0_u32)`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `f32::from_bits(0_u32)`
|
||||||
@ -185,13 +123,13 @@ LL | let _: f32 = unsafe { std::mem::transmute(0_u32) };
|
|||||||
= note: `-D clippy::transmute-int-to-float` implied by `-D warnings`
|
= note: `-D clippy::transmute-int-to-float` implied by `-D warnings`
|
||||||
|
|
||||||
error: transmute from a `i32` to a `f32`
|
error: transmute from a `i32` to a `f32`
|
||||||
--> $DIR/transmute.rs:126:27
|
--> $DIR/transmute.rs:86:27
|
||||||
|
|
|
|
||||||
LL | let _: f32 = unsafe { std::mem::transmute(0_i32) };
|
LL | let _: f32 = unsafe { std::mem::transmute(0_i32) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `f32::from_bits(0_i32 as u32)`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `f32::from_bits(0_i32 as u32)`
|
||||||
|
|
||||||
error: transmute from a `&[u8]` to a `&str`
|
error: transmute from a `&[u8]` to a `&str`
|
||||||
--> $DIR/transmute.rs:130:28
|
--> $DIR/transmute.rs:90:28
|
||||||
|
|
|
|
||||||
LL | let _: &str = unsafe { std::mem::transmute(b) };
|
LL | let _: &str = unsafe { std::mem::transmute(b) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::str::from_utf8(b).unwrap()`
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::str::from_utf8(b).unwrap()`
|
||||||
@ -199,48 +137,10 @@ LL | let _: &str = unsafe { std::mem::transmute(b) };
|
|||||||
= note: `-D clippy::transmute-bytes-to-str` implied by `-D warnings`
|
= note: `-D clippy::transmute-bytes-to-str` implied by `-D warnings`
|
||||||
|
|
||||||
error: transmute from a `&mut [u8]` to a `&mut str`
|
error: transmute from a `&mut [u8]` to a `&mut str`
|
||||||
--> $DIR/transmute.rs:131:32
|
--> $DIR/transmute.rs:91:32
|
||||||
|
|
|
|
||||||
LL | let _: &mut str = unsafe { std::mem::transmute(mb) };
|
LL | let _: &mut str = unsafe { std::mem::transmute(mb) };
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::str::from_utf8_mut(mb).unwrap()`
|
| ^^^^^^^^^^^^^^^^^^^^^^^ help: consider using: `std::str::from_utf8_mut(mb).unwrap()`
|
||||||
|
|
||||||
error: transmute from a pointer to a pointer
|
error: aborting due to 22 previous errors
|
||||||
--> $DIR/transmute.rs:163:29
|
|
||||||
|
|
|
||||||
LL | let _: *const f32 = std::mem::transmute(ptr);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `ptr as *const f32`
|
|
||||||
|
|
|
||||||
= note: `-D clippy::transmute-ptr-to-ptr` implied by `-D warnings`
|
|
||||||
|
|
||||||
error: transmute from a pointer to a pointer
|
|
||||||
--> $DIR/transmute.rs:164:27
|
|
||||||
|
|
|
||||||
LL | let _: *mut f32 = std::mem::transmute(mut_ptr);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `mut_ptr as *mut f32`
|
|
||||||
|
|
||||||
error: transmute from a reference to a reference
|
|
||||||
--> $DIR/transmute.rs:166:23
|
|
||||||
|
|
|
||||||
LL | let _: &f32 = std::mem::transmute(&1u32);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&1u32 as *const u32 as *const f32)`
|
|
||||||
|
|
||||||
error: transmute from a reference to a reference
|
|
||||||
--> $DIR/transmute.rs:167:23
|
|
||||||
|
|
|
||||||
LL | let _: &f64 = std::mem::transmute(&1f32);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&1f32 as *const f32 as *const f64)`
|
|
||||||
|
|
||||||
error: transmute from a reference to a reference
|
|
||||||
--> $DIR/transmute.rs:170:27
|
|
||||||
|
|
|
||||||
LL | let _: &mut f32 = std::mem::transmute(&mut 1u32);
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(&mut 1u32 as *mut u32 as *mut f32)`
|
|
||||||
|
|
||||||
error: transmute from a reference to a reference
|
|
||||||
--> $DIR/transmute.rs:171:37
|
|
||||||
|
|
|
||||||
LL | let _: &GenericParam<f32> = std::mem::transmute(&GenericParam { t: 1u32 });
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&GenericParam { t: 1u32 } as *const GenericParam<u32> as *const GenericParam<f32>)`
|
|
||||||
|
|
||||||
error: aborting due to 38 previous errors
|
|
||||||
|
|
||||||
|
54
tests/ui/transmute_ptr_to_ptr.rs
Normal file
54
tests/ui/transmute_ptr_to_ptr.rs
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#![warn(clippy::transmute_ptr_to_ptr)]
|
||||||
|
|
||||||
|
// Make sure we can modify lifetimes, which is one of the recommended uses
|
||||||
|
// of transmute
|
||||||
|
|
||||||
|
// Make sure we can do static lifetime transmutes
|
||||||
|
unsafe fn transmute_lifetime_to_static<'a, T>(t: &'a T) -> &'static T {
|
||||||
|
std::mem::transmute::<&'a T, &'static T>(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we can do non-static lifetime transmutes
|
||||||
|
unsafe fn transmute_lifetime<'a, 'b, T>(t: &'a T, u: &'b T) -> &'b T {
|
||||||
|
std::mem::transmute::<&'a T, &'b T>(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LifetimeParam<'a> {
|
||||||
|
s: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GenericParam<T> {
|
||||||
|
t: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn transmute_ptr_to_ptr() {
|
||||||
|
let ptr = &1u32 as *const u32;
|
||||||
|
let mut_ptr = &mut 1u32 as *mut u32;
|
||||||
|
unsafe {
|
||||||
|
// pointer-to-pointer transmutes; bad
|
||||||
|
let _: *const f32 = std::mem::transmute(ptr);
|
||||||
|
let _: *mut f32 = std::mem::transmute(mut_ptr);
|
||||||
|
// ref-ref transmutes; bad
|
||||||
|
let _: &f32 = std::mem::transmute(&1u32);
|
||||||
|
let _: &f64 = std::mem::transmute(&1f32);
|
||||||
|
// ^ this test is here because both f32 and f64 are the same TypeVariant, but they are not
|
||||||
|
// the same type
|
||||||
|
let _: &mut f32 = std::mem::transmute(&mut 1u32);
|
||||||
|
let _: &GenericParam<f32> = std::mem::transmute(&GenericParam { t: 1u32 });
|
||||||
|
}
|
||||||
|
|
||||||
|
// these are recommendations for solving the above; if these lint we need to update
|
||||||
|
// those suggestions
|
||||||
|
let _ = ptr as *const f32;
|
||||||
|
let _ = mut_ptr as *mut f32;
|
||||||
|
let _ = unsafe { &*(&1u32 as *const u32 as *const f32) };
|
||||||
|
let _ = unsafe { &mut *(&mut 1u32 as *mut u32 as *mut f32) };
|
||||||
|
|
||||||
|
// transmute internal lifetimes, should not lint
|
||||||
|
let s = "hello world".to_owned();
|
||||||
|
let lp = LifetimeParam { s: &s };
|
||||||
|
let _: &LifetimeParam<'static> = unsafe { std::mem::transmute(&lp) };
|
||||||
|
let _: &GenericParam<&LifetimeParam<'static>> = unsafe { std::mem::transmute(&GenericParam { t: &lp }) };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
40
tests/ui/transmute_ptr_to_ptr.stderr
Normal file
40
tests/ui/transmute_ptr_to_ptr.stderr
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
error: transmute from a pointer to a pointer
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:29:29
|
||||||
|
|
|
||||||
|
LL | let _: *const f32 = std::mem::transmute(ptr);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `ptr as *const f32`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::transmute-ptr-to-ptr` implied by `-D warnings`
|
||||||
|
|
||||||
|
error: transmute from a pointer to a pointer
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:30:27
|
||||||
|
|
|
||||||
|
LL | let _: *mut f32 = std::mem::transmute(mut_ptr);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `mut_ptr as *mut f32`
|
||||||
|
|
||||||
|
error: transmute from a reference to a reference
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:32:23
|
||||||
|
|
|
||||||
|
LL | let _: &f32 = std::mem::transmute(&1u32);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&1u32 as *const u32 as *const f32)`
|
||||||
|
|
||||||
|
error: transmute from a reference to a reference
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:33:23
|
||||||
|
|
|
||||||
|
LL | let _: &f64 = std::mem::transmute(&1f32);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&1f32 as *const f32 as *const f64)`
|
||||||
|
|
||||||
|
error: transmute from a reference to a reference
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:36:27
|
||||||
|
|
|
||||||
|
LL | let _: &mut f32 = std::mem::transmute(&mut 1u32);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(&mut 1u32 as *mut u32 as *mut f32)`
|
||||||
|
|
||||||
|
error: transmute from a reference to a reference
|
||||||
|
--> $DIR/transmute_ptr_to_ptr.rs:37:37
|
||||||
|
|
|
||||||
|
LL | let _: &GenericParam<f32> = std::mem::transmute(&GenericParam { t: 1u32 });
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(&GenericParam { t: 1u32 } as *const GenericParam<u32> as *const GenericParam<f32>)`
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
41
tests/ui/transmute_ptr_to_ref.rs
Normal file
41
tests/ui/transmute_ptr_to_ref.rs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#![warn(clippy::transmute_ptr_to_ref)]
|
||||||
|
|
||||||
|
unsafe fn _ptr_to_ref<T, U>(p: *const T, m: *mut T, o: *const U, om: *mut U) {
|
||||||
|
let _: &T = std::mem::transmute(p);
|
||||||
|
let _: &T = &*p;
|
||||||
|
|
||||||
|
let _: &mut T = std::mem::transmute(m);
|
||||||
|
let _: &mut T = &mut *m;
|
||||||
|
|
||||||
|
let _: &T = std::mem::transmute(m);
|
||||||
|
let _: &T = &*m;
|
||||||
|
|
||||||
|
let _: &mut T = std::mem::transmute(p as *mut T);
|
||||||
|
let _ = &mut *(p as *mut T);
|
||||||
|
|
||||||
|
let _: &T = std::mem::transmute(o);
|
||||||
|
let _: &T = &*(o as *const T);
|
||||||
|
|
||||||
|
let _: &mut T = std::mem::transmute(om);
|
||||||
|
let _: &mut T = &mut *(om as *mut T);
|
||||||
|
|
||||||
|
let _: &T = std::mem::transmute(om);
|
||||||
|
let _: &T = &*(om as *const T);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn issue1231() {
|
||||||
|
struct Foo<'a, T> {
|
||||||
|
bar: &'a T,
|
||||||
|
}
|
||||||
|
|
||||||
|
let raw = 42 as *const i32;
|
||||||
|
let _: &Foo<u8> = unsafe { std::mem::transmute::<_, &Foo<_>>(raw) };
|
||||||
|
|
||||||
|
let _: &Foo<&u8> = unsafe { std::mem::transmute::<_, &Foo<&_>>(raw) };
|
||||||
|
|
||||||
|
type Bar<'a> = &'a u8;
|
||||||
|
let raw = 42 as *const i32;
|
||||||
|
unsafe { std::mem::transmute::<_, Bar>(raw) };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
64
tests/ui/transmute_ptr_to_ref.stderr
Normal file
64
tests/ui/transmute_ptr_to_ref.stderr
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
error: transmute from a pointer type (`*const T`) to a reference type (`&T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:4:17
|
||||||
|
|
|
||||||
|
LL | let _: &T = std::mem::transmute(p);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*p`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::transmute-ptr-to-ref` implied by `-D warnings`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*mut T`) to a reference type (`&mut T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:7:21
|
||||||
|
|
|
||||||
|
LL | let _: &mut T = std::mem::transmute(m);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *m`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*mut T`) to a reference type (`&T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:10:17
|
||||||
|
|
|
||||||
|
LL | let _: &T = std::mem::transmute(m);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*m`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*mut T`) to a reference type (`&mut T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:13:21
|
||||||
|
|
|
||||||
|
LL | let _: &mut T = std::mem::transmute(p as *mut T);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(p as *mut T)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*const U`) to a reference type (`&T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:16:17
|
||||||
|
|
|
||||||
|
LL | let _: &T = std::mem::transmute(o);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(o as *const T)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*mut U`) to a reference type (`&mut T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:19:21
|
||||||
|
|
|
||||||
|
LL | let _: &mut T = std::mem::transmute(om);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&mut *(om as *mut T)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*mut U`) to a reference type (`&T`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:22:17
|
||||||
|
|
|
||||||
|
LL | let _: &T = std::mem::transmute(om);
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(om as *const T)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*const i32`) to a reference type (`&issue1231::Foo<'_, u8>`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:32:32
|
||||||
|
|
|
||||||
|
LL | let _: &Foo<u8> = unsafe { std::mem::transmute::<_, &Foo<_>>(raw) };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const Foo<_>)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*const i32`) to a reference type (`&issue1231::Foo<'_, &u8>`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:34:33
|
||||||
|
|
|
||||||
|
LL | let _: &Foo<&u8> = unsafe { std::mem::transmute::<_, &Foo<&_>>(raw) };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const Foo<&_>)`
|
||||||
|
|
||||||
|
error: transmute from a pointer type (`*const i32`) to a reference type (`&u8`)
|
||||||
|
--> $DIR/transmute_ptr_to_ref.rs:38:14
|
||||||
|
|
|
||||||
|
LL | unsafe { std::mem::transmute::<_, Bar>(raw) };
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `&*(raw as *const u8)`
|
||||||
|
|
||||||
|
error: aborting due to 10 previous errors
|
||||||
|
|
Loading…
Reference in New Issue
Block a user