Cの規格書の 7.15.1.1 va̲arg には以下の記述があります。

次の実引数が実際にはない場合,又は型が実際の(既定の実引数拡張に従って拡張された)次の実引数の型と適合しない場合,次に掲げる二つの場合を除いて,その動作は,未定義とする。
− 一方の型が符号付き整数型であり,もう一方の型が対応する符号無し整数型であり,
そしてその値が,両方の型で表現可能な値である場合。
− 一方の型がvoid型へのポインタであり,もう一方の型が文字型へのポインタである場合。

これは例えば、可変長引数をとる関数にNULLポインタを渡し、呼び出された側で

 FILE *fp = va_arg(ap, FILE *);

として受け取ってはいけない、という事を指すのだと理解しています。
なぜこのような規定が設けられたのでしょう?