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

Yeni Güvensiz İşlevler

Özet

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)]
}