C 言語の設計の脆弱性を理解する: 関数のオーバーロードが許可されないのはなぜですか?

  1. C言語では戻り値の型を書かなくてもプログラムをコンパイルして実行することができます。C 言語の関数は名前のみを参照し、戻り値の型は参照しないためです。エントリ関数を探すとき、プログラムは「main」という名前の関数を見つけるだけでよく、戻り値の型やパラメータの型は気にしません。

  2. C 言語では関数のオーバーロードは許可されていません。同じ名前の関数はパラメーターが異なるだけであり、C 言語では重複した関数シンボルとみなされます。

  3. C言語では呼び出し側がスタックをクリアするため、引数を書かなくてもmain関数内でvoid型として宣言でき、プログラムはおかしくなりませんが、コマンドライン引数は取得できません。

  4. アセンブリ レベルでは、関数によって返される値は EAX レジスタの値です。値が割り当てられていない場合、EAX レジスタは乱数になります。したがって、たとえ void 型として宣言しても、main 関数の戻り値も単なるランダムな値になります。

  5. C 言語の設計には不正確な部分があり、その一部は初期のコンパイラの名残であるため、読みやすさと保守性を向上させるために、コードは最新の C 言語仕様に従って作成する必要があります。

  6. main 関数の戻り値はコード内では実質的な意味を持たない場合もありますが、それでも役割はあります。Unixシステムではプロセスを関数として呼び出すため、子プロセスを起動した後、その戻り値を使って子プロセスが正常に動作しているかどうかの状態を取得する必要があります。したがって、main関数の戻り値は、プロセス終了のステータスコードとして親プロセスに返されます。


    e4d1c98c8b84b362b1d0336ecfa02ae8.jpegたまたまここに C 言語パッケージがあるので、プライベート メッセージを送って入手してください

おすすめ

転載: blog.csdn.net/m0_67034740/article/details/129730107