Rust
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.
Örnek çözümü göster
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]));
}
Kendini test et
-
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ı
- Sağlam
Cevabı göster
Sağlam değil (unsound); ya girdiyi denetlemeli ya da unsafe fn olmalı — Güvenli imza, "hangi girdiyle çağırırsan çağır UB olmaz" sözüdür.
-
Gerekçe yorumu
// ____: yukarıda v.len() >= 2 olduğu denetlendi.
unsafe { *v.get_unchecked(1) }
Cevabı göster
// SAFETY: yukarıda v.len() >= 2 olduğu denetlendi.
unsafe { *v.get_unchecked(1) }
-
Kavram ve anlamı
- Sağlam (sound)
- Güvenli kodla UB imkânsız
- Miri
- UB yakalayan yorumlayıcı
- // SAFETY:
- Gerekçe
- # Safety
- Sözleşme belgesi
Sıradaki ders: Özet - Derleme araçları