可変長引数
C言語においては printf、scanf といった標準ライブラリの関数が可変長引数をとる代表例である。可変長引数をとる関数のユーザー定義も可能である。信頼できない入力を扱う場合は書式文字列攻撃に注意する必要がある。可変長引数として渡す際に型情報が失われるため、型に関する情報を別途渡すなどする必要がある。
倍精度浮動小数点数の平均値を求める関数average_of_doublesの例を考える。
上記を呼び出すコード例は次の通りである。データの個数を最初の引数として与えている。
Cの可変長引数には、「既定の実引数拡張」(default argument promotion) と呼ばれる暗黙の型変換規則が適用される。例えばfloat型の実引数は、double型に拡張される。関数形式マクロva_arg()を使ってスタックから値を取り出す際、指定した型の値が実際には格納されていなかった場合、未定義動作を引き起こす。
上記の例では、可変長引数にdouble型の値(または既定の実引数拡張を受けるfloat型の値)が渡されることを想定しているが、可変長引数に間違ってintなどの整数型の値を渡してもコンパイルは通ってしまい、未定義動作を引き起こす。この例では同じdouble型の1つ以上の値を渡すことができればよいので、可変長引数を使うのではなく、単純にdoubleの配列を使って型安全に実装すべきである。