unsafe_op_in_unsafe_fn Uyarısı
Özet
unsafe_op_in_unsafe_fnlint’i artık varsayılan olarak uyarı verir. Bu uyarı, unsafe fonksiyonların içinde açıkunsafeblok olmadan yapılan unsafe işlem çağrılarını tespit eder.
Ayrıntılar
unsafe_op_in_unsafe_fn lint’i, unsafe bir fonksiyon içinde açık bir
unsafe {} bloğu olmadan [unsafe işlemler] varsa tetiklenir.
#![allow(unused)]
fn main() {
#![warn(unsafe_op_in_unsafe_fn)]
unsafe fn get_unchecked<T>(x: &[T], i: usize) -> &T {
x.get_unchecked(i) // UYARI: unsafe blok gerekir
}
}
Çözüm, unsafe işlemleri bir unsafe blok içine almaktır:
#![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) }
}
}
Bu değişikliğin amacı, unsafe fonksiyon içinde unsafe işlemlerin yanlışlıkla
kullanılmasına karşı koruma sağlamaktır. unsafe fonksiyon anahtar kelimesi
eskiden iki görev üstleniyordu. Birincisi, fonksiyonu çağırmanın unsafe
olduğunu ve ek güvenlik koşullarını sağlamanın çağıranın sorumluluğunda
bulunduğunu bildirmekti. İkincisi ise fonksiyon içinde unsafe işlemlere izin
vermekti. Bu ikinci rolün, açık unsafe bloklar olmadan fazla riskli olduğuna
karar verildi.
Daha fazla bilgi ve gerekçe için RFC #2585’e bakabilirsiniz.
Taşıma
unsafe_op_in_unsafe_fn lint’i, rust-2024-compatibility lint grubunun
parçasıdır. Kodunuzu Rust 2024 ile uyumlu hale getirmek için şunu çalıştırın:
cargo fix --edition
Alternatif olarak, unsafe blok eklenmesi gereken yerleri bulmak için lint’i
elle etkinleştirebilir ya da tamamen susturmak için allow yapabilirsiniz.
#![allow(unused)]
fn main() {
// Elle taşıma yapmak için bunu crate köküne ekleyin.
#![warn(unsafe_op_in_unsafe_fn)]
}