Yeni Güvensiz İşlevler
Özet
- Aşağıdaki işlevler artık
unsafeolarak işaretlenmiştir:
Ayrıntılar
Zamanla, standart kütüphanedeki bazı işlevlerin aslında unsafe olarak
işaretlenmiş olması gerektiği ortaya çıktı. Ancak bir işleve unsafe eklemek,
mevcut kodun unsafe blok içine alınmasını gerektirdiği için kırıcı bir
değişiklik olabilir. Bu kırılmayı önlemek için, bu işlevler önceki sürümlerde
unsafe gerektirmemeye devam ederken 2024 sürümünden itibaren unsafe
olarak işaretlenir.
std::env::{set_var, remove_var}
Bazı platformlarda süreç ortamının ele alınış biçiminin güvenlik sınırlamaları
yüzünden, çok iş parçacıklı bir programda std::env::set_var ya da
std::env::remove_var çağırmak güvensiz olabilir. Standart kütüphane bu
işlevleri başlangıçta güvenli olarak tanımlamıştı; ancak sonradan bunun doğru
olmadığı anlaşıldı.
Bu işlevlerin başka herhangi bir iş parçacığı çalışıyor olabilecekken çağrılmadığından emin olmak önemlidir. Ayrıntılar için işlev belgelerindeki Safety bölümüne bakın.
std::os::unix::process::CommandExt::before_exec
std::os::unix::process::CommandExt::before_exec işlevi, exec çağrısından
önce bir kapanışı çalıştırmanın yolunu sunan unix’e özgü bir işlevdir. Bu
işlev 1.37 sürümünde kullanımdan kaldırıldı ve yerine aynı işi yapan ama
unsafe olarak işaretlenmiş pre_exec getirildi.
before_exec kullanımdan kaldırılmış olsa da, 2024 sürümüyle birlikte doğru
biçimde unsafe olarak işaretlenmiştir. Bu sayede henüz pre_exece taşınmamış
eski kodların da unsafe blok gerektirdiği açık hale gelir.
before_exec kapanışının sağlaması gereken çok katı güvenlik gereksinimleri
vardır. Ayrıntılar için Safety section bölümüne bakın.
Taşıma
Kodunuzun hem 2021 hem 2024 sürümlerinde derlenebilmesi için, bu işlevlerin
yalnızca unsafe blokların içinden çağrıldığından emin olmanız gerekir.
Dikkat: Bu işlev çağrılarını elle incelemeniz ve gerekirse bu işlevlerin
önkoşullarını sağlayacak şekilde kodunuzu yeniden yazmanız önemlidir. Özellikle
set_var ve remove_var, birden fazla iş parçacığı çalışıyor olabilirse
çağrılmamalıdır. Kullanım durumunuzu yönetmek için ortam değişkenlerinden
başka bir mekanizma seçmeniz gerekebilir.
deprecated_safe_2024 lint’i, bu işlevlerin tüm kullanımlarını otomatik
olarak bir unsafe blok içine alır; böylece kod iki sürümde de derlenebilir.
Bu lint, cargo fix --edition çalıştırıldığında otomatik uygulanan
rust-2024-compatibility grubunun parçasıdır. Kodunuzu Rust 2024 ile uyumlu
hale getirmek için şunu çalıştırın:
cargo fix --edition
Örneğin bu komut şunu:
fn main() {
std::env::set_var("FOO", "123");
}
şuna dönüştürür:
fn main() {
// YAPILACAK: Ortam erisiminin yalnizca tek is parcacikli kodda oldugunu denetleyin.
unsafe { std::env::set_var("FOO", "123") };
}
Ancak otomatik taşımanın bu işlevlerin doğru kullanılıp kullanılmadığını doğrulayamayacağını unutmayın. Bunları elle gözden geçirmek hâlâ sizin sorumluluğunuzdadır.
Alternatif olarak, bu işlevlerin çağrıldığı 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(deprecated_safe_2024)]
}