CodeBlanks Logo Icon CodeBlanks

unsafe bloğu

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}");              // 6

unsafe 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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let p = &mut x as *mut i32;
____ {
    *p += 1;
}
Cevap
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

İleri seviye bölümündeki tüm dersler