Einführung
Sie kennen sich wahrscheinlich mit Zip-Bomben , XML-Bomben usw. aus. Einfach ausgedrückt handelt es sich um (relativ) kleine Dateien, die bei der Interpretation durch naive Software eine enorme Leistung erbringen. Die Herausforderung besteht darin, einen Compiler auf die gleiche Weise zu missbrauchen.
Herausforderung
Schreiben Sie einen Quellcode, der 512 Bytes oder weniger belegt und der in eine Datei kompiliert wird, die den größtmöglichen Platz einnimmt. Die größte Ausgabedatei gewinnt!
Regeln
OK, es gibt einige wichtige Klarstellungen, Definitionen und Einschränkungen.
- Die Ausgabe der Kompilierung muss eine ELF- Datei, eine Windows Portable Executable (.exe) oder ein virtueller Bytecode für die JVM oder die CLR von .Net sein (andere Arten von virtuellem Bytecode sind wahrscheinlich ebenfalls in Ordnung, wenn Sie dazu aufgefordert werden). Update: Pythons .pyc / .pyo-Ausgabe zählt ebenfalls .
- Wenn Ihre bevorzugte Sprache nicht direkt in eines dieser Formate kompiliert werden kann, ist auch die Transpilation gefolgt von der Kompilierung zulässig ( Update: Sie können mehrere Transpilierungen durchführen, sofern Sie nie dieselbe Sprache mehr als einmal verwenden ).
- Ihr Quellcode kann aus mehreren Dateien und sogar aus Ressourcendateien bestehen, die Gesamtgröße aller dieser Dateien darf jedoch 512 Byte nicht überschreiten.
- Sie können keine anderen Eingaben als Ihre Quelldatei (en) und die Standardbibliothek der Sprache Ihrer Wahl verwenden. Das statische Verknüpfen von Standardbibliotheken ist OK, wenn dies unterstützt wird. Insbesondere keine Bibliotheken von Drittanbietern oder Betriebssystembibliotheken.
- Es muss möglich sein, Ihre Kompilierung mit einem Befehl oder einer Reihe von Befehlen aufzurufen. Wenn Sie bestimmte Flags erfordern beim Kompilieren, diese auf Ihre Byte - Grenze zählen (zB wenn Ihre Kompilierung Linie ist
gcc bomb.c -o bomb -O3 -lm
, das-O3 -lm
wird ein Teil (7 Byte) gezählt werden (die anfängliche Spitzen Raum zu beachten , wird nicht mitgerechnet). - Präprozessoren sind nur zulässig , wenn sie eine Standard-Kompilierungsoption für Ihre Sprache sind.
- Die Umgebung liegt bei Ihnen, aber um dies überprüfbar zu machen, halten Sie sich bitte an die neuesten (dh verfügbaren) Compilerversionen und Betriebssysteme (und geben Sie an, welche Sie verwenden).
- Es muss fehlerfrei kompiliert werden (Warnungen sind in Ordnung) und ein Absturz des Compilers zählt für nichts.
- Was Ihr Programm tatsächlich tut, ist irrelevant, obwohl es nichts Bösartiges sein kann. Es muss nicht einmal in der Lage sein zu starten.
Beispiel 1
Das C-Programm
main(){return 1;}
Kompiliert mit Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64-Bit):
clang bomb.c -o bomb -pg
Erzeugt eine Datei mit 9228 Bytes. Die Gesamtgröße der Quelle beträgt 17 + 3 (für die -pg
) = 20 Bytes, was leicht innerhalb der Größenbeschränkung liegt.
Beispiel 2
Das Brainfuck-Programm:
++++++[->++++++++++++<]>.----[--<+++>]<-.+++++++..+++.[--->+<]>-----.--
-[-<+++>]<.---[--->++++<]>-.+++.------.--------.-[---<+>]<.[--->+<]>-.
Transpiled mit awib zu c mit:
./awib < bomb.bf > bomb.c
Dann kompiliert mit Apple LLVM version 7.0.2 (clang-700.1.81)
OS X 10.11 (64-Bit):
clang bomb.c
Erzeugt eine Datei mit 8464 Bytes. Die Gesamteingabe beträgt hier 143 Byte (da @lang_c
awib standardmäßig der Quelldatei hinzugefügt werden musste und in keinem der Befehle spezielle Flags vorhanden sind).
Beachten Sie auch, dass in diesem Fall die temporäre Datei bomb.c 802 Byte groß ist, dies jedoch weder für die Quell- noch für die Ausgabegröße gilt.
Schlussbemerkung
Wenn eine Ausgabe von mehr als 4 GB erreicht wird (wenn jemand einen hervorragenden vollständigen Präprozessor findet), wird der Wettbewerb um die kleinste Quelle ausgetragen, die eine Datei mit mindestens dieser Größe erstellt (es ist einfach nicht praktikabel, zu große Einreichungen zu testen ). .