Wahnsinn: immer wieder dasselbe tun und unterschiedliche Ergebnisse erwarten.
Schreiben Sie ein Programm, das bei jeder Ausführung nur eine Ausnahme (Laufzeitfehler) auslöst. Die Herausforderung besteht darin, die Wahrscheinlichkeit zu haben, mehr als einen Absturz zu verursachen, ohne die Ausnahmen direkt aufzurufen (keine throw
Anweisungen) und keine eingebauten Zufalls- oder CPU-Tick-Zählfunktionen zu verwenden.
- 10 Punkte für jeden möglichen Fehler.
- 25 Bonuspunkte, wenn der Fehler / Absturz bei einem anderen Prozess oder System auftritt.
Regeln
- Antworten müssen angeben, welche Fehler möglich sind und wie sie generiert werden.
- Der (integrierte) Zufallszahlengenerator des Systems kann nur verwendet werden, wenn bei jeder Programmausführung die gleiche Zahl verwendet wird.
- Die Anzahl der Tics oder CPU-Zyklen kann nicht verwendet werden, es sei denn, sie werden relativ zum Start des Hauptprogrammthreads gezählt.
- Multithreading ist zulässig (sofern nicht ausdrücklich empfohlen).
Bearbeiten 1
Die GUID-Erzeugung fällt unter den eingebauten Zufallszahlengenerator. Benutzerdefinierte "hausgemachte" GUID-Generierung ist zulässig.
Der Zugriff auf das Dateisystem ist für E / A von Dateien zulässig, es sei denn, dies geschieht unter Umgehung der Regeln (Lesen einer Datei mit zufälligen Bits oder Zeitstempel).
Bearbeiten 2
- Wenn Sie den Geist der Herausforderung, verrückte Software zu entwickeln, anrufen
abort()
oderassert()
verletzen, werden für diese Art des Scheiterns keine 10 Punkte vergeben.
Viel Glück!
quelle
Antworten:
Java, 400
Java ist mit vielen s und s gesegnet . Es gibt viele , die für den Betrieb einer einzelnen Klasse spezifisch sind. Als Beispiel für einen der extremsten Fälle gibt es mehr als 10 Sekunden (alle sind Unterklassen von ), die nur der Klasse gewidmet sind , und ich habe mir Zeit genommen, um den Code (fast) alle zu werfen.
Exception
Error
Exception
Exception
IllegalFormatException
Formatter
Meine aktuelle Antwort enthält 40 verschiedene
Exception
s /Error
s, die je nach ModuloSystem.nanoTime()
mit einer ganzen Zahl zufällig ausgeführt werden .Die obige Methode sollte zulässig sein, da sie in den Fall "3. Kann die Anzahl der Tics oder CPU-Zyklen nicht verwenden, es sei denn, sie werden relativ zum Start des Hauptprogrammthreads gezählt" fällt .
Kompilierungsanleitung
Es wird dringend empfohlen , JRE / JDK oder OpenJDK von Oracle zum Ausführen des Codes zu verwenden. Andernfalls werden einige Ausnahmen möglicherweise nicht ausgelöst, da sich einige von ihnen auf die internen Details der Referenzimplementierung stützen und ich keinen zuverlässigen Fallback habe.
Der folgende Code wird erfolgreich kompiliert
javac 1.7.0_11
und erzeugt alle Ausnahmen amjava 1.7.0_51
.Um diesen Code auszuführen, müssen Sie den folgenden Code in einen Unicode-fähigen Editor (z. B. Notepad ++) kopieren und einfügen und in UTF-16 speichern (Big-Endian oder Little-Endian spielen keine Rolle, solange die Stückliste geschrieben ist). .
Ändern Sie das Arbeitsverzeichnis (
cd
) in das Verzeichnis, in dem der Quellcode gespeichert ist ( dies ist wichtig ).Kompilieren Sie den Code mit dem folgenden Befehl:
Und führen Sie den Code aus:
Mein Code ist nicht destruktiv, da ich ihn auch auf meinem Computer testen möchte. Der "gefährlichste" Code ist das Löschen von
ToBeRemoved.class
Dateien im aktuellen Ordner. Ansonsten berührt der Rest weder das Dateisystem noch das Netzwerk.Liste der Ausnahmen und Fehler
In der in der switch-case-Anweisung angegebenen Reihenfolge. Insgesamt gibt es 37
Exception
s und 3Error
s.Pattern
, mit langweiligem Fall als Backup)Pattern
, mit langweiligem Fall als Backup)Pattern
, mit langweiligem Fall als Backup)Pattern
, mit langweiligem Fall als Backup)$
inPattern
vor dem Abschlusszeichen der letzten Zeile übereinstimmen kann)Matcher
ohne eine Übereinstimmung durchzuführen)split(String regex)
)Exception
während der Initialisierung einer Klasse)java.nio.*
-spezifischException
)java.nio.*
-spezifischException
)java.nio.*
-spezifischException
)java.util.Stack
-spezifischException
)Charset.isSupported(String name)
false oder throws zurückgegeben werdenException
)java.util.Scanner
-spezifischException
)java.util.Formatter
-spezifischeException
s)SecurityManager
)Class
Klasse)Exception
in der Oracle-Implementierung nicht ausgelöst werden kann, keine Sicherung)quelle
nanoTime
und die Arbeit mit dieser Antwort.Java
ist-1 % 40 == -1
oder-1 % 40 = 39
?-1
. Hast du eine negative Zahl bekommen? (Bearbeitet, um sicherzustellen, dass alles nicht negativ ist).C (Windows 7) - 80 + 25 = 105 Punkte
Das folgende Programm basiert auf ASLR
Die folgende Ausnahme würde zufällig auftreten
Vector Subscript Out of Range
)Infinite Recursion
Dividing by Zero
Allocating Huge Memory
By Accessing NULL
By overwriting stack
quelle
<iostream>
notwendig?assert()
entspricht dem Auslösen einer Ausnahme.abort
und nicht zuzulassenassert
._crtMessageBoxW
und gibt einen Aufruf vorraise(SIGABRT)
, der überexit(3)
Perl
Unten sehen Sie ein Perl-Snippet, das mit einer beliebigen Anzahl von Perl-Nachrichten zur Kompilierungszeit stirbt. Es verwendet einen selbst gebrauten Pseudozufallszahlengenerator, um druckbare ASCII-Zeichen zu generieren, und versucht dann, diese als Perl auszuführen. Ich weiß nicht, wie viele Warnungen beim Kompilieren von Perl ausgegeben werden können, aber es gibt mindestens 30 solcher Fehler, die in verschiedenen Kombinationen auftreten können. Also, es sei denn, es ist ungültig, würde ich sagen, dass dieser Code eine Größenordnung mehr Punkte als die anderen Lösungen bekommt =)
Beispielausgabe von mehreren Läufen (durchsetzt mit Zeilenumbrüchen):
quelle
C # (85) (Ohne Abbrechen oder Bestätigen)
Diese Lösung verwendet die aktuelle Prozess-ID, um zu bestimmen, wie ein Absturz erfolgen soll.
Der Prozess kann aufgrund folgender Gründe abgebrochen werden:
10x6 + 25 = 85
Bearbeiten
Nachdem das OP Assert und Abort nicht zugelassen hat, habe ich sie aus meiner Lösung entfernt, daher ist es mit allen gültigen zulässigen Methoden auf 85 gesunken.
quelle
Abort()
und zu verbietenAssert()
. Sehen Sie nach, ob Sie diese Ausnahmen immer noch auslösen können, ohne sie direkt aufzurufen.Process.GetCurrentProcess().Id / 4 % actions.Count
?Nicht sicher, ob dies qualifiziert ist ...
C
Beide
i
und Elemente vonp
sind nicht initialisiert, daher kann dies entweder dazu führen, dass:i
<0i
Wert 0 istc
nach wiederholten Inkrementen größer als wirdi
Darüber hinaus kann dies dazu führen, dass eine vorhandene Anwendung (abhängig vom Wert von
p[c]
) mit einem SIGSEGV beendet wird oder nicht.Beachten Sie, dass ich dies nicht getestet habe. Kommentieren Sie daher bitte, wenn dies nicht funktioniert
quelle
Funkelnd .
Haftungsausschluss: Ähnlich wie Abhijits wunderbare Lösung, aber:
Die Hauptursache für Wahnsinn ist, dass verwalteter Code durch eine Reihe hässlicher Hacks ein natives Implementierungsdetail erhält.
Dies erfordert kein ASLR, sondern nur eine dynamische Speicherzuweisung.
Was dies bewirkt:
Das Programm ruft einen eigenen Interpreter (
spn
Befehl) auf und gibt die Beschreibung eines leeren Arrays in eine Datei aus. Das Array wird dynamisch zugewiesen und die Beschreibung enthält die Speicheradresse.Das Programm öffnet dann die Datei, analysiert die Beschreibung und erhält die Adresse als Ganzzahl. Es führt dann eine Art Hashing für den resultierenden Wert durch und führt eine der folgenden fehlerhaften Aktionen aus:
..
und das Hinzufügen von Zeichenfolgen ist eine Laufzeitausnahme)nil
der Sprachspezifikation entsprechen (dies hat mit einem Implementierungsdetail zu tun - es kann möglicherweise nicht von einem nicht existierenden globalen unterschieden werden). Wenn ein solches Symbol auftritt, wird ein Laufzeitfehler ausgelöst.quelle
Python Code - Bashing Computer mit einer Fledermaus (bildlich gesprochen)
Ich bin zu faul, um das zu beenden, aber jemand, bitte nimm meine Idee und renne damit! Das Ziel hier ist es, eine wichtige Komponente Ihres Computers zu löschen und Ausnahmen für diesen Teil auszunutzen, bis Sie schließlich ganz / etc oder / usr / bin oder etwas Wichtiges wie das rm und zusehen, wie das Ganze abstürzt und brennt. Ich bin sicher, Sie können eine Menge "25 Punkte" erzielen, wenn alles abstürzt. :)
Ich habe es auf Linux-Maschinen ausgerichtet. Dies muss natürlich als Root ausgeführt werden, um maximalen Schaden zu verursachen. Wenn Sie es wiederholt ausführen, bleibt Ihr System komplett überfrachtet!
Ausnahmen:
bat.py:
quelle
TI-BASIC, 130
Für Ihren TI-84 Taschenrechner
Schwerwiegende Fehler (in Reihenfolge):
quelle
PHP-Code: 38 (+2) Zeichen, 5 Fehler, nicht abfangbar
Liste möglicher Fehler:
Schwerwiegender Fehler: Die maximale Ausführungszeit von 'n' Sekunden in Zeile 1 ist
for(;;)
eine EndlosschleifeSchwerwiegender Fehler: Die zulässige Speichergröße von 2097152 Bytes ist in Zeile 1 erschöpft (es wurde versucht, 884737 Bytes zuzuweisen).
PHP hat eine
php.ini
Datei, und in einer Zeile steht, dassmemory_limit=
die maximale RAM-Nutzung in Bytes angegeben ist.Der Teil, in dem gesagt wird,
$e.=$e++
bedeutet,$e
dass das Ergebnis der Verkettung von sich selbst in jeder Iteration um 1 erhöht wird.Schwerwiegender Fehler: Klassenname muss ein gültiges Objekt oder eine Zeichenfolge in Zeile 1 sein.
Klassen in PHP können entweder über den Klassennamen oder durch Speichern des Klassennamens als Zeichenfolge in einer Variablen oder durch Zuweisen einer neuen Instanz der Klasse und Aufrufen aufgerufen werden .
Beispiel:
$b='PDO';$a=new $b();$a::connect();$b::connect()
-> Dies ist ein gültiger PHP-Code.Dieser Fehler tritt auf, weil er
$e
sichnull
in der ersten Iteration derfor(;;)
Schleife befindet.Fatal error: Funktionsname muss eine Zeichenfolge auf der Linie 1 sein
Gleiche wie Klassen, sondern Funktionen haben eine Zeichenfolge (und sein
$e
istnull
) oder der Name der Funktion direkt (Beispiel:a()
)Schwerwiegender Fehler: Es können keine Verweise auf Elemente eines temporären Array-Ausdrucks in Zeile 1 erstellt werden.
PHP verfügt über eine
foreach
Schleife, die alle Elemente in einem Array durchläuft. Dasas
Schlüsselwort wird verwendet , um den Namen der neuen Variablen , um anzuzeigen , verwendet , um eine Speicherung Kopie des Wertes des aktuellen Arrayindex.Bei der Verwendung von
foreach($array as &$v)
PHP wird eine Referenz erstellt , die&
vor dem Variablennamen steht.Es ist eine schwache Punktzahl (5 Fehler und ist nicht zu fangen) = 50 Punkte
PHP erlaubt es nicht, schwerwiegende Fehler abzufangen.
Unter Linux führt das Hinzufügen
shutdown -P +0
zwischen Backticks diesen Befehl aus (in diesem Fall wird das System abrupt heruntergefahren).Dies führt dazu, dass alle Prozesse angehalten werden.
Nicht sicher, ob dies für den Bonus gültig ist oder nicht.
quelle
In Actionscript
Funktionen werden in einer nie endenden Schleife aufgerufen, wodurch der Interpreter abstürzt.
quelle
insane
Programm machen würde .