irfo
Moderatör
- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Rust'ın en büyük iddiası "bellek güvenliği" (memory safety) olsa da, dilin içinde bu kuralların geçici olarak esnetilebildiği gizli bir bölme bulunur: Unsafe Rust. Unsafe Rust, Rust'ın sahip olduğu tüm güvenlik garantilerinin ötesine geçmenize izin veren bir üst kümedir. Ancak unutulmamalıdır ki; Rust "unsafe" olsa bile, "güvensiz" bir dil değildir. Sadece bazı durumlarda kontrolü derleyiciden alıp tamamen yazılımcıya devreder.
unsafe bloğu içinde yapabileceğiniz "süper güçler" şunlardır:
1. Unsafe Rust Nedir?
unsafe anahtar kelimesiyle işaretlenen kod blokları, derleyicinin Borrow Checker (Ödünç Alma Denetçisi) mekanizmasının bazı kontrollerini devre dışı bırakır. Ancak bu, sahiplik kurallarının tamamen yok olduğu anlamına gelmez; sadece derleyicinin doğruluğunu kanıtlayamadığı işlemleri yapmanıza izin verir.unsafe bloğu içinde yapabileceğiniz "süper güçler" şunlardır:
- Ham işaretçileri (raw pointers) dereference etmek (çözümlemek).
- unsafe fonksiyonları veya metotları çağırmak.
- Değiştirilebilir statik değişkenlere (static mut) erişmek veya onları değiştirmek.
- unsafe trait'leri uygulamak.
- union alanlarına erişmek.
2. Neden Unsafe Kod Yazılır?
Eğer Rust bu kadar güvenliyse, neden bu güvenliği bozan bir özellik var? Bunun üç temel sebebi vardır:A. Donanım ve İşletim Sistemi Erişimi
İşletim sistemi çekirdekleri (kernel) veya sürücü (driver) yazarken doğrudan bellek adreslerine erişmeniz gerekir. Derleyici bu adreslerin güvenli olup olmadığını bilemez.B. FFI (Foreign Function Interface) - Dış Fonksiyon Arayüzü
C veya C++ ile yazılmış kütüphaneleri Rust projenize dahil ettiğinizde, Rust derleyicisi bu dillerin bellek yönetimini denetleyemez. Bu kütüphaneleri çağırmak doğası gereği unsafe kabul edilir.C. Performans Optimizasyonları
Bazen derleyicinin güvenlik kontrolleri (örneğin dizi sınır kontrolleri - bounds checking) performansı düşürebilir. Çok kritik hız gerektiren yerlerde, yazılımcı bu kontrolleri manuel yaparak performansı artırabilir.3. Ham İşaretçiler (Raw Pointers)
Safe Rust'taki referansların aksine, ham işaretçiler (*const T ve *mut T) şunları yapabilir:- Aynı anda hem mutable hem immutable olabilir.
- null olabilirler.
- Otomatik olarak temizlenmezler (cleanup yoktur).
- Herhangi bir bellek adresini işaret edebilirler.
Kod:
fn main() {
let mut num = 5;
// Ham işaretçi oluşturmak güvenlidir (safe)<br>let r1 = &num as *const i32;<br>let r2 = &mut num as *mut i32;<br><br>// Ancak onları kullanmak (dereference) sadece unsafe blokta mümkündür<br>unsafe {<br> println!("r1: {}", *r1);<br> println!("r2: {}", *r2);<br>}<br>
}
4. Unsafe Kullanmanın Riskleri
unsafe bloğuna girdiğinizde, Rust derleyicisinin size sağladığı "güvenlik ağı" kalkar. Karşılaşabileceğiniz riskler şunlardır:- Segmentation Fault: Geçersiz bir bellek adresine erişmeye çalışırsanız program çöker.
- Data Races: Birden fazla thread'in aynı belleğe kontrolsüz erişimi sonucu veri bozulması yaşanır.
- Undefined Behavior (Belirsiz Davranış): Programınız bazen doğru çalışır, bazen saçma sonuçlar verir. Bu hataları bulmak (debug) kabus gibidir.
5. Altın Kural: Unsafe'i Güvenli Bir Kabukla Sarmak
Rust topluluğunda en iyi uygulama, unsafe kodu mümkün olduğunca küçük tutmak ve onu Safe (Güvenli) bir fonksiyonun içine hapsetmektir. Kullanıcı fonksiyonu çağırırken arka planda unsafe bir iş döndüğünü bilmek zorunda kalmaz.
Kod:
use std::slice;
fn tehlikeli_islem(ptr: *const i32, len: usize) -> &'static [i32] {
// Unsafe bloğu içeride saklıyoruz
unsafe {
slice::from_raw_parts(ptr, len)
}
}