Alesta WEB

Kısa cevap: Rust 1.99.1, 15 Ekim 2026'da yayımlandı ve 1.99.0 ile gelen üç gerilemeyi (regression) düzeltiyor. En önemlisi x86_64'te FFI üzerinden döndürülen bool değerlerinin hatalı derlenmesi: C tarafındaki çağıran, 0 ya da 1 dışında değerler görebiliyordu. Diğer ikisi UEFI hedeflerinde eksik wcslen sembolü yüzünden bağlama hatası ve macOS'ta rust-lld'nin libLLVM.dylib'i bulamaması. C, C++ ya da başka dillerle FFI kullanan projeler rustup update stable ile güncelleyip yeniden derlemeli.

FFI bool hatası (bool return miscompilation)
Rust'ta bool tipi bellekte bir bayt kaplar ve yalnız 0 ya da 1 olabilir. x86_64 sistemlerde kullanılan System V ABI, bir fonksiyonun döndürdüğü bool değerinin dönüş yazmacında sıfırla genişletilmiş (zero-extended) olmasını bekliyor. Yani yazmacın 1–7. bitleri sıfır olmalı.
Rust ekibinin duyurusuna göre 1.99.0'da bu kural bozuldu: extern "C" fonksiyonlardan döndürülen bool değerlerinde dönüş yazmacının 1–7. bitleri belirsiz kalabiliyordu. Rust tarafı yalnız en düşük biti doğru yazdığı için Rust kodu sorunu fark etmiyordu; ama C ya da C++ tarafındaki çağıran, yazmacın tamamını okuyup 0 ya da 1 dışında bir değer görebiliyordu. Sorun #163911 numaralı kayıtla izlendi ve 1.99.1'de bool dönüşleri ABI'nin istediği gibi yeniden sıfırla genişletildi.
Pratikte şöyle bir kod etkilenebiliyordu:
// Rust tarafı (kütüphane)
#[no_mangle]
pub extern "C" fn dosya_gecerli(yol: *const c_char) -> bool {
// ...
true
}
/* C tarafı */
bool sonuc = dosya_gecerli("/tmp/a.txt");
if (sonuc == 1) { /* bazen buraya girmeyebilir */ }C derleyicisinin ürettiği koda göre if (sonuc) doğru çalışırken sonuc == 1 karşılaştırması ya da değeri bir tamsayı dizisinde indeks olarak kullanmak beklenmedik sonuç verebiliyordu. Bu tür hatalar sessizdir: derleme başarılı olur, testlerin çoğu geçer, sorun yalnız belirli derleyici iyileştirmeleri ve yazmaç durumlarında ortaya çıkar.
Kimler etkilendi? (Who is affected)
- x86_64 üzerinde Rust 1.99.0 ile derlenmiş,
extern "C"(ya da başka bir C ABI'si) ilebooldöndüren fonksiyonu olan,- ve bu fonksiyonun Rust dışından çağrıldığı projeler.
Örnekler: C/C++ uygulamasına gömülen Rust kütüphaneleri, Python ctypes/cffi bağlamaları, Node.js yerel eklentileri, PHP eklentileri ya da Rust ile yazılmış ve C başlık dosyası sunan paylaşımlı kütüphaneler. Yalnız Rust içinde kalan kod etkilenmiyor. ARM64 (aarch64) sistemler bu hatanın kapsamında değil.
Önemli nokta: 1.99.1'e geçmek tek başına yetmiyor. Hatalı kod 1.99.0 ile derlenmiş ikili dosyanın içinde duruyor. Etkilenen kütüphaneleri ve onları içeren uygulamaları yeniden derleyip yeniden dağıtmanız gerekiyor.
UEFI'de eksik wcslen (UEFI link errors)
İkinci düzeltme (#163614) bazı hedeflerde wcslen sembolünün eksik olmasından kaynaklanan bağlama hatası. LLVM iyileştirme sırasında geniş karakterli dizeler için wcslen çağrısı ekleyebiliyor; C kütüphanesi olmayan ortamlarda bu sembol bulunamayınca bağlama başarısız oluyordu. En çok UEFI hedefleri etkilendi: std kullanan her UEFI projesi derlenemiyordu. 1.99.1'de fonksiyon yedek olarak compiler-builtins içine eklendi.
macOS'ta rust-lld (rust-lld on macOS)
Üçüncü düzeltme (#163947) macOS'ta rust-lld bağlayıcısının libLLVM.dylib'i yükleyememesi. Sorun, derleyici rustup vekil komutu olmadan doğrudan çağrıldığında ortaya çıkıyordu; örneğin bazı derleme sistemleri ve IDE'ler rustc'yi tam yoluyla çalıştırıyor. Bağlayıcı artık libLLVM.dylib'in bulunduğu klasörü gösteren bir rpath kaydıyla derleniyor.
Güncelleme ve kontrol (Upgrade)
rustup kullanıyorsanız:
rustup update stable
rustc --version # rustc 1.99.1 görünmeliCI'da sürüm sabitliyorsanız rust-toolchain.toml dosyasını güncelleyin:
[toolchain]
channel = "1.99.1"FFI üzerinden bool döndüren fonksiyonlarınızı bulmak için kaba bir arama işinizi görür:
grep -rnE 'extern "C" fn [a-z_0-9]+\(.*\)\s*->\s*bool' --include='*.rs' .Arama sonucunda bir şey çıkarsa o kütüphaneyi ve onu kullanan ikilileri 1.99.1 ile yeniden derleyin. Docker imajlarında rust:1.99 gibi kayan etiketler kullanıyorsanız imajı yeniden çekip derlemeyi tekrarlayın.
Ara sürümlerden çıkan ders (Lessons)
Rust, altı haftada bir yeni kararlı sürüm çıkarıyor ve ciddi bir gerileme bulunursa kısa süre içinde nokta sürüm yayımlıyor. 1.99.0 ile 1.99.1 arasında iki hafta var. Rust 1.96.1, 1.97.1 ve 1.98.1 de aynı şekilde gerileme düzeltmeleriydi. Üretim ortamı için iki pratik sonuç çıkıyor:
- Yeni sürüme ilk gün geçmeyin: özellikle FFI, gömülü sistem ya da özel hedefler kullanan projelerde yeni ana sürümü bir-iki hafta bekletmek, bu tür gerilemelerin ilk dalgasını atlatmayı sağlıyor.
- ABI sınırını test edin: Rust ile C arasındaki sınırda yalnız Rust tarafından yazılmış testler bu hatayı yakalayamazdı. C tarafından çağrılan, dönüş değerinin tam bayt değerini kontrol eden küçük bir test eklemek ucuz bir sigorta.
Alesta WEB olarak araç zinciri güncellemelerini önce test ortamında derleyip ardından üretime alıyoruz; derleyici gibi temel araçlarda "en yeni" ile "en güvenli" her zaman aynı gün buluşmuyor. 1.99 ile gelen yenilikler için Rust 1.99 yazımıza bakabilirsiniz; C variadic fonksiyon tanımlama da FFI tarafını ilgilendiren bir özellikti.
Sık sorulan sorular
Sadece Rust kodu yazıyorum, güncellemem gerekiyor mu?
FFI kullanmıyorsanız bool hatası sizi etkilemez. Yine de macOS ve UEFI düzeltmeleri için 1.99.1'e geçmek zararsız ve önerilir.
Rust 1.98 kullanıyorum, etkileniyor muyum?
Hayır. Üç sorun da 1.99.0 ile gelen gerilemeler. 1.98'den doğrudan 1.99.1'e geçebilirsiniz.
Yeniden derleme şart mı?
FFI üzerinden bool döndüren ve 1.99.0 ile derlenmiş kod için evet. Hatalı makine kodu derlenmiş dosyada; derleyiciyi güncellemek mevcut ikiliyi düzeltmez.
Bir sonraki Rust sürümü ne zaman?
Rust altı haftalık takvimle ilerliyor; 1.100.0 bu takvime göre Kasım ortasında bekleniyor.
Kaynaklar (References)
İlgili yazılar: Rust 1.99 yenilikleri · OpenSSH 10.6 · Web yazılım hizmetleri · İletişim
Kapak fotoğrafı: Fotis Fotopoulos / Unsplash
Yorumlar
Yorum yazın

