Rust’ta C-variadic tanımı için ABI ve hedef sınırı

  • 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 5

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’ta C-variadic fonksiyon tanımı yapacaksanız, doğru ABI ve hedef mimari eşleşmesini önce doğrulamalısınız; aksi halde tanım derlenmez ya da yanlış FFI yüzeyi oluşur. Özetle: variadic tanım yalnız belirli C tabanlı ABI’lerde geçerlidir, desteklenmeyen hedeflerde hata verir ve çağrı tarafında VaList kullanımının tip kuralları vardır.

Bu konu özellikle FFI yazarken, mevcut bir C API’sini Rust’ta birebir karşılamak isteyenler için önemlidir. Aşağıda önce hangi ABI’lerin geçerli olduğunu, sonra hangi hedeflerde güvenle tanım yazabileceğinizi ve son olarak çağırma tarafındaki en kritik sınırları ayırıyorum.

Rust variadic tanımında doğru ABI seçimi​

Hangi ABI’ler kabul edilir?​

Rust Reference’a göre değişken argüman alan tanımlar yalnızca extern "C" ve extern "C-unwind" ile yapılabilir; başka ABI’lerde variadic tanım desteklenmez. Normal Rust fonksiyonları ve diğer ABI’ler bu kullanım için uygun değildir.

Tanım neden unsafe olmak zorunda?​

Variadic imzalar çağrı zamanında sabit olmayan bir argüman listesi taşır. Bu yüzden fonksiyon tanımı unsafe olmalıdır; trait içindeki bildirimler için de aynı kural geçerlidir. extern blok içindeki bildirimler ise safe olabilir, ama bu durum tanım tarafındaki kuralı değiştirmez.

Sözdiziminde dikkat edilecek sınır​

Variadic parametre ... biçimindedir ve yalnızca son parametre olabilir. Yani ... sonuna başka bir parametre ekleyemezsiniz. Ayrıca bu tür bir tanım async ya da const olamaz.

Hangi hedeflerde tanım kararlı desteklenir?​

Destekli hedef sınıfı​

Rust Reference, C-variadic tanım desteğinin kararlı olduğu hedefleri listeler: x86 ve x86-64, ARM, AArch64 ve Arm64EC, RISC-V 32/64, LoongArch 32/64, s390x, PowerPC ve PowerPC64, AMDGPU ve NVPTX, Wasm32 ve Wasm64, C-SKY, Xtensa, Hexagon, SPARC64 ve MIPS. Bu liste dışındaki hedeflerde derleyici hata verebilir.

Destek yoksa ne olur?​

Desteklenmeyen bir hedefte tanım yazarsanız, Rust bunu kabul etmez. Bu, ABI doğru olsa bile hedef mimari yeterli değilse kodun derlenmeyeceği anlamına gelir.

Pratik kontrol sırası​

Önce hedef triple’ı, sonra ABI’yi, en son da imzayı kontrol etmek en güvenli sıradır. Çünkü destekli ABI ile desteklenmeyen hedef birleşimi yine başarısız olur.

VaList okurken güvenli kullanım sınırları​

Tip eşleşmesi neden önemli?​

Variadic bölüm, içeride `VaList

Kontrol / DurumAnlamı / Uygulama
Sadece extern "C" veya extern "C-unwind"Variadic tanım için uygun ABI seçilmelidir; diğer ABI’ler desteklenmez.
Fonksiyon tanımı unsafe olmalıÇağrı tarafı değişken olduğu için tanım güvenli işaretlenemez.
... son parametre olmalıVariadic bölüm başka parametrelerden sonra gelemez.
Hedef mimari destekli olmalıDesteklenmeyen hedefte derleyici hata verir; tanımı o hedefe taşıyamazsınız.
VaList::next_arg tipi eşleşmeliYanlış tip okuma UB doğurabilir; çağıran ve okuyan tür uyumu kontrol edilmelidir.
async ve const kullanılamazVariadic tanımın bu niteliklerle birleştiği sürümler desteklenmez.
C FFI ile gerçek ihtiyaç olmalıRust variadic desteği C uyumluluğu içindir; normal Rust fonksiyonları variadic olmaz.

Kaynaklar​

 

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