mirror of
https://github.com/torvalds/linux.git
synced 2025-08-15 14:11:42 +02:00
rust: enable clippy::ref_as_ptr
lint
In Rust 1.78.0, Clippy introduced the `ref_as_ptr` lint [1]: > Using `as` casts may result in silently changing mutability or type. While this doesn't eliminate unchecked `as` conversions, it makes such conversions easier to scrutinize. It also has the slight benefit of removing a degree of freedom on which to bikeshed. Thus apply the changes and enable the lint -- no functional change intended. Link: https://rust-lang.github.io/rust-clippy/master/index.html#ref_as_ptr [1] Suggested-by: Benno Lossin <benno.lossin@proton.me> Link: https://lore.kernel.org/all/D8PGG7NTWB6U.3SS3A5LN4XWMN@proton.me/ Reviewed-by: Benno Lossin <benno.lossin@proton.me> Reviewed-by: Boqun Feng <boqun.feng@gmail.com> Signed-off-by: Tamir Duberstein <tamird@gmail.com> Acked-by: Danilo Krummrich <dakr@kernel.org> Link: https://lore.kernel.org/r/20250615-ptr-as-ptr-v12-6-f43b024581e8@gmail.com Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
parent
b7c8d7a8d2
commit
dc35ddcf97
8 changed files with 15 additions and 20 deletions
1
Makefile
1
Makefile
|
@ -489,6 +489,7 @@ export rust_common_flags := --edition=2021 \
|
||||||
-Wclippy::no_mangle_with_rust_abi \
|
-Wclippy::no_mangle_with_rust_abi \
|
||||||
-Wclippy::ptr_as_ptr \
|
-Wclippy::ptr_as_ptr \
|
||||||
-Wclippy::ptr_cast_constness \
|
-Wclippy::ptr_cast_constness \
|
||||||
|
-Wclippy::ref_as_ptr \
|
||||||
-Wclippy::undocumented_unsafe_blocks \
|
-Wclippy::undocumented_unsafe_blocks \
|
||||||
-Wclippy::unnecessary_safety_comment \
|
-Wclippy::unnecessary_safety_comment \
|
||||||
-Wclippy::unnecessary_safety_doc \
|
-Wclippy::unnecessary_safety_doc \
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[allow(clippy::cast_lossless)]
|
#[allow(clippy::cast_lossless)]
|
||||||
#[allow(clippy::ptr_as_ptr)]
|
#[allow(clippy::ptr_as_ptr)]
|
||||||
|
#[allow(clippy::ref_as_ptr)]
|
||||||
#[allow(clippy::undocumented_unsafe_blocks)]
|
#[allow(clippy::undocumented_unsafe_blocks)]
|
||||||
#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
|
#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
|
||||||
mod bindings_raw {
|
mod bindings_raw {
|
||||||
|
|
|
@ -426,7 +426,7 @@ where
|
||||||
};
|
};
|
||||||
|
|
||||||
const fn vtable_ptr() -> *const bindings::configfs_group_operations {
|
const fn vtable_ptr() -> *const bindings::configfs_group_operations {
|
||||||
&Self::VTABLE as *const bindings::configfs_group_operations
|
&Self::VTABLE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,7 +464,7 @@ where
|
||||||
};
|
};
|
||||||
|
|
||||||
const fn vtable_ptr() -> *const bindings::configfs_item_operations {
|
const fn vtable_ptr() -> *const bindings::configfs_item_operations {
|
||||||
&Self::VTABLE as *const bindings::configfs_item_operations
|
&Self::VTABLE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +476,7 @@ impl<Data> ItemOperationsVTable<Subsystem<Data>, Data> {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fn vtable_ptr() -> *const bindings::configfs_item_operations {
|
const fn vtable_ptr() -> *const bindings::configfs_item_operations {
|
||||||
&Self::VTABLE as *const bindings::configfs_item_operations
|
&Self::VTABLE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,11 +717,7 @@ impl<const N: usize, Data> AttributeList<N, Data> {
|
||||||
|
|
||||||
// SAFETY: By function safety requirements, we have exclusive access to
|
// SAFETY: By function safety requirements, we have exclusive access to
|
||||||
// `self` and the reference created below will be exclusive.
|
// `self` and the reference created below will be exclusive.
|
||||||
unsafe {
|
unsafe { (&mut *self.0.get())[I] = core::ptr::from_ref(attribute).cast_mut().cast() };
|
||||||
(&mut *self.0.get())[I] = (attribute as *const Attribute<ID, O, Data>)
|
|
||||||
.cast_mut()
|
|
||||||
.cast()
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -761,9 +757,7 @@ macro_rules! impl_item_type {
|
||||||
ct_owner: owner.as_ptr(),
|
ct_owner: owner.as_ptr(),
|
||||||
ct_group_ops: GroupOperationsVTable::<Data, Child>::vtable_ptr().cast_mut(),
|
ct_group_ops: GroupOperationsVTable::<Data, Child>::vtable_ptr().cast_mut(),
|
||||||
ct_item_ops: ItemOperationsVTable::<$tpe, Data>::vtable_ptr().cast_mut(),
|
ct_item_ops: ItemOperationsVTable::<$tpe, Data>::vtable_ptr().cast_mut(),
|
||||||
ct_attrs: (attributes as *const AttributeList<N, Data>)
|
ct_attrs: core::ptr::from_ref(attributes).cast_mut().cast(),
|
||||||
.cast_mut()
|
|
||||||
.cast(),
|
|
||||||
ct_bin_attrs: core::ptr::null_mut(),
|
ct_bin_attrs: core::ptr::null_mut(),
|
||||||
}),
|
}),
|
||||||
_p: PhantomData,
|
_p: PhantomData,
|
||||||
|
@ -780,9 +774,7 @@ macro_rules! impl_item_type {
|
||||||
ct_owner: owner.as_ptr(),
|
ct_owner: owner.as_ptr(),
|
||||||
ct_group_ops: core::ptr::null_mut(),
|
ct_group_ops: core::ptr::null_mut(),
|
||||||
ct_item_ops: ItemOperationsVTable::<$tpe, Data>::vtable_ptr().cast_mut(),
|
ct_item_ops: ItemOperationsVTable::<$tpe, Data>::vtable_ptr().cast_mut(),
|
||||||
ct_attrs: (attributes as *const AttributeList<N, Data>)
|
ct_attrs: core::ptr::from_ref(attributes).cast_mut().cast(),
|
||||||
.cast_mut()
|
|
||||||
.cast(),
|
|
||||||
ct_bin_attrs: core::ptr::null_mut(),
|
ct_bin_attrs: core::ptr::null_mut(),
|
||||||
}),
|
}),
|
||||||
_p: PhantomData,
|
_p: PhantomData,
|
||||||
|
|
|
@ -136,7 +136,7 @@ impl<T: RawDeviceId, U, const N: usize> IdTable<T, U> for IdArray<T, U, N> {
|
||||||
fn as_ptr(&self) -> *const T::RawType {
|
fn as_ptr(&self) -> *const T::RawType {
|
||||||
// This cannot be `self.ids.as_ptr()`, as the return pointer must have correct provenance
|
// This cannot be `self.ids.as_ptr()`, as the return pointer must have correct provenance
|
||||||
// to access the sentinel.
|
// to access the sentinel.
|
||||||
(self as *const Self).cast()
|
core::ptr::from_ref(self).cast()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn id(&self, index: usize) -> &T::RawType {
|
fn id(&self, index: usize) -> &T::RawType {
|
||||||
|
|
|
@ -366,7 +366,7 @@ impl core::ops::Deref for File {
|
||||||
//
|
//
|
||||||
// By the type invariants, there are no `fdget_pos` calls that did not take the
|
// By the type invariants, there are no `fdget_pos` calls that did not take the
|
||||||
// `f_pos_lock` mutex.
|
// `f_pos_lock` mutex.
|
||||||
unsafe { LocalFile::from_raw_file((self as *const Self).cast()) }
|
unsafe { LocalFile::from_raw_file(core::ptr::from_ref(self).cast()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ impl BStr {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub const fn from_bytes(bytes: &[u8]) -> &Self {
|
pub const fn from_bytes(bytes: &[u8]) -> &Self {
|
||||||
// SAFETY: `BStr` is transparent to `[u8]`.
|
// SAFETY: `BStr` is transparent to `[u8]`.
|
||||||
unsafe { &*(bytes as *const [u8] as *const BStr) }
|
unsafe { &*(core::ptr::from_ref(bytes) as *const BStr) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Strip a prefix from `self`. Delegates to [`slice::strip_prefix`].
|
/// Strip a prefix from `self`. Delegates to [`slice::strip_prefix`].
|
||||||
|
@ -290,7 +290,7 @@ impl CStr {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub unsafe fn from_bytes_with_nul_unchecked_mut(bytes: &mut [u8]) -> &mut CStr {
|
pub unsafe fn from_bytes_with_nul_unchecked_mut(bytes: &mut [u8]) -> &mut CStr {
|
||||||
// SAFETY: Properties of `bytes` guaranteed by the safety precondition.
|
// SAFETY: Properties of `bytes` guaranteed by the safety precondition.
|
||||||
unsafe { &mut *(bytes as *mut [u8] as *mut CStr) }
|
unsafe { &mut *(core::ptr::from_mut(bytes) as *mut CStr) }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a C pointer to the string.
|
/// Returns a C pointer to the string.
|
||||||
|
|
|
@ -240,7 +240,7 @@ impl UserSliceReader {
|
||||||
pub fn read_slice(&mut self, out: &mut [u8]) -> Result {
|
pub fn read_slice(&mut self, out: &mut [u8]) -> Result {
|
||||||
// SAFETY: The types are compatible and `read_raw` doesn't write uninitialized bytes to
|
// SAFETY: The types are compatible and `read_raw` doesn't write uninitialized bytes to
|
||||||
// `out`.
|
// `out`.
|
||||||
let out = unsafe { &mut *(out as *mut [u8] as *mut [MaybeUninit<u8>]) };
|
let out = unsafe { &mut *(core::ptr::from_mut(out) as *mut [MaybeUninit<u8>]) };
|
||||||
self.read_raw(out)
|
self.read_raw(out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ impl UserSliceWriter {
|
||||||
let res = unsafe {
|
let res = unsafe {
|
||||||
bindings::_copy_to_user(
|
bindings::_copy_to_user(
|
||||||
self.ptr as *mut c_void,
|
self.ptr as *mut c_void,
|
||||||
(value as *const T).cast::<c_void>(),
|
core::ptr::from_ref(value).cast::<c_void>(),
|
||||||
len,
|
len,
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
clippy::all,
|
clippy::all,
|
||||||
clippy::cast_lossless,
|
clippy::cast_lossless,
|
||||||
clippy::ptr_as_ptr,
|
clippy::ptr_as_ptr,
|
||||||
|
clippy::ref_as_ptr,
|
||||||
clippy::undocumented_unsafe_blocks,
|
clippy::undocumented_unsafe_blocks,
|
||||||
dead_code,
|
dead_code,
|
||||||
missing_docs,
|
missing_docs,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue