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 Öznitelikler

Özet

Ayrıntılar

Rust 1.82, tüm sürümlerde bazı özniteliklerin unsafe olarak işaretlenebilmesini ekledi. Böylece bunların korunması gereken doğruluk/güvenlik koşullarına sahip olduğu belirtilmiş olur.1 Güvensiz bir özniteliğin sözdizimi şöyledir:

#![allow(unused)]
fn main() {
// GUVENLIK: Bu adda başka bir genel fonksiyon yok.
#[unsafe(no_mangle)]
pub fn example() {}
}

Özniteliği unsafe ile işaretlemek, derleyicinin kendi başına doğrulayamayacağı güvenlik koşullarının yerine getirilmesi gerektiğini vurgular.

2024 sürümüyle birlikte bu özniteliklerin unsafe olarak işaretlenmesi zorunlu hale geldi. Aşağıdaki bölümde bu özniteliklerin güvenlik gereksinimleri açıklanır.

Güvenlik gereksinimleri

no_mangle, export_name ve link_section öznitelikleri, öğelerin sembol adlarını ve bağlama davranışını etkiler. Bu özniteliklerin doğru kullanıldığından emin olmak için dikkatli olunmalıdır.

Bağlanan tüm kütüphanelerdeki sembol kümesi tek bir genel ad alanı olduğundan, kütüphaneler arasında sembol adı çakışması varsa sorun çıkabilir. Normal tanımlı fonksiyonlarda bu genelde sorun olmaz; çünkü symbol mangling, sembol adının benzersiz olmasını sağlamaya yardımcı olur. Ancak export_name gibi öznitelikler bu benzersizlik varsayımını bozabilir.

Örneğin önceki sürümlerde aşağıdaki kod, yalnızca güvenli kod içermesine rağmen çoğu Unix benzeri platformda çöker:

fn main() {
    println!("Merhaba, dunya!");
}

#[export_name = "malloc"]
fn foo() -> usize { 1 }

2024 sürümünde bu özniteliklerin unsafe olarak işaretlenmesi zorunludur; böylece sembolün doğru tanımlandığından emin olunması gerektiği vurgulanır:

#![allow(unused)]
fn main() {
// GUVENLIK: loop sembolünün yalnızca tek bir tanımı olmalıdır.
#[unsafe(export_name="loop")]
fn arduino_loop() {
    // ...
}
}

Taşıma

unsafe_attr_outside_unsafe lint’i, bu öznitelikleri unsafe(...) biçimine çevirebilir. 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 bu özniteliklerin doğru kullanılıp kullanılmadığını doğrulayamayacağını unutmayın. Kullanımlarını elle gözden geçirmek hâlâ sizin sorumluluğunuzdadır.

Alternatif olarak, bu özniteliklerin güncellenmesi gereken yerleri 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(unsafe_attr_outside_unsafe)]
}

  1. See RFC 3325 for the original proposal.