- Katılım
- 7 Ocak 2026
- Mesajlar
- 290
- Tepkime puanı
- 2
- Puanları
- 18
Rust'ın en büyük vaadi bellek güvenliğidir, ancak bazen bilgisayarın donanımıyla doğrudan konuşmanız veya performansın sınırlarını zorlamanız gerekir. İşte bu noktada Unsafe Rust devreye girer.
Örneğin, standart kütüphanedeki
unsafe bloğu, Rust'ın koruyucu kalkanını tamamen kapatmaz; sadece derleyicinin kontrol edemediği 5 özel süper gücü kullanmanıza izin verir.1. Unsafe Süper Güçleri
unsafe bir blok içinde şunları yapabilirsiniz:- Ham İşaretçileri (Raw Pointers) Dereference Etmek:
*const Tve*mut Tkullanarak bellekteki herhangi bir adrese doğrudan erişmek. - Unsafe Fonksiyonları Çağırmak: FFI (Foreign Function Interface) üzerinden C kodlarını çağırmak veya
unsafeolarak işaretlenmiş Rust fonksiyonlarını kullanmak. - Mutable Static Değişkenlere Erişmek veya Değiştirmek: Global değişkenleri manipüle etmek.
- Unsafe Trait'leri Uygulamak.
- Union Alanlarına Erişmek.
2. Ham İşaretçiler (Raw Pointers) vs. Referanslar
Güvenli Rust'taki referansların aksine, ham işaretçiler:- Geçerli bir belleği işaret etmek zorunda değildir.
- Null olabilirler.
- Otomatik temizleme (cleanup) yapmazlar.
- Aynı anda birden fazla mutable erişime izin verirler.
Kod:
let mut sayi = 5;
let r1 = &sayi as *const i32; // Ham işaretçi oluşturmak GÜVENLİDİR
let r2 = &mut sayi as *mut i32;
unsafe {
// Ama onları dereference etmek (içine bakmak) UNSAFE'dir
println!("r1: {}", *r1);
*r2 = 10;
}
3. Ne Zaman Kullanılmalı?
"Kuralı yıkmak" için geçerli bir sebebiniz olmalıdır. Unsafe kullanımı genellikle şu üç durumda kaçınılmazdır:A. Donanım ve İşletim Sistemi Erişimi
Bir aygıt sürücüsü yazıyorsanız veya bellekteki belirli bir adrese (memory-mapped I/O) yazmanız gerekiyorsa derleyiciye "ne yaptığımı biliyorum" demeniz gerekir.B. C Kütüphaneleri ile Haberleşme (FFI)
Rust dışındaki bir dilde (örneğin C) yazılmış bir fonksiyonu çağırırken Rust, o fonksiyonun bellek güvenliği kurallarına uyup uymadığını garanti edemez.C. Aşırı Performans Optimizasyonu
Bazen Rust'ın güvenli yapıları (örneğin dizilerde sınır kontrolü - bounds check) çok kritik döngülerde küçük bir yavaşlamaya neden olabilir. Unsafe kullanarak bu kontrolleri atlayabilirsiniz (ancak bu çok risklidir).4. Unsafe Kodu "Güvenli" Hale Getirmek
Rust felsefesi,unsafe kodun her yere yayılmasını istemez. En iyi yaklaşım, tehlikeli işlemi unsafe bir blok içinde yapıp, bunu güvenli bir API (Safe Wrapper) ile sarmalamaktır.Örneğin, standart kütüphanedeki
Vec yapısı aslında içinde unsafe kodlar barındırır, ancak biz kullanıcı olarak onu tamamen güvenli bir şekilde kullanırız.5. Unsafe Kullanmanın Riskleri
unsafe kullandığınızda, Rust'ın sağladığı şu garantilerden feragat edersiniz:- Dangling Pointers: Silinmiş bir bellek adresine erişmek.
- Data Races: Aynı belleğe iki farklı thread'in kontrolsüz erişmesi.
- Buffer Overflow: Bir dizinin sınırlarının dışına yazmak.
Özet
| Yaklaşım | Tercih Sebebi |
| Safe Rust | Varsayılan budur. Hata payını sıfıra indirir. |
| Unsafe Rust | Donanım erişimi, C entegrasyonu veya kritik performans ihtiyacı. |