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は(人間にやさしくないためか)見あたらない。

対策C : 引数を消費せずにログだけ取るように変更する

結局APIトレースを行うためには、引数を消費せずに参照する方法をABI毎に実装するしか無いようだ。この方法は、引数の積み直しが発生しないため、APIトレースのオーバーヘッドを軽減できるというメリットも有る。