Rollup merge of #145941 - Urgau:int_to_ptr_transmutes-unsized, r=lcnr

Disable `integer_to_ptr_transmutes` suggestion for unsized types

This PR disables the machine-applicable `integer_to_ptr_transmutes` lint suggestion for unsized types, as [`std::ptr::with_exposed_provenance`](https://doc.rust-lang.org/std/ptr/fn.with_exposed_provenance.html) requires sized types.

We should probably mention [`std::ptr::from_raw_parts`](https://doc.rust-lang.org/std/ptr/fn.from_raw_parts.html) when it becomes stable.

Related to https://github.com/rust-lang/rust/issues/145935
This commit is contained in:
Stuart Cook 2025-08-28 23:10:37 +10:00 committed by GitHub
commit 72727b1654
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 69 additions and 13 deletions

View File

@ -1554,7 +1554,7 @@ impl<'a> LintDiagnostic<'a, ()> for DropGlue<'_> {
#[help(lint_help_exposed_provenance)] #[help(lint_help_exposed_provenance)]
pub(crate) struct IntegerToPtrTransmutes<'tcx> { pub(crate) struct IntegerToPtrTransmutes<'tcx> {
#[subdiagnostic] #[subdiagnostic]
pub suggestion: IntegerToPtrTransmutesSuggestion<'tcx>, pub suggestion: Option<IntegerToPtrTransmutesSuggestion<'tcx>>,
} }
#[derive(Subdiagnostic)] #[derive(Subdiagnostic)]

View File

@ -169,19 +169,25 @@ fn check_int_to_ptr_transmute<'tcx>(
expr.hir_id, expr.hir_id,
expr.span, expr.span,
IntegerToPtrTransmutes { IntegerToPtrTransmutes {
suggestion: if dst.is_ref() { suggestion: if layout_inner_ty.is_sized() {
IntegerToPtrTransmutesSuggestion::ToRef { Some(if dst.is_ref() {
dst: *inner_ty, IntegerToPtrTransmutesSuggestion::ToRef {
suffix, dst: *inner_ty,
ref_mutbl: mutbl.prefix_str(), suffix,
start_call: expr.span.shrink_to_lo().until(arg.span), ref_mutbl: mutbl.prefix_str(),
} start_call: expr.span.shrink_to_lo().until(arg.span),
}
} else {
IntegerToPtrTransmutesSuggestion::ToPtr {
dst: *inner_ty,
suffix,
start_call: expr.span.shrink_to_lo().until(arg.span),
}
})
} else { } else {
IntegerToPtrTransmutesSuggestion::ToPtr { // We can't suggest using `with_exposed_provenance` for unsized type
dst: *inner_ty, // so don't suggest anything.
suffix, None
start_call: expr.span.shrink_to_lo().until(arg.span),
}
}, },
}, },
); );

View File

@ -0,0 +1,23 @@
// Checks for the `integer_to_pointer_transmutes` lint with unsized types
//
// Related to https://github.com/rust-lang/rust/issues/145935
//@ check-pass
#![allow(non_camel_case_types)]
#![allow(unused_unsafe)]
#[cfg(target_pointer_width = "64")]
type usizemetadata = i128;
#[cfg(target_pointer_width = "32")]
type usizemetadata = i64;
unsafe fn unsized_type(a: usize) {
let _ref = unsafe { std::mem::transmute::<usizemetadata, &'static str>(0xff) };
//~^ WARN transmuting an integer to a pointer
let _ptr = unsafe { std::mem::transmute::<usizemetadata, *const [u8]>(0xff) };
//~^ WARN transmuting an integer to a pointer
}
fn main() {}

View File

@ -0,0 +1,27 @@
warning: transmuting an integer to a pointer creates a pointer without provenance
--> $DIR/int_to_ptr-unsized.rs:17:25
|
LL | let _ref = unsafe { std::mem::transmute::<usizemetadata, &'static str>(0xff) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this is dangerous because dereferencing the resulting pointer is undefined behavior
= note: exposed provenance semantics can be used to create a pointer based on some previously exposed provenance
= help: if you truly mean to create a pointer without provenance, use `std::ptr::without_provenance_mut`
= help: for more information about transmute, see <https://doc.rust-lang.org/std/mem/fn.transmute.html#transmutation-between-pointers-and-integers>
= help: for more information about exposed provenance, see <https://doc.rust-lang.org/std/ptr/index.html#exposed-provenance>
= note: `#[warn(integer_to_ptr_transmutes)]` on by default
warning: transmuting an integer to a pointer creates a pointer without provenance
--> $DIR/int_to_ptr-unsized.rs:19:25
|
LL | let _ptr = unsafe { std::mem::transmute::<usizemetadata, *const [u8]>(0xff) };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this is dangerous because dereferencing the resulting pointer is undefined behavior
= note: exposed provenance semantics can be used to create a pointer based on some previously exposed provenance
= help: if you truly mean to create a pointer without provenance, use `std::ptr::without_provenance_mut`
= help: for more information about transmute, see <https://doc.rust-lang.org/std/mem/fn.transmute.html#transmutation-between-pointers-and-integers>
= help: for more information about exposed provenance, see <https://doc.rust-lang.org/std/ptr/index.html#exposed-provenance>
warning: 2 warnings emitted