Rust’ta C-variadic fonksiyon tanımı, her ABI ve her hedefte geçerli değildir; doğru ABI ve destekli target seçilmezse kod derlenmez. Ayrıca tanım
Aşağıdaki özet, hangi durumda tanımın geçerli olduğunu ve hangi noktada güvenlik sınırının başladığını pratik biçimde ayırır. Böylece FFI tarafında önce derlenebilirlik, sonra da doğru argüman okuma kuralı kontrol edilir.
Tanımın biçimi:
Bir C-variadic fonksiyon tanımı
Rust tarafında fonksiyon gövdesindeki variadic liste `VaList
unsafe olmalı ve ... yalnızca en sonda yer almalıdır.Aşağıdaki özet, hangi durumda tanımın geçerli olduğunu ve hangi noktada güvenlik sınırının başladığını pratik biçimde ayırır. Böylece FFI tarafında önce derlenebilirlik, sonra da doğru argüman okuma kuralı kontrol edilir.
Rust’ta C-variadic tanımı hangi koşullarda geçerli?
ABI seçimi: önce çağrı sözleşmesini doğrulayın
C-variadic tanım için ABI, variadic destekleyen foreign ABI ailesinden biri olmalıdır. Rust ABI ile variadic fonksiyon tanımlanmaz; dış dünyaya açılan sözleşme C uyumlu çağrı kuralına dayanır.extern "system" ise Windows x86_32’de variadic olmayan çağrılarda stdcall, variadic çağrılarda ise C gibi davranır.Hedef mimari: destekli target yoksa tanım reddedilir
Resmî referans, C-variadic tanım desteğinin stabil olduğu hedefleri ayrı ayrı listeler: x86/x86-64, ARM, AArch64 ve Arm64EC, RISC-V 32/64 (ilp32e hariç), LoongArch 32/64, s390x, PowerPC/PowerPC64, AMDGPU/NVPTX, Wasm32/Wasm64, C-SKY, Xtensa, Hexagon, SPARC64 ve MIPS. BPF gibi bazı hedeflerde bu tanım desteklenmez ve derleyici hata verir.Tanımın biçimi: unsafe, son parametre ve async/const yasağı
Bir C-variadic fonksiyon tanımı unsafe olmak zorundadır; ayrıca async veya const olamaz. ... token’ı yalnızca son parametre olabilir. Trait içindeki bildirimlerde de unsafe kuralı geçerlidir. extern bloklarda ise bildirimin safe olması ancak variadic argümanlara hiç erişmeyeceği açıkça garanti ediliyorsa anlamlıdır.VaList okurken asıl risk: tür uyumsuzluğu
Rust tarafında fonksiyon gövdesindeki variadic liste `VaList| Kontrol | Ne anlama gelir / ne yapmalı |
|---|---|
| Tanımlama yapacağınız target destekli mi? | Destekli değilse derleme hatası alırsınız; özellikle bazı hedeflerde C-variadic fonksiyon tanımı yoktur. |
| ABI gerçekten C uyumlu mu? | Variadic tanım için ABI C ailesinde olmalıdır; Rust ABI’si variadic kabul etmez. |
Fonksiyon unsafe mi tanımlandı? | C-variadic tanımlama unsafe olmalıdır; güvenli sarmalayıcı gerekiyorsa ayrı katman yazın. |
... en sonda mı? | Variadic parametre yalnızca son parametre olabilir; sonrasında başka parametre gelmez. |
VaList::next_arg ile okunan tür uyumlu mu? | Okunan tür, gerçek çağrıdaki türle uyumlu olmalı; aksi durumda UB riski doğar. |
extern blokta safe ilanı var mı? | Yalnızca variadic argümanlara hiç dokunmayacaksa anlamlıdır; aksi halde yanıltıcı olur. |