unsafe_op_in_unsafe_fn 警告

概要

  • unsafe_op_in_unsafe_fn lint 现在默认发出警告。此警告检测在 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 代码块中

#![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 代码块。

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

迁移

unsafe_op_in_unsafe_fn lint 是 rust-2024-compatibility lint 组的一部分。为了迁移您的代码以兼容 Rust 2024 Edition,请运行

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)]
}