CodeBlanks Logo Icon CodeBlanks

Unsafe yönergeleri

Unsafe Rust yazım yönergelerini ve denetim listesini öğrenirsin.

Unsafe yönergeleri

Bir API sağlam (sound) ise, güvenli kod onu nasıl kullanırsa kullansın tanımsız davranış oluşamaz. Unsafe kod yazarken kurallar: her unsafe bloğun yanına neden güvenli olduğunu anlatan // SAFETY: yorumu yaz; unsafe fn'lerin sözleşmesini # Safety ile belgele; sözleşmeyi mümkünse çalışma anında assert! ile sağla; ve testleri Miri altında çalıştır:

$ rustup +nightly component add miri
$ cargo +nightly miri test   # hizasız erişim, kullanım-sonrası-serbest, veri yarışı yakalar

Lint'ler de yardımcıdır: #![deny(unsafe_op_in_unsafe_fn)], clippy::undocumented_unsafe_blocks.

Sağlam bir sarmalayıcı

Sözleşme kontrol edilip başarısızlıkta güvenli bir sonuç döndürülünce, unsafe içeren fonksiyon güvenli kalır:

fn ilk_iki(v: &[i32]) -> Option<(i32, i32)> {
    if v.len() < 2 {
        return None;
    }
    // SAFETY: yukarıda v.len() >= 2 olduğu denetlendi.
    unsafe { Some((*v.get_unchecked(0), *v.get_unchecked(1))) }
}

Bu örnekte unsafe gerçekte gerekli değildir (v.get(..2) yeter); unsafe yalnızca ölçülmüş bir kazanç varsa kullanılmalıdır.

Uygulama Sağlam erişim

Yukarıdaki ilk_iki fonksiyonunu // SAFETY: yorumuyla yaz. [4, 5, 6] ve [9] için sonuçları {:?} ile boşlukla yazdır.

Başlangıç kodu

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

Örnek çözüm

main.rs
fn ilk_iki(v: &[i32]) -> Option<(i32, i32)> {
    if v.len() < 2 {
        return None;
    }
    // SAFETY: yukarıda v.len() >= 2 olduğu denetlendi.
    unsafe { Some((*v.get_unchecked(0), *v.get_unchecked(1))) }
}

fn main() {
    println!("{:?} {:?}", ilk_iki(&[4, 5, 6]), ilk_iki(&[9]));
}

Beklenen çıktı

Some((4, 5)) None

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Güvenli bir fonksiyonun içindeki unsafe blok yanlış girdide UB üretebiliyorsa fonksiyon nedir?

  • Güvenli
  • Kabul edilebilir
  • Sağlam değil (unsound); ya girdiyi denetlemeli ya da unsafe fn olmalı Doğru cevap
  • Sağlam

Açıklama: Güvenli imza, "hangi girdiyle çağırırsan çağır UB olmaz" sözüdür.

2 Gerekçe yorumu

Soru
// ____: yukarıda v.len() >= 2 olduğu denetlendi.
unsafe { *v.get_unchecked(1) }
Cevap
// SAFETY: yukarıda v.len() >= 2 olduğu denetlendi.
unsafe { *v.get_unchecked(1) }

Açıklama: // SAFETY: yorumu unsafe bloğun neden doğru olduğunu belgeler.

3 Kavram ve anlamı

Kavram Anlamı
Sağlam (sound) Güvenli kodla UB imkânsız
Miri UB yakalayan yorumlayıcı
// SAFETY: Gerekçe
# Safety Sözleşme belgesi

Uzman bölümündeki tüm dersler