mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-02 10:18:25 +00:00
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:
commit
72727b1654
@ -1554,7 +1554,7 @@ impl<'a> LintDiagnostic<'a, ()> for DropGlue<'_> {
|
||||
#[help(lint_help_exposed_provenance)]
|
||||
pub(crate) struct IntegerToPtrTransmutes<'tcx> {
|
||||
#[subdiagnostic]
|
||||
pub suggestion: IntegerToPtrTransmutesSuggestion<'tcx>,
|
||||
pub suggestion: Option<IntegerToPtrTransmutesSuggestion<'tcx>>,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
|
@ -169,19 +169,25 @@ fn check_int_to_ptr_transmute<'tcx>(
|
||||
expr.hir_id,
|
||||
expr.span,
|
||||
IntegerToPtrTransmutes {
|
||||
suggestion: if dst.is_ref() {
|
||||
IntegerToPtrTransmutesSuggestion::ToRef {
|
||||
dst: *inner_ty,
|
||||
suffix,
|
||||
ref_mutbl: mutbl.prefix_str(),
|
||||
start_call: expr.span.shrink_to_lo().until(arg.span),
|
||||
}
|
||||
suggestion: if layout_inner_ty.is_sized() {
|
||||
Some(if dst.is_ref() {
|
||||
IntegerToPtrTransmutesSuggestion::ToRef {
|
||||
dst: *inner_ty,
|
||||
suffix,
|
||||
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 {
|
||||
IntegerToPtrTransmutesSuggestion::ToPtr {
|
||||
dst: *inner_ty,
|
||||
suffix,
|
||||
start_call: expr.span.shrink_to_lo().until(arg.span),
|
||||
}
|
||||
// We can't suggest using `with_exposed_provenance` for unsized type
|
||||
// so don't suggest anything.
|
||||
None
|
||||
},
|
||||
},
|
||||
);
|
||||
|
23
tests/ui/lint/int_to_ptr-unsized.rs
Normal file
23
tests/ui/lint/int_to_ptr-unsized.rs
Normal 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() {}
|
27
tests/ui/lint/int_to_ptr-unsized.stderr
Normal file
27
tests/ui/lint/int_to_ptr-unsized.stderr
Normal 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
|
||||
|
Loading…
x
Reference in New Issue
Block a user