Schreiben Sie einen vollkommen legalen Code in einer anständigen Sprache Ihrer Wahl, dessen Kompilierung entweder den Compiler zum Absturz bringt oder ihn in eine Endlosschleife (unendliche Kompilierungszeit) sendet.
Beschränkungen:
- Verwenden Sie eine Standardsprache, die in der realen Welt verwendet wird.
- Verwenden Sie einen gut entwickelten Standard-Compiler (keine Antworten wie "Ich habe meinen C-Compiler geschrieben, der auf alles abstürzt").
- Der Code muss in der Sprache legal sein (daher müssen Sie höchstwahrscheinlich einen Compiler oder einen Sprachfehler ausnutzen).
- Geben Sie Ihre Compilerversion und die verwendeten Optionen an, damit andere Benutzer sie replizieren können.
- Erklären Sie nach Möglichkeit, warum der Compiler abgestürzt ist.
Habe Spaß :)
popularity-contest
compile-time
Petr Pudlák
quelle
quelle
Antworten:
Ich bin mir ziemlich sicher, dass es jetzt behoben ist, aber früher konnte man den Java-Compiler (oder Eclipse) durch Schreiben zum Absturz bringen
http://www.exploringbinary.com/java-hangs-when-converting-2-2250738585072012e-308/
Tatsächlich hängt der Compiler laut dieser Seite nur und stürzt nicht ab. Trotzdem fand ich das ziemlich lustig.
quelle
Meine Lieblingslösung für GHC:
Für GHC 6.12.1 beides
ghci Bad.hs
undghc Bad.hs
Endlosschleife. GHC 7.4.1ghc -O2 Bad.hs
wird bei Ausführung endlos wiederholt .Erläuterung:
omega
Wird mit einer unendlichen Rekursion definiert (die einzige Möglichkeit, mit der ein beliebiger Typ belegt werden kann). Der Inliner des Compilers stelltxx
eine einfache, nicht rekursive Funktion dar und versucht, sie in die Definition von einzufügenomega
. Es führt zu(\x@(C x') -> x' x) (C xx)
. Wenn der Compiler eine Musterübereinstimmung auf einem Konstruktor sieht, versucht er, sie zu reduzieren, wirdxx (C xx)
erneut abgerufen und durchläuft eine Schleife. Der Trick ist, dassxx
tatsächlich rekursiv ist, aber die Rekursion innerhalb des Datentyps verborgen ist.Hinweis: Beim Schreiben des Puzzles habe ich vergessen, dass ich GHC in der Endlosschleife laufen ließ. Es hat all meinen Speicherplatz gekostet, Firefox ist abgestürzt und ich habe es kaum geschafft, es ohne Hard-Reset zu beenden.
quelle
Dies ist in jeder abhängig geschriebenen Sprache einfach . Die Überprüfung allgemeiner abhängiger Typen ist unentscheidbar, da sie möglicherweise beliebig komplexe Berechnungen erfordern (Turing-complete). Sie können einfach einen zu großen Wert in einen abhängigen Typ codieren. Dann nutzt die Typprüfung den gesamten verfügbaren Speicher und stürzt ab. In Coq gibt ReyCharles zum Beispiel an
Compute 70000.
, dass der Typprüfer eine riesige Peano-Zahl konstruiert und abstürzt.In gängigeren Sprachen, die eine Art Makroerweiterung oder Metaprogrammierung unterstützen, können Sie etwas Ähnliches tun. Beispielsweise können Sie den gesamten verfügbaren Speicher in C verwenden:
Die Programmiersprache D ermöglicht die Ausführung von Funktionen zur Kompilierungszeit . Dies kann verwendet werden, um während der Kompilierung etwas zu berechnen, das zu groß ist, um in den Arbeitsspeicher zu passen. Ähnliches kann mit der Metaprogrammierung von C ++ - Vorlagen erreicht werden.
In XML (keine kompilierte Programmiersprache, aber ein XML-Prozessor ist analog zu einem Compiler) können expandierende Entitäten dazu führen, dass dem Prozessor der Speicher ausgeht:
Dies nennt man den Milliarden-Lacher-Angriff .
quelle
<lolz>&lol999;</lolz>
10 ^ 999 lacht, keine Milliarde. Die verlinkten Verweise verwenden<lolz>&lol9;</lolz>
, was eigentlich eine Milliarde ist.C #
Fand dies auf einer Stackoverflow-Frage :
Der Compiler stürzt schließlich ab.
Das Problem scheint mit der Typinferenz und / oder Lambda-Erzeugung in Verbindung mit der Überlastungsauflösung verbunden zu sein.
quelle
VBA
Wie wäre es, wenn Sie die IDE durch Eingeben von Code zum Absturz bringen könnten?
Versuchen Sie Folgendes in einer beliebigen Microsoft Office-Anwendung:
ALT+ F11Um zum VBA-Fenster zu gelangen, probieren Sie den folgenden Code
und siehe da:
Sie können einfach
redim preserve v(,1 to 5)
in das unmittelbare Fenster tippen , und es stürzt ab, nachdem Sie gedrückt haben ENTER!quelle
,
und erwartet,
)Perl (15)
Dies erzeugt beim Kompilieren eine Endlosschleife :
(von perlmod )
Und deshalb kann Perl das Parsen des Codes nicht abschließen. Dies endet nicht:
quelle
J
Dieser segfaults den J-Interpreter (zumindest unter Linux):
Es wird versucht, aus Speicheradresse 2 zu lesen. Interessanterweise erhalten Sie, wenn Sie es mit 0 oder 1 versuchen
domain error
.quelle
TeX
TeX ist eine Makro-Erweiterungssprache. Hier definieren wir die Expansion des Makros
\x
sein\x
wieder, und dann fügen wir danach einen Aufruf\x
. TeX bleibt endlos hängen und ersetzt\x
durch\x
.quelle
Planen
Mein Compiler Chicken hat den Fehler gemacht, Makros zur Kompilierungszeit für "Laufzeitleistung" oder so etwas zu erweitern. Also zahlte es den Preis für die Erweiterung dieses. Ich habe R5RS gelesen. Niemand sagte, Makros müssten zur Kompilierungszeit erweitert werden.
Im Wesentlichen wird das Makro zu einem Ausdruck von unendlicher Größe erweitert, der sich ständig verdoppelt. Um technisch zu sein, verdoppelt sich jede weitere Erweiterung. Das Schicksal des Compilers ist besiegelt. Zumindest auf meinem System blockiert Chicken Caps mit 2 GB für eine lange Zeit den Versuch, Müll zu sammeln, und stürzt dann ab, nachdem der Müllsammler aufgegeben hat. Es dauert jedoch eine Weile, da all die rechenintensiven hygienischen Probleme auftreten.
Zwischen Ausdrücken des Formulars wechseln
und
scheint die Rate des Speicherverbrauchs sehr, sehr dramatisch zu erhöhen im Vergleich zu:
Ich vermute, Chicken ist ein ziemlich robuster Compiler, der eine gründliche Analyse syntaktischer Ausdrücke vermeiden kann, wenn er damit durchkommt, aber meine endgültige Lösung zwingt den Pattern-Matcher, sich wirklich darauf einzulassen.
quelle
@wizzwizz4
.Common Lisp
Makros machen es einfach:
Kompilieren von
compile-me
Aufrufenloop-forever
, wodurch der Heapspeicher während der Erweiterung erschöpft wird und der Compiler abstürzt. Wenn Sie den Compiler nur auf unbestimmte Zeit hängen lassen möchten, wird dies durch die folgende Definition von erreichtloop-forever
:Dies sollte mit jeder CL-Implementierung funktionieren, es sei denn, Ihre ist äußerst clever und kann einfache Endlosschleifen erkennen, aber ich bezweifle ernsthaft, dass dies der Fall ist. Ein vollständiger Schutz dagegen ist natürlich nicht möglich.
quelle
(defmacro loop-forever () (loop)) (defun compile-me () (loop-forever))
sollte ausreichen. Es hängt CCL für mich.PHP 5.3.1 (Segfaults Interpreter) ( Bug 50261 , behoben in 5.3.3)
Dies war ein kleines Problem, da der obige Code in vielen Codes, mit denen ich gearbeitet habe, häufig vorkam, was dieses Problem für uns ziemlich weit verbreitet machte.
(Wenn ich mich richtig erinnere, war dies an einer Stelle die einzige Möglichkeit, übergeordnete Konstruktoren in PHP aufzurufen.)
quelle
D
(DMD32 D Compiler v2.067.1, Windows Build)
Beachten Sie, dass der Compiler dadurch in eine Endlosschleife gerät und abstürzt.
Mechanical Snail schlug vor , Programmierfunktionen zur Kompilierungszeit in D für diesen Zweck zu missbrauchen, aber die Lösung ist vielleicht einfacher als die Art von Techniken, die er sich vorgestellt hatte.
Für diejenigen, die mit 'String Mixins' nicht vertraut sind, ist es eine ziemlich einfache Makrofunktion. Wenn der Compiler auf etwas stößt
mixin("asdf")
, ersetzt er es durch den Inhalt der Zeichenfolgeasdf
und versucht, es erneut zu kompilieren.Die obige Lösung wird wie folgt erweitert:
Wenn der Compiler nicht versucht, diesen Fall zu erkennen, wird er in eine Endlosschleife der Erweiterung eintreten.
quelle
Perl
Dies definiert die Überladung des Operators zur Kompilierungszeit und führt den Code zur Kompilierungszeit aus, wodurch die Klasseninstanzen addiert werden.
(Im Übrigen würde eine normalerweise unendliche Rekursion den gesamten Speicher verschlingen, aber bei Überladung stürzt sie einfach ab.)
Ausgabe:
quelle
Simplex v.0.5 , 2 Bytes
Schade, dass dies kein Code-Golf ist :
Lassen Sie mich erklären. Aus den Dokumenten:
Damit:
Das äußere Programm ist eine nette kleine Funktion in Simplex: Es wird am Ende des Programms ausgewertet. Also, wenn wir den Überblick behalten ...:
Irgendwann wird das Gedächtnis ausgehen und die Welt untergehen.
quelle
Clang ++
Ich bin gerade auf diesen lustigen Bug gestoßen.
Das Ziel ist es, Brainfuck in C zu übersetzen und dabei den Großteil der Arbeit mithilfe von Template-Metaprogrammierung zu erledigen. Dieser Code funktioniert für kleinere Brainfuck-Programme wie Hello World, aber als ich versuchte, ihn mit 99 Bottles auszuführen ...
Es wird erfolgreich in GCC kompiliert (nach ca. 2 Minuten), aber das Verknüpfen verursacht ein anderes Problem ...
Hoppla.
quelle
Smalltalk (Squeak Dialekt, Version 4.x)
Sehr einfach, bewerten Sie dies einfach oder akzeptieren Sie eine Methode mit diesem Literal
Es wird versucht, die Potenz von 10 in Large Integer Arithmetik auszuwerten, nur um inf Tsss richtig zu runden;)
Bearbeiten: wieviele 9 sind nötig?
Da 2 ^ 10 1024, ungefähr 10 ^ 3 ist, können wir ungefähr 10 ^ n durch 2 ^ (10 * n / 3) approximieren. Das bedeutet, dass 10 ^ n 10 * n / 3 Bits erfordert, um binär dargestellt zu werden. Wir möchten 10 ^ n nicht darstellbar haben.
Unter der Annahme von 32-Bit-Zeigern für den Objektspeicher wissen wir, dass wir nicht mehr als 2 ^ 32 Bytes adressieren können, dh 2 ^ 35 Bits. Kehren wir also das Problem um: 2 ^ 35 ist ungefähr 32 * 2 ^ 30, 32 * 10 ^ 9. Das erfordert ungefähr 11 Dezimalstellen, sodass wir mit elf 9 sicher einen Fehler bei 32-Bit-Quietschen erzeugen werden. In 64 Bits wäre das einundzwanzig 9.
Wir können auch Speicher mit weniger als 9s auslasten, der gesamte adressierbare Speicherplatz ist nicht unbedingt verfügbar, aber es ist tödlich langsam zu testen, die Squeak VM ist im Gegensatz zu GMP nicht für eine solche Riesenarithmetik optimiert.
quelle
9
Sekunden?Dies ist meine originelle und prägnante Methode, um GolfScript zum Absturz zu bringen:
Dabei wird eine Endlosschleife eingerichtet, die weiterhin 1 auf den Stapel schiebt, bis der Speicher voll ist.
In C / C ++ glaube ich, dass dieser ursprüngliche Code den Compiler zum Absturz bringen würde:
Dies würde dazu führen, dass der Compiler stecken bleibt, wenn er die Menge von a verdoppelt und in b umwandelt und umgekehrt, sodass der Compiler ziemlich bald keinen Speicher mehr und keinen Absturz mehr hat.
Eine andere ist für Batch unter Windows, wenn der Computer vollständig eingefroren wird und nicht nur das Batch-Skript selbst zählt. Sie sollten Folgendes eingeben:
Dies führt zu einer unendlichen Schleife, in der Kopien von sich selbst erstellt werden, die Kopien von sich selbst usw. erstellen. Dies würde höchstwahrscheinlich Ihren Computer zum Absturz bringen, wenn Sie dieses kleine Stück Code ausführen.
Eine letzte ist eine VBS-Bombe. Es ist eine andere Bombe, wie die letzte, aber stattdessen werden unendlich viele Dialogfelder geöffnet.
Dadurch wird fortlaufend eine Kopie von sich selbst erstellt und ein Meldungsfeld in einer Endlosschleife geöffnet, was auch die Klone tun. Das Ausführen der letzten beiden Programme wird nicht empfohlen, da sie Ihren Computer einfrieren und dazu führen können, dass Sie Ihren Computer schwer booten müssen.
Beachten Sie, dass ich mir all diese Programme selbst ausgedacht habe.
quelle
Common Lisp, 8 Bytes
Kürzer als die andere Common Lisp Antwort :-)
Schleife beim Lesen Ihres Formulars.
Der Common Lisp-Standard erwähnt keine tragbare Methode, um einen Absturz zu verursachen. Ich denke, wir müssen eine implementierungsdefinierte Methode haben. Noch 8 Bytes:
... oder,
Wenn Sie anrufen
(compile-file "crash.lisp")
, stürzen die Umgebungen auf mysteriöse Weise ab.Scherz beiseite, ich versuche immer noch einen Weg zu finden, um die Umgebung wirklich zum Absturz zu bringen (und zwar in Kürze), aber es ist wirklich schwer. Alles was ich bekomme ist eine nette Interaktion mit dem Debugger.
quelle
x86 asm
"nasm -v" gibt "NASM-Version 2.11.08, kompiliert am 21. Februar 2015" zurück (läuft unter win7)
Der Assembler lief bisher 1:12:27 auf einem i7 und hat einen der Kerne vollständig ausgelastet. Die Ausgabedatei hat eine Größe von 0 Bytes, der Speicherverbrauch lag stabil bei 1.004 KB. Man kann mit Sicherheit sagen, dass ich mich überfordert habe, anstatt nur eine wirklich sehr lange Aufgabe zu erledigen. :)
Der Schlüssel zum Trick ist der Wiederholungswert im Makro - 0xFFFFFFFF. Allerdings kenne ich mich mit den Interna von Nasm nicht gut genug aus, um zu wissen, warum es genau daran erstickt. Ich habe vor einer Stunde mit einer Ausgabe von ~ 16 GB gerechnet.
BEARBEITEN: Habe gerade den Task-Manager überprüft, Nasm wurde 7:40:41 ausgeführt und der Speicher ist jetzt auf 1.016 KByte angewachsen
quelle
Gnu Assembler, erzeugen riesig Ausgabedateien erzeugt
Dieses Makro versucht, die Ausgabedatei mit Müll zu füllen (normalerweise null Byte), bis eine Grenze von 4 GB erreicht ist, fügt ein int hinzu, um diese Grenze zu überschreiten, und ruft sich rekursiv auf, um die Ausgabe mit 4 GB Müllbrocken zu füllen. Dadurch wird Ihre Festplatte gefüllt, bis sie voll ist. An diesem Punkt stürzt der Assembler wahrscheinlich ab.
Beachten Sie, dass die unendliche Rekursion nicht verwendet werden kann, da der Assembler diesen Sonderfall abfängt und das Makro nicht mehr erweitert.
Die Kompilierung kann mit den
as -o crash.out crash.s
meisten Linux-Distributionen durchgeführt werden.quelle
Common Lisp, 29 Bytes
Implementierung: Clozure CL
WARNUNG: Seien Sie vorsichtig, wenn Sie diesen Code ausführen, da er möglicherweise Prozesse abbricht, die Sie nicht möchten!
Dadurch wird der Shell-Befehl ausgeführt
pkill cl
zur Kompilierungszeit ausgeführt, wodurch der Lisp-Prozess, der die Kompilierung durchführt, abgebrochen wird. Technisch gesehen kein Absturz, aber es hat den gleichen Effekt.Anwendungsbeispiel:
quelle
Felix
Das funktioniert nicht mehr, aber irgendwann dieser Code:
Dies würde einen großen Fehler ergeben:
SYSTEMFEHLER bind_expression 'raised Not_found [BUG] Felix-Kompilierung "/ media / ryan / stuff / felix / build / release / host / bin / flxg" "-q" "--optimise" "--inline = 100" "- Ausgabeverzeichnis = / home / ryan / stuff / .felix / text "" --cache_dir = / home / ryan / stuff / .felix / cache "" -I / media / ryan / stuff / felix / build / release / share / lib "" -I / media / ryan / stuff / felix / build / release / host / lib "" --syntax=@/media/ryan/stuff/felix/build/release/share/lib/grammar/grammar.files " "--automaton = / home / ryan / stuff / .felix / cache / media / ryan / stuff / felix / build / release / share / lib / grammar / grammar.files / syntax.automaton" "--import = plat / flx.flxh "" std "" /home/ryan/golf/itri/sl.flx "ist fehlgeschlagen Fehler 1 in flx: [strerror_r] Text für Fehlernummer 1 konnte nicht gefunden werden
Das Problem war hier:
let
Ich habe erwartet, dass ein Ausdruck darauf folgt, aber ich habe stattdessen eine Aussage gemacht. Also ist der Compiler ein bisschen ausgeflippt.Weitere Informationen finden Sie unter https://groups.google.com/forum/m/#!topic/felix-language/J3Hs4j6E0gM .
quelle
JavaScript
Dies schickt es in eine Endlosschleife. Ich habe den Codecademy JS-Compiler verwendet und mein Browser ist abgestürzt.
quelle
while(1){}
. Dies ist auch eine Endlosschleife.while(1);
.Javascript
Dieser stürzt Webbrowser in einer sehr effektiven Weise ab. BENUTZUNG AUF EIGENE GEFAHR!!!
quelle
Hassium
File1.has:
File2.has:
Dies veranlasst Hassium, File2.has zu laden und mit dem Kompilieren zu beginnen, wodurch es angewiesen wird, File1.has zu laden, wodurch es File2.has lädt, und so weiter.
quelle
LOLCODE 1.2, LOLCODE Common Interpreter / Compiler (lci)
Ich weiß, dass dies kein Code-Golf ist, aber es ist trotzdem extrem kurz.
Dies führt zu Signal 11:
Warum?
HAI1.2
bezeichnet den Start des Programms undOBTW
leitet einen mehrzeiligen Kommentar ein. Aber der Compiler erwartet einerKTHXBYE
das zu schließenHAI
, und eineTLDR
den mehrzeiligen Kommentar zu schließen.Beachten Sie, dass dies immer noch funktioniert, um Segfault mit etwas anderem als
TLDR
nachher zu verursachenOBTW
.(Nach den Standards von Wikipedia ist LOLCODE nur ein seltsamer Lang, nicht wirklich esoterisch.)
Sie können den Interpreter aus git / justinmeza / lci holen .
quelle