17
コンパイラボムをビルドする
前書き zip爆弾、XML爆弾などはおなじみでしょう。簡単に言えば、それらは(比較的)ナイーブソフトウェアによって解釈されたときに膨大な出力を生成する小さなファイルです。ここでの課題は、同じ方法でコンパイラを悪用することです。 チャレンジ 512バイト以下を占有し、可能な限りスペースを占有するファイルにコンパイルするソースコードを記述します。最大の出力ファイルが勝ちます! ルール わかりましたので、いくつかの重要な説明、定義、制限があります。 コンパイルの出力は、ELFファイル、Windows Portable Executable(.exe)、またはJVMまたは.NetのCLRの仮想バイトコードである必要があります(要求された場合、他のタイプの仮想バイトコードでも大丈夫です)。更新:Pythonの.pyc / .pyo出力もカウントされます。 選択した言語をこれらの形式のいずれかに直接コンパイルできない場合は、コンパイルとそれに続くコンパイルも許可されます(更新:同じ言語を複数回使用しない限り、複数回トランスコンパイルできます)。 ソースコードは複数のファイル、さらにはリソースファイルで構成できますが、これらすべてのファイルの合計サイズは512バイトを超えてはなりません。 ソースファイルと選択言語の標準ライブラリ以外の入力は使用できません。静的リンク標準ライブラリは、サポートされていれば問題ありません。具体的には、サードパーティのライブラリやOSライブラリはありません。 コマンドまたは一連のコマンドを使用してコンパイルを呼び出すことが可能でなければなりません。コンパイル時に特定のフラグが必要な場合、これらはバイト制限にカウントされます(たとえば、コンパイル行がのgcc bomb.c -o bomb -O3 -lm場合、-O3 -lmパート(7バイト)がカウントされます(最初の先行スペースはカウントされないことに注意してください)。 プリプロセッサは、言語の標準コンパイルオプションである場合にのみ許可されます。 環境はあなた次第ですが、これを検証可能にするために、最新の(つまり、利用可能な)コンパイラーのバージョンとオペレーティングシステムに固執してください(そして明らかに使用しているものを指定してください)。 エラーなしでコンパイルする必要があり(警告は問題ありません)、コンパイラのクラッシュは何もカウントしません。 あなたのプログラムが実際に行うことは無関係ですが、悪意のあることはできません。開始する必要さえありません。 例1 Cプログラム main(){return 1;} Apple LLVM version 7.0.2 (clang-700.1.81)OS X 10.11(64ビット)でコンパイル: clang bomb.c -o bomb -pg 9228バイトのファイルを作成します。ソースの合計サイズは17 + 3(の場合-pg)= 20バイトで、サイズ制限内に容易に収まります。 例2 Brainfuckプログラム: ++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.-- -[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-. awibを使用してcに変換: …