rust: enable clippy::undocumented_unsafe_blocks lint
Checking that we are not missing any `// SAFETY` comments in our `unsafe` blocks is something we have wanted to do for a long time, as well as cleaning up the remaining cases that were not documented [1]. Back when Rust for Linux started, this was something that could have been done via a script, like Rust's `tidy`. Soon after, in Rust 1.58.0, Clippy implemented the `undocumented_unsafe_blocks` lint [2]. Even though the lint has a few false positives, e.g. in some cases where attributes appear between the comment and the `unsafe` block [3], there are workarounds and the lint seems quite usable already. Thus enable the lint now. We still have a few cases to clean up, so just allow those for the moment by writing a `TODO` comment -- some of those may be good candidates for new contributors. Link: https://github.com/Rust-for-Linux/linux/issues/351 [1] Link: https://rust-lang.github.io/rust-clippy/master/#/undocumented_unsafe_blocks [2] Link: https://github.com/rust-lang/rust-clippy/issues/13189 [3] Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Trevor Gross <tmgross@umich.edu> Tested-by: Gary Guo <gary@garyguo.net> Reviewed-by: Gary Guo <gary@garyguo.net> Link: https://lore.kernel.org/r/20240904204347.168520-5-ojeda@kernel.org Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
This commit is contained in:
@@ -112,10 +112,12 @@ impl<T: ?Sized> Clone for AllData<T> {
|
||||
|
||||
impl<T: ?Sized> Copy for AllData<T> {}
|
||||
|
||||
// SAFETY: TODO.
|
||||
unsafe impl<T: ?Sized> InitData for AllData<T> {
|
||||
type Datee = T;
|
||||
}
|
||||
|
||||
// SAFETY: TODO.
|
||||
unsafe impl<T: ?Sized> HasInitData for T {
|
||||
type InitData = AllData<T>;
|
||||
|
||||
|
||||
@@ -513,6 +513,7 @@ macro_rules! __pinned_drop {
|
||||
}
|
||||
),
|
||||
) => {
|
||||
// SAFETY: TODO.
|
||||
unsafe $($impl_sig)* {
|
||||
// Inherit all attributes and the type/ident tokens for the signature.
|
||||
$(#[$($attr)*])*
|
||||
@@ -872,6 +873,7 @@ macro_rules! __pin_data {
|
||||
}
|
||||
}
|
||||
|
||||
// SAFETY: TODO.
|
||||
unsafe impl<$($impl_generics)*>
|
||||
$crate::init::__internal::PinData for __ThePinData<$($ty_generics)*>
|
||||
where $($whr)*
|
||||
@@ -997,6 +999,7 @@ macro_rules! __pin_data {
|
||||
slot: *mut $p_type,
|
||||
init: impl $crate::init::PinInit<$p_type, E>,
|
||||
) -> ::core::result::Result<(), E> {
|
||||
// SAFETY: TODO.
|
||||
unsafe { $crate::init::PinInit::__pinned_init(init, slot) }
|
||||
}
|
||||
)*
|
||||
@@ -1007,6 +1010,7 @@ macro_rules! __pin_data {
|
||||
slot: *mut $type,
|
||||
init: impl $crate::init::Init<$type, E>,
|
||||
) -> ::core::result::Result<(), E> {
|
||||
// SAFETY: TODO.
|
||||
unsafe { $crate::init::Init::__init(init, slot) }
|
||||
}
|
||||
)*
|
||||
@@ -1121,6 +1125,8 @@ macro_rules! __init_internal {
|
||||
// no possibility of returning without `unsafe`.
|
||||
struct __InitOk;
|
||||
// Get the data about fields from the supplied type.
|
||||
//
|
||||
// SAFETY: TODO.
|
||||
let data = unsafe {
|
||||
use $crate::init::__internal::$has_data;
|
||||
// Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
|
||||
@@ -1176,6 +1182,7 @@ macro_rules! __init_internal {
|
||||
let init = move |slot| -> ::core::result::Result<(), $err> {
|
||||
init(slot).map(|__InitOk| ())
|
||||
};
|
||||
// SAFETY: TODO.
|
||||
let init = unsafe { $crate::init::$construct_closure::<_, $err>(init) };
|
||||
init
|
||||
}};
|
||||
@@ -1324,6 +1331,8 @@ macro_rules! __init_internal {
|
||||
// Endpoint, nothing more to munch, create the initializer.
|
||||
// Since we are in the closure that is never called, this will never get executed.
|
||||
// We abuse `slot` to get the correct type inference here:
|
||||
//
|
||||
// SAFETY: TODO.
|
||||
unsafe {
|
||||
// Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
|
||||
// information that is associated to already parsed fragments, so a path fragment
|
||||
|
||||
Reference in New Issue
Block a user