Güvensiz extern Blokları
Özet
- [
externblokları] artıkunsafeanahtar kelimesiyle işaretlenmelidir.
Ayrıntılar
Rust 1.82, tüm sürümlerde [extern bloklarını] unsafe anahtar kelimesiyle
işaretleme yeteneğini ekledi.1 unsafe anahtar kelimesini eklemek,
imzaların doğru olmasını sağlama sorumluluğunun extern bloğunu yazan kişiye
ait olduğunu vurgular. İmzalar doğru değilse tanımsız davranış oluşabilir.
Güvensiz bir extern bloğunun sözdizimi şöyledir:
#![allow(unused)]
fn main() {
unsafe extern "C" {
// sqrt (libm içinden), her `f64` ile çağrılabilir
pub safe fn sqrt(x: f64) -> f64;
// strlen (libc içinden), geçerli bir işaretçi ister,
// bu yüzden onu unsafe fn olarak işaretliyoruz
pub unsafe fn strlen(p: *const std::ffi::c_char) -> usize;
// bu fonksiyon safe ya da unsafe demiyor; bu yüzden varsayılanı unsafe olur
pub fn free(p: *mut core::ffi::c_void);
pub safe static IMPORTANT_BYTES: [u8; 256];
}
}
Bir extern bloğunu unsafe olarak işaretlemenin yanında, blok içindeki tekil
öğelerin safe ya da unsafe olduğunu da belirtebilirsiniz. safe olarak
işaretlenen öğeler unsafe blok olmadan kullanılabilir.
2024 sürümüyle birlikte extern bloklarının üzerine unsafe yazmak zorunlu oldu.
Bunun amacı, extern tanımlarının uyması gereken güvenlik koşullarını çok açık
hale getirmektir.
Taşıma
missing_unsafe_on_extern lint’i, extern bloklarına unsafe anahtar
kelimesini ekleyebilir. Bu lint, otomatik sürüm taşımasına dahil olan
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
Ancak otomatik taşımanın extern bloğundaki imzaların gerçekten doğru olup
olmadığını doğrulayamayacağını unutmayın. Bunları elle gözden geçirmek hâlâ
sizin sorumluluğunuzdadır.
Alternatif olarak, güncellenmesi gereken extern bloklarını bulmak için lint’i
elle etkinleştirebilirsiniz.
#![allow(unused)]
fn main() {
// Elle taşıma yapmak için bunu crate köküne ekleyin.
#![warn(missing_unsafe_on_extern)]
}