EN JA
FMTCHECK(3)
FMTCHECK(3) FreeBSD Library Functions Manual FMTCHECK(3)

名称

fmtcheckユーザに供給された printf(3)-スタイル形式文字列をきれいにする (消毒する)

ライブラリ

Standard C Library (libc, -lc)

書式

#include < stdio.h>

const char *
fmtcheck( const char *fmt_suspect, const char *fmt_default);

解説

fmtcheck() は、 fmt_suspectfmt_default と同じ引数タイプを消費するかどうか決定するために、かつ fmt_suspect が有効なフォーマット文字列であることを保証するために fmt_suspectfmt_default をスキャンします。

printf(3) 関数ファミリは、それらがランタイムで渡される引数のタイプを確認することができません。ある場合には、 catgets(3) のように、フォーマット文字列が指定された引数と一致するという保証のないユーザが供給したフォーマット文字列を使用することが有用かあるいは必要です。

次のように、 fmtcheck() はこれらの場合に使用されるように設計されました。

printf(fmtcheck(user_format, standard_format), arg1, arg2);

チェックでは、フィールド幅、フィラ(詰め物)、精度、その他 (フィールド幅または精度が数字文字列の代わりに星印‘ *’でなければ) は無視されます。さらに、フォーマット指定子以外のどんなテキストも完全に無視されます。

戻り値

fmt_suspect が有効なフォーマットで、 fmt_default と同じ引数タイプを消費する場合、 fmtcheck() は fmt_suspect を返します。そうでなければ、 fmt_default 返します。

関連項目

printf(3)

バグ

fmtcheck() 関数は、位置パラメータを認識しません。

セキュリティの考察

それらが同じ引数を受け入れる限りフォーマットが全く異なるかもしれないことに注意してください。例えば、“ %p %o %30s %#llx %-10.*e %n”は“ This number %lu %d%% and string %s has %qd numbers and %.*g floats (%n)”と互換性をもっています。しかしながら、“ %o”は“ %lx”と等価ではありません。これは、最初は整数を要求し、次は long を要求するためです。
October 16, 2002 FreeBSD