Rust 1.99’da C-variadic fonksiyon sınırları

  • Konuyu Başlatan Konuyu Başlatan Görkem
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 1

Görkem

WFN Üye
Katılım
21 Mar 2025
Mesajlar
1,518
Çözüm
1
Tepki Skoru
23
Ticaret Puanı
0
Üyelik
1 Yıl 6 Ay 17 Gün
Konum
Adıyaman
Web Sitesi
Yok
Alanı
Reklam Al-Sat
1/3
Konu sahibi
Rust 1.99 ile C-variadic fonksiyon tanımı geldi; doğru ABI ve hedef mimari seçilirse artık bu imza Rust içinde de yazılabiliyor. En kritik nokta, bunun yalnızca C ve C-unwind ABI’lerinde geçerli olması ve her hedefte desteklenmemesi.

Bu konuyu yazarken iki şeyi ayırmak gerekir: fonksiyonu tanımlayabilmek ile onu güvenli biçimde kullanabilmek. İlk bölüm ABI ve hedef mimari sınırlarını, ikinci bölüm ise unsafe, VaList ve tür uyumluluğu kurallarını netleştirir.

Hangi ABI’lerde tanımlama yapılabilir?​

Rust 1.99 duyurusuna göre C-ABI variadic fonksiyonları artık Rust içinde tanımlanabiliyor ve bu destek özellikle "C" ile "C-unwind" ABI’leri için geçerli. Normal Rust fonksiyonları variadic olamaz; extern yazılmış olsa bile variadic davranış yalnızca bu dış ABI bağlamında mümkün. Bu yüzden önce imzanın FFI niteliğini, sonra ABI seçimini kontrol etmek gerekir.

Neden bu ayrım önemli?​

"C" ABI klasik C çağrı sözleşmesini kullanır; "C-unwind" ise unwinding davranışını ayrıca tanımlar. Yani variadic imza tek başına yeterli değildir: çağrı sınırında panic/unwind davranışının nasıl yönetileceği de ABI kararının parçasıdır. Bu, özellikle C kütüphaneleriyle birlikte çalışan kodda sonradan değiştirilemeyecek bir tasarım kararıdır.

Hangi mimarilerde destek var?​

Rust Reference, C-variadic fonksiyon tanım desteğinin stabil olduğu mimarileri listeliyor. Buna x86 ve x86-64, ARM, AArch64 ve Arm64EC, RISC-V 32/64 (ilp32e hariç), LoongArch 32/64, s390x, PowerPC ve PowerPC64, AMDGPU ve NVPTX, Wasm32 ve Wasm64, C-SKY, Xtensa, Hexagon, SPARC64 ve MIPS dahil. Ayrıca desteklenmeyen bazı hedeflerde, örneğin BPF’de, derleyici doğrudan hata veriyor.

Pratik kontrol nasıl yapılır?​

Bir proje için asıl soru, “Rust sürümüm yeterli mi?” kadar “Hedef triple bu özelliği destekliyor mu?” sorusudur. Derleme hedefi destek dışındaysa kod doğru yazılmış olsa bile yapılamaz. Bu yüzden CI ve çapraz derleme düzeninde hedef listesini doğrulamak, tek makinede çalışan örnekten daha önemlidir. Bu sonuç, Reference’taki hedef listesine dayanır; proje özelinde yine de kullanılan target triple’a bakmak gerekir.

Güvenli kullanım için hangi kurallar geçerli?​

Variadic tanım yazıldığında fonksiyon unsafe olmalıdır; trait içindeki deklarasyonlar da unsafe olmalıdır. async ve const ile birlikte kullanılamaz. Ayrıca ... parametresi yalnızca son parametre olarak, dış blok fonksiyonunda yer alabilir. Bunlar yalnız stil kuralları değil, derleyicinin kabul ettiği temel sınırlar.

Çağıran tarafın sorumluluğu​

Variadic fonksiyonda asıl risk, çağıranın gönderdiği argümanların sayı ve tür uyumudur. Rust Reference, okuma tarafında tür uyumluluğu için kurallar veriyor: aynı türler uyumludur; bazı tam aynı boyuttaki tamsayılar uyumlu sayılabilir; pointer uyumluluğu da belirli biçimlerde kabul edilir. Ancak uyumlu görünmek, her zaman değer açısından güvenli olduğu anlamına gelmez; örneğin temsil edilemeyen değerler yine sorun çıkarabilir.

VaList ne işe yarar?​

VaList, C’nin va_list tipiyle ABI uyumludur ve C variadic çağrılarda argümanları okumak için kullanılır. Rust 1.99 duyurusunda da bu eşleşme özellikle vurgulanıyor. Bu, printf benzeri mevcut C API’leri sarmalarken önemlidir: Rust tarafında yazdığınız variadic fonksiyon, gerekiyorsa VaList’i doğrudan başka bir C fonksiyonuna aktarabilir.

Bu özellik ne zaman doğru seçimdir?​

Bu imza modeli, mevcut bir C API’sini Rust içinde tamamlamak ya da C tarafına uyumlu bir giriş noktası sağlamak gerektiğinde anlamlıdır. Yeni bir Rust API tasarlarken çoğu durumda sabit imzalı alternatifler daha okunaklı ve denetlenebilir olur; variadic yapı ancak gerçekten C uyumluluğu gerekiyorsa tercih edilmelidir. Bu son cümle, doğrudan kaynak kuralı değil, kaynakların sınırlama mantığından çıkarılan bir tasarım sonucudur.

Kontrol / durumAnlamı / uygulanacak adım
Kullanılacak ABITanım desteği C ve C-unwind için geçerli; normal Rust fonksiyonları variadic olamaz.
Desteklenen mimariDestekli hedeflerde yazılabilir; desteklenmeyen hedeflerde derleyici hata verir.
İmza kuralıVariadic parametre en son yerde ve dış fonksiyon bağlamında olmalı.
Güvenlik sorumluluğuFonksiyon unsafe olmalı; çağıran taraf argümanların sayısı ve türüyle uyumlu davranmalı.
VaList kullanımıC va_list ile ABI uyumludur; okunacak türler uyumluluk kurallarına uymalıdır.
Unwinding davranışıC-unwind ABI, C ABI’den farklı olarak unwinding sınırlarını etkiler.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Giriş Yap

Zaten bir hesabınız var mı? Buradan giriş yapın.

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

İpuçları
Geri
Üst
Kendinize göre özelleştirin

Bazı Topluluk Kısayolları...

Forumda sık kullandığınız alanlara hızlıca ulaşın.

Görünüm Tema Değiş?
Hızlı kısayollar