Güvensiz Öznitelikler
Özet
- Aşağıdaki öznitelikler artık
unsafeolarak işaretlenmelidir:
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)]
}