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