mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-08-14 06:22:34 +02:00
Starting with Rust 1.98.0 (expected 2026-08-20), Rust is introducing a
couple new lints, `invalid_runtime_symbol_definitions` (deny-by-default)
and `suspicious_runtime_symbol_definitions` (warn-by-default), which check
the signature of items whose symbol name is a runtime symbol expected by
`core`.
Our build hits the second one, i.e. the warning:
error: suspicious definition of the runtime `strlen` symbol used by the standard library
--> rust/bindings/bindings_generated.rs:20018:5
|
20018 | pub fn strlen(s: *const ffi::c_char) -> usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: expected `unsafe extern "C" fn(*const i8) -> usize`
found `unsafe extern "C" fn(*const u8) -> usize`
= help: either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = "strlen")]`, or `#[link_name = "strlen"]`
= help: allow this lint if the signature is compatible
= note: `-D suspicious-runtime-symbol-definitions` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(suspicious_runtime_symbol_definitions)]`
error: suspicious definition of the runtime `strlen` symbol used by the standard library
--> rust/uapi/uapi_generated.rs:14236:5
|
14236 | pub fn strlen(s: *const ffi::c_char) -> usize;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: expected `unsafe extern "C" fn(*const i8) -> usize`
found `unsafe extern "C" fn(*const u8) -> usize`
= help: either fix the signature or remove any attributes like `#[unsafe(no_mangle)]`, `#[unsafe(export_name = "strlen")]`, or `#[link_name = "strlen"]`
= help: allow this lint if the signature is compatible
= note: `-D suspicious-runtime-symbol-definitions` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(suspicious_runtime_symbol_definitions)]`
Thus `allow` the lint in `bindings` and `uapi`.
A more targeted alternative to avoid `allow`ing it would be to pass
`--blocklist-function strlen` to `bindgen`, but we would perhaps need
to adjust if other C headers end up adding more (or Rust checking more).
Since it is just the less critical one that we hit, and since eventually
this should be properly fixed by getting upstream Rust to provide a flag
like GCC/Clang's `-funsigned-char` [2][3], just `allow` it for now.
Cc: Urgau <urgau@numericable.fr>
Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs).
Link: https://github.com/rust-lang/rust/pull/155521 [1]
Link: https://github.com/rust-lang/rust/issues/138446 [2]
Link: https://github.com/Rust-for-Linux/linux/issues/355 [3]
Reviewed-by: Gary Guo <gary@garyguo.net>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Reviewed-by: Tamir Duberstein <tamird@kernel.org>
Link: https://patch.msgid.link/20260615143225.471756-1-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
84 lines
2.3 KiB
Rust
84 lines
2.3 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Bindings.
|
|
//!
|
|
//! Imports the generated bindings by `bindgen`.
|
|
//!
|
|
//! This crate may not be directly used. If you need a kernel C API that is
|
|
//! not ported or wrapped in the `kernel` crate, then do so first instead of
|
|
//! using this crate.
|
|
|
|
#![no_std]
|
|
#![allow(
|
|
clippy::all,
|
|
missing_docs,
|
|
non_camel_case_types,
|
|
non_upper_case_globals,
|
|
non_snake_case,
|
|
improper_ctypes,
|
|
unreachable_pub,
|
|
unsafe_op_in_unsafe_fn
|
|
)]
|
|
#![feature(cfi_encoding)]
|
|
|
|
#[allow(dead_code)]
|
|
#[allow(clippy::cast_lossless)]
|
|
#[allow(clippy::ptr_as_ptr)]
|
|
#[allow(clippy::ref_as_ptr)]
|
|
#[allow(clippy::undocumented_unsafe_blocks)]
|
|
#[cfg_attr(CONFIG_RUSTC_HAS_UNNECESSARY_TRANSMUTES, allow(unnecessary_transmutes))]
|
|
#[cfg_attr(
|
|
CONFIG_RUSTC_HAS_SUSPICIOUS_RUNTIME_SYMBOL_DEFINITIONS,
|
|
allow(suspicious_runtime_symbol_definitions)
|
|
)]
|
|
mod bindings_raw {
|
|
use pin_init::{MaybeZeroable, Zeroable};
|
|
|
|
// Manual definition for blocklisted types.
|
|
type __kernel_size_t = usize;
|
|
type __kernel_ssize_t = isize;
|
|
type __kernel_ptrdiff_t = isize;
|
|
|
|
// `bindgen` doesn't automatically do this, see
|
|
// <https://github.com/rust-lang/rust-bindgen/issues/3196>
|
|
//
|
|
// SAFETY: `__BindgenBitfieldUnit<Storage>` is a newtype around `Storage`.
|
|
unsafe impl<Storage> Zeroable for __BindgenBitfieldUnit<Storage> where Storage: Zeroable {}
|
|
|
|
// Use glob import here to expose all helpers.
|
|
// Symbols defined within the module will take precedence to the glob import.
|
|
pub use super::bindings_helper::*;
|
|
include!(concat!(
|
|
env!("OBJTREE"),
|
|
"/rust/bindings/bindings_generated.rs"
|
|
));
|
|
}
|
|
|
|
// When both a directly exposed symbol and a helper exists for the same function,
|
|
// the directly exposed symbol is preferred and the helper becomes dead code, so
|
|
// ignore the warning here.
|
|
#[allow(dead_code)]
|
|
mod bindings_helper {
|
|
// Import the generated bindings for types.
|
|
use super::bindings_raw::*;
|
|
include!(concat!(
|
|
env!("OBJTREE"),
|
|
"/rust/bindings/bindings_helpers_generated.rs"
|
|
));
|
|
}
|
|
|
|
pub use bindings_raw::*;
|
|
|
|
pub const compat_ptr_ioctl: Option<
|
|
unsafe extern "C" fn(*mut file, ffi::c_uint, ffi::c_ulong) -> ffi::c_long,
|
|
> = {
|
|
#[cfg(CONFIG_COMPAT)]
|
|
{
|
|
Some(bindings_raw::compat_ptr_ioctl)
|
|
}
|
|
#[cfg(not(CONFIG_COMPAT))]
|
|
{
|
|
None
|
|
}
|
|
};
|