Unsafe yönergeleri
- Rust kursu
- Uzman
- Ders 41/46
- 4 dk
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ışı yakalarLint'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
fn main() {
// buraya yaz
}Örnek çözüm
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
// ____: yukarıda v.len() >= 2 olduğu denetlendi.
unsafe { *v.get_unchecked(1) }
// 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 |