前書き
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 < bomb.bf > bomb.c
次にApple LLVM version 7.0.2 (clang-700.1.81)
、OS X 10.11(64ビット)でコンパイルします。
clang bomb.c
8464バイトのファイルを作成します。ここでの合計入力は143バイトです(@lang_c
ソースファイルに追加する必要がないawibのデフォルトであるため、どちらのコマンドにも特別なフラグはありません)。
また、この場合、一時的なbomb.cファイルは802バイトですが、これはソースサイズにも出力サイズにもカウントされないことに注意してください。
最終ノート
4GB以上の出力が達成された場合(おそらく誰かが完全なプリプロセッサを探している場合)、少なくともそのサイズのファイルを生成する最小のソースを競います(大きすぎる提出物をテストすることは実際的ではありません) 。