unsafe_op_in_unsafe_fn 警告

🚧 2024 版本尚未发布,因此本节仍在“建设中”。

总结

  • unsafe_op_in_unsafe_fn lint 现在默认发出警告。此警告检测在没有显式 unsafe 块的情况下,在 unsafe 函数中调用 unsafe 操作。

详情

如果在没有显式 unsafe {} 的情况下,unsafe 函数中存在 unsafe 操作,则会触发 unsafe_op_in_unsafe_fn lint。

#![allow(unused)]
fn main() {
#![warn(unsafe_op_in_unsafe_fn)]
unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T {
  x.get_unchecked(i) // WARNING: requires unsafe block
}
}

解决方案是将任何 unsafe 操作包装在 unsafe 块中

#![allow(unused)]
fn main() {
#![deny(unsafe_op_in_unsafe_fn)]
unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T {
  unsafe { x.get_unchecked(i) }
}
}

此更改旨在帮助防止在 unsafe 函数中意外使用 unsafe 操作。unsafe 函数关键字执行两个角色。一个是声明*调用*函数需要 unsafe,并且调用者负责维护额外的安全要求。另一个角色是允许在函数内部使用 unsafe 操作。如果没有显式的 unsafe 块,则确定第二个角色风险太大。

更多信息和动机可以在 RFC #2585 中找到。

迁移

unsafe_op_in_unsafe_fn lint 是 rust-2024-compatibility lint 组的一部分。为了将您的代码迁移到与 Rust 2024 版本兼容,请运行

cargo fix --edition

或者,您可以手动启用 lint 以查找需要添加 unsafe 块的位置,或者将其切换为 allow 以完全禁用 lint。

#![allow(unused)]
fn main() {
// Add this to the root of your crate to do a manual migration.
#![warn(unsafe_op_in_unsafe_fn)]
}