callbackのarity問題
yuniFFIは、現状可変長引数のcallbackを記述することができない。重要な問題は、これにより可変長引数の関数をAPIトレースできない点にある。
これは、C言語の va_arg はarity(関数の入力数)を取るための方法を提供していないことに因る。
対策A : ABI固有のテクニックでarityを抽出する
無理。例えば、amd64はレジスタ渡しを可変長引数関数でも使用できるため、calleeは常に正しい個数の引数を消費しなければならない。
これがgenericに実装できるABIは思いあたらない。
対策B : 可変長引数の数をconstraintで表現する
(yuniFFIでは、構造体のフィールドや引数に対する制約を constraints として抽象化している。例えば、pipe(2)システムコールは引数として与えるfds配列の長さは2でなければならないので、引数に対して(length 2)のconstraintが付与される。)
gccやclangのような一般的なコンパイラは、可変長引数への型検査を提供している。
gcc 4.9.1では、printf / scanf / strftime / gnu_printf / gnu_scanf / gnu_strftime / strfmonとそれらのMS variant(msvcrt.dllと互換の変換ルールを使用する)を提供しているので、同様のattributeを記述できるようにAPI記述を拡張する必要がある。APIトレーサは、実際にprintf等の構文を解釈して引数を回収/記録することになる。
他の形式としては、GObjectのように可変長引数リストをNULL終端することを要求するAPIも有る。
可変長引数の長さを明示的に指定させるAPIは(人間にやさしくないためか)見あたらない。