Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

unsafe_op_in_unsafe_fn Uyarısı

Özet

  • unsafe_op_in_unsafe_fn lint’i artık varsayılan olarak uyarı verir. Bu uyarı, unsafe fonksiyonların içinde açık unsafe blok 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)]
}