unsafe bloğu
- Rust kursu
- İleri seviye
- Ders 30/81
- 4 dk
unsafe bloğunun neyi serbest bıraktığını öğrenirsin.
unsafe bloğu
Derleyicinin güvenliğini kanıtlayamadığı beş işlem yalnızca unsafe içinde yapılabilir: ham işaretçi çözmek, unsafe fn çağırmak, static mut'a erişmek, unsafe trait uygulamak ve union alanı okumak. unsafe ödünç denetimini kapatmaz; yalnızca bu beş işleme izin verir ve doğruluk sorumluluğunu sana bırakır:
let mut x = 5;
let p = &mut x as *mut i32; // ham işaretçi oluşturmak güvenlidir
unsafe {
*p += 1; // çözmek unsafe
}
println!("{x}"); // 6unsafe bir söz anlamına gelir: "bu bloğun kurallara uyduğunu ben garanti ediyorum."
Neden unsafe var?
Bazı geçerli programlar derleyicinin kanıtlayamayacağı kadar karmaşıktır: işletim sistemi çağrıları, donanım erişimi, performans kritik veri yapıları. Standart kütüphanenin Vec, String ve Mutex gibi türleri içeride unsafe kullanır ama dışarıya güvenli bir arayüz sunar. Hedef her zaman budur: unsafe'i küçük, belgelenmiş ve güvenli bir soyutlamanın içinde tutmak.
// // SAFETY: p, geçerli ve hizalı bir i32'ye işaret eder;
// // başka hiçbir referans aynı anda kullanılmıyor.
unsafe { *p += 1; }Uygulama Ham işaretçiyle artır
let mut x = 5; için *mut i32 ham işaretçi oluştur, unsafe blokta 1 artır ve x'i yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let mut x = 5;
let p = &mut x as *mut i32;
unsafe {
*p += 1;
}
println!("{}", x);
}Beklenen çıktı
6
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir <code>unsafe</code> bloğun içinde ödünç denetleyicisi çalışır mı?
- Hayır, tamamen kapanır
- Yalnızca referanslar için
- Yalnızca debug'da
- Evet; yalnızca beş özel işleme ek izin verilir Doğru cevap
Açıklama: Referanslar unsafe içinde de aynı kurallara tabidir; ham işaretçiler ise zaten denetlenmez.
2 Güvensiz blok
let p = &mut x as *mut i32;
____ {
*p += 1;
}
let p = &mut x as *mut i32;
unsafe {
*p += 1;
}
Açıklama: Ham işaretçi çözmek unsafe blok gerektirir.
3 İşlem ve gereksinim
| Kavram | Anlamı |
|---|---|
&x as *const i32 |
Güvenli |
*p (ham) |
unsafe gerekir |
unsafe fn çağrısı |
Çağrı unsafe ister |
// SAFETY: yorumu |
Gerekçe belgesi |