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

Güvensiz extern Blokları

Özet

  • [extern blokları] artık unsafe anahtar 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)]
}

  1. See RFC 3484 for the original proposal.