1

複数の出力ファイルのファイル名のフォーマットを表すフォーマット文字列をコマンドラインから取得するプログラムがあります。実際の出力ファイル名を生成するために代入できる整数引数を 1 つだけ取る必要があります。入力チェックを行うときにそれを確認したいと思います。Cでフォーマット文字列が期待する引数の数を決定する良い方法は何ですか?

4

2 に答える 2

1

受け入れられる引数の数は、C ライブラリのバージョンによって異なります (たとえば、%a変換指定子は C99 で追加されました)。エスケープされていない%文字数 (つまり、すべてのシーケンスが削除され%た後に残っている文字数) に文字数 (幅指定子の可能性がある) を加えた値より大きくないことを確認できます。%%*

ただし、セキュリティの問題を考慮する必要があります。ユーザーが%nフォーマット指定子を指定すると、任意のメモリ位置への書き込みが発生する可能性があります。他の場合では、egを指定すると%f、ガベージ値が出力されたり%s、任意のメモリ コンテンツに出力されたり%d、ユーザーがフィールド幅を指定できるようにする指定子を使用したりしても%255d、バッファ オーバーフローが発生する可能性があります。別のフォーマット スキームを検討する方が賢明です。たとえば、トークン (まだ である可能性があります%d) を置き換えますが、ユーザーがprintfフォーマット文字列を指定できないようにします。

于 2012-11-29T16:27:35.737 に答える