最小の失敗したCプログラム

スウェーデンの学生JesperÖqvistは大学で宿題を受け取りました。エラーでクラッシュする最小のプログラムCを書きます(segfault、SIGFPE)。 通常、このような状況の生徒はゼロ除算を使用します。

int main() { return 1/0; } 

命令の代わりに変数の割り当てを使用する場合、このコードから数バイトを削除できます。

 int main() { i=1/0; } 

コードは変数iデータ型を指定しません。 C89の仕様では、この場合は整数が暗示されることが示唆されています。 C99およびその他のCのバリアントでは、これは間違いです。 C89で記述したとします。この場合、 int main()main()短縮することさえできます。

 i; main() { i=1/0; } 

余分なスペースを除いて、16文字しか残っていません。最適化する場所はありません。 しかし実際には、さらに短い失敗したプログラムを書くことができます。 実際のところ、プログラムのコンパイル中に、コンパイラーは、ライブラリーおよび静的変数と関数へのシンボリックリンクを持つ1つ以上のオブジェクトモジュールを作成します。

シンボリックリンクには、変数の名前のみが含まれます。 その後、オブジェクトモジュールはリンカによって処理され、シンボリックリンクがアドレスに置き換えられ、既製の実行可能モジュールが作成されます。

コンパイラは、エントリポイント(プログラムが開始するRAMのアドレス)を設定し、オブジェクトモジュールの1つでmainをそれにバインドします。 mainの呼び出しは、 mainが参照するアドレスで命令を実行しようとしていることを意味します。

興味深いことに、リンカは異なるオブジェクトのデータ型について何も知りません。 したがって、 mainを静的変数に置き換えると、コンパイラはオブジェクトモジュールを作成し、リンカはメモリ内のアドレスへのシンボリックリンクを置き換えます。

Jesper Equistは、このようなプログラムをCで提供しています。

 int main=0; 

このようなプログラムは、 mainを関数として実行しようとするためにクラッシュしますが、コンパイラーはmainをデータを含む実行不可能なセグメントに配置しました。

さらなる最適化は明らかです。 略語int上記のトリックを使用できます。

 main=0; 

とにかく、Cの静的変数はデフォルトでゼロに初期化されるため、コードをさらに簡潔にすることができます。

 main; 

ここに、Cで最小の失敗したプログラムがあります。

Source: https://habr.com/ru/post/J181021/


All Articles