4

の引数についてmain()、2011 C 標準は (5.1.2.2.1:2) と述べています。

argc の値が 0 より大きい場合、配列メンバー argv[0] から argv[argc-1] までは、文字列へのポインターを含みます。文字列には、プログラムの起動前にホスト環境によって実装定義の値が与えられます。

このコンテキストでの「文字列」という単語は、「0 で終わる文字列」、つまり、0 以外の文字の後に最後の '\0' が続くシーケンスとして解釈されるべきですか、それとも一部の実装ではプログラムに異なる方法で引数を渡す必要がありますか?

POSIX プラットフォームでは、exec*関数ファミリの1 つの引数はexec*、整形式の文字列へのポインターとして関数によって検証されますか (また、どのように?)、または setuid プログラムは整形式の 0-引数として終了文字列?

4

1 に答える 1

8

このコンテキストでの「文字列」という単語は、「0 で終わる文字列」、つまり、0 以外の文字の後に最後の '\0' が続くシーケンスとして解釈されるべきですか、それとも一部の実装ではプログラムに引数を別の方法で渡す必要がありますか?

7.1.1 は文字列を定義します:

文字列は、最初の null 文字で終了し、最初の null 文字を含む連続した一連の文字です。


関数の exec* ファミリの 1 つの引数は、整形式の文字列へのポインターとして exec* 関数によって検証されます (どのように?)。

POSIX 仕様では、ファミリへの引数execは null で終わる文字列であり、そうでない場合に何が起こるかは指定されていません。おそらくそれは未定義の動作です。exec関数が各引数が正しく null で終了していることを検証する合理的な方法がないため、これは合理的と思われます。(ただしexec*、アドレス空間がスワップアウトされようとしているため、引数をコピーする必要があることに注意してください。)

于 2014-05-05T19:52:55.200 に答える