argc はオーバーフローしますか?
質問
SOの中をさまよっていたら この質問 . そして、私はargcをオーバーフローさせることができるかどうかを疑問に思うようになりました。
標準では
argv[argc]
はヌルポインタでなければならないとされていますが、argcがオーバーフローした場合、これは偽になります。
(I
が書いた
をテストするために小さな C プログラムと Python スクリプトを書きましたが、その結果
MemoryError
.)
ありがとうございます。
<ブロッククオート
国際規格の根拠 - プログラミング言語 - C §5.1.2.2.1 プログラムの起動
の指定は
argc
と
argv
を引数として
main
は、広範な先行実践を認識します。
argv[argc]
は、リストの終わりに対する冗長なチェックを提供するために、ヌルポインタであることが要求されており、これも一般的な慣行に基づいています。
どのように解決するのですか?
規格によると
では、引用から。
argv[argc]
はヌルポインタであることが必要です
そのため
argc
はオーバーフローすることはできません。
実際には
実際には、プログラムに渡される引数の合計サイズには制限があります。
私の Linux/x64 システムでは。
$ getconf ARG_MAX 2097152
したがって、引数の合計サイズは約2メガバイトとなり
argc
はオーバーフローすることができません。 この制限値は
argv
のデータの総量と、環境の組み合わせを測定していると思われます。 コマンドを実行しようとしたときに、この制限を超えると
exec()
で失敗します。
E2BIG
. から
man 2 execve
:
E2BIG 環境 (envp) と引数リスト (argv) の合計バイト数が大きすぎます。 リスト(argv)の総バイト数が大きすぎます。
私のシステムの ~2 メガバイトの制限は、他のシステムに比べて比較的寛大であると思います。 私の OS X システムは ~260KB の制限を報告しています。
しかし、次のような場合はどうでしょう。
ARG_MAX
が本当に大きかったらどうでしょう?
さて、あなたが古い/奇妙なシステムを使っているとしましょう、それで
int
は 16 ビットで、ARG_MAX は 2 をはるかに超えています。
15
であり、それ以外は非常に合理的です。 さて、あなたが
execve()
を2つ以上の
15
の引数を取ることができます。 この実装には2つのオプションがあります。
-
それは
argc
をオーバーフローさせることができます。基本的には、データを捨て、実行中のプログラムが予期しない、おそらくは誤った方法で実行されるようにし、C標準に違反することになります。 最悪なのは、このエラーは沈黙しているので、決して知ることができないかもしれないことです。 -
あるいは、単に
EOVERFLOW
からexecve()
というエラーメッセージが表示され、 それほど多くのパラメータを持つイメージを実行することはできないことを通知します。 POSIX / SUS 標準はこのエラー結果について何も言及していませんが......これは単に標準作成者がARG_MAX
よりも大きくなることを想定していなかったからではないでしょうか。INT_MAX
.
オプション #2 は だけ であり、妥当な選択肢です。 システムが何らかの方法でオプション #1 を選択した場合、それは 壊れている であり、バグ レポートを提出する必要があります。
あるいは、16 ビット システム用にコンパイルされた古いプログラムを、ある種のエミュレーターまたは互換レイヤーを通して実行しようとしている可能性もあります。 エミュレーターまたは互換性レイヤーは、2 つ以上の 15 パラメータを渡そうとすると、エラー メッセージが表示されると思います。
関連
-
libc++abi.dylib: NSException タイプの捕捉されない例外で終了するエラー
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] CまたはC++を使用して、ディレクトリ内のファイルのリストを取得するにはどうすればよいですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み】符号なし整数のオーバーフローは定義されているのに、符号あり整数のオーバーフローは定義されていないのはなぜですか?
-
[解決済み] exprのオーバーフローを回避する方法 A * B - C * D
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ポインタ定数および定数ポインタ
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
警告: 'struct XXX' はパラメータリストの内部で宣言されています。
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] なぜmemsetではなくbzeroを使用するのですか?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cコードの単体テスト【終了しました
-
[解決済み] アセンブリがCより速いのはどんなとき?[クローズド]
-
[解決済み] コマンドライン文字列の最大長