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