Ich suche (bin ich?) Nach einem Code, der sofort beendet wird - auf eine absolut unkonventionelle Weise.
Dies bedeutet nicht: System.exit((int) 'A');
(Java).
Es könnte bedeuten:
#!/usr/bin/env python3
# NOTE: This kills ALL RUNNING Python processes. Be careful!
def exit():
import os
os.system("killall python3")
# Windows addon
os.system("taskkill /im python.exe /f")
exit()
Die am besten bewertete Antwort gewinnt! Alle Sprachen, alle Architekturen.
Bearbeiten: Das Beenden durch Ausnahmen wird nicht mehr akzeptiert!
exit()
, aber es ist immer noch eine implementierte Funktion ...Antworten:
Bash, 6 Zeichen
exec
ersetzt den aktuellen Prozess durch etwas anderes.[
ist der kürzeste Befehl, den ich finden konnte, der harmlos ist (ein Alias fürtest
)quelle
exec
[
~ $ echo $PATH/?
->/bin/X /bin/[ /bin/w
. Fish Shell gab mir zwei weitere Befehle.w
ist meiner meinung nach interessant.Bash
Beendet das Programm so schnell der Benutzer reagieren kann ;-)
quelle
Redcode
(Hintergrund: Redcode ist die Pseudo-Assembler-Sprache, die in dem 1984 von AK Dewdney eingeführten Programmierspiel Core War verwendet wird. Dabei wird in der Regel stark auf selbstmodifizierenden Code zurückgegriffen. Ich habe vor einigen Jahren ein nettes kleines Tutorial zur Redcode-Programmierung geschrieben. )
Dieses Einzelanweisungsprogramm tötet sich nicht nur selbst, sondern löscht auch seinen eigenen Programmcode aus dem Speicher und hinterlässt keine Spur von sich selbst im Speicher.
Langweilig, sagst du? Immerhin wäre das obige Programm ohnehin abgestorben, selbst wenn es seinen Code nicht überschrieben hätte. OK, hier ist einer, der den gesamten Kern sauber wischt , bevor er sich endgültig abwischt und stirbt:
Die ersten beiden Befehle erledigen tatsächlich den größten Teil der Arbeit: Es ist nur eine einfache Kopier- / Sprungschleife, die die leere Befehlszelle (auf die initialisiert wird
DAT 0, 0
) nach dem Programmende in jede nachfolgende Zelle kopiert (unter Verwendung des indirekten Adressierungsmodus nach Inkrementierung)>
), bis der Zeiger schließlich an den Anfang des Speichers springt und denMOV
in der Schleife selbst überschreibt . Sobald dies geschieht,JMN
erkennt das (JuMp wenn nicht Null) es und fällt durch.Das Problem ist, dass dies immer noch die
JMN
selbst abgewischt lässt. Um es loszuwerden, brauchen wir einen anderenMOV
, um das abzuwischenJMN
... aber das bedeutet, wir brauchen noch einen anderenMOV
, um das abzuwischenMOV
, und so weiter. Um das gesamte Programm spurlos verschwinden zu lassen, müssen wir irgendwie dafür sorgen, dass eine einzelneMOV
Anweisung sowohl sich selbst als auch mindestens eine andere Anweisung löscht .Hier
SPL
kommt das ins Spiel - es ist einer der seltsamsten Opcodes in Redcode. Grundsätzlich handelt es sich um eine Anweisung zum Verzweigen in beide Richtungen. Sie sehen, anstelle eines einfachen "Programmzähler" -Registers, wie es jede normale CPU hätte, hat die Redcode-VM eine "Prozesswarteschlange": eine zyklische Liste von Zeigern auf auszuführende Anweisungen. Normalerweise wird bei jedem Zyklus ein Befehlszeiger vom Kopf der Warteschlange verschoben, der Befehl wird ausgeführt und der nächste Befehl (es sei denn, es gab einen Sprung oder einen unzulässigen Befehl) wird auf das Ende der Warteschlange geschoben. DochSPL
bewirkt sowohl die nächste Anweisung und der gegebene Zielbefehl (die im Fall vonSPL 1
, ist auch der nächste Befehl) in der Warteschlange eingeschoben werden.Dies alles hat zur Folge, dass sich nach
SPL 1
Ausführung der beiden Befehle nun vier Prozesse in der Warteschlange befinden, von denen der letzte ausgeführt wirdMOV
. Dies ist gerade genug, umJMN
sowohl dasSPL
s als auch dasMOV
selbst abzuwischen , und es lässt auch dieptr
AnweisungszelleDAT 0, 0
ununterscheidbar von dem leeren Kern, der sie umgibt.(Alternativ hätten wir die
ptr
Anweisung durch eine Anweisung ersetzen könnenMOV 1, 1
, dieMOV 1, 0
von den früheren Anweisungen konvertiert wurde , und sich daher selbst gelöscht hätten, genau wie das erste obige Programm.)Ps. Wenn Sie dieses Programm testen möchten, laden Sie einen Redcode-Simulator (auch bekannt als MARS) herunter . Ich würde entweder CoreWin oder das ehrwürdige pMARS empfehlen , obwohl es auch einige andere gute Simulatoren gibt.
quelle
MOV source, dest
. Aber wie gesagt, alle Adressen in Redcode sind relativ, so dass die Adresse0
tatsächlich "die Adresse dieses Befehls" bedeutet, während die Adresse1
tatsächlich "die Adresse dieses Befehls + 1" bedeutet. (Und die absolute Adresse 0 ist nicht in irgendeiner Weise besondere in Redcode sowieso, in der Tat eine interessante Konsequenz der „all relative Adressierung“ Design ist , dass es tatsächlich ist unmöglich für ein Redcode Programm seine eigene absolute Adresse im Kern zu finden! )C
Beachten Sie, dass dies kein portabler Code ist. Es funktioniert mit ZOG C auf dem ART DS9000 . Ich glaube, dass der Einsatz von unkonventioneller Rüstung diesen Kodex für diese Herausforderung qualifiziert. Wenn Sie befürchten, dass die Verzögerung für die Auslieferung des Codes nicht sofort eintritt , wenden Sie sich an uns, um Ratschläge zu Präventivschlägen zu erhalten.
Auf meinem Heimcomputer wird es nicht einmal kompiliert - ich habe nicht die richtigen Treiber und Bibliotheken. Ich habe gehört, dass es beliebte C-Implementierungen gibt, in denen dieses Programm kompiliert und mit weniger spektakulären Effekten ausgeführt wird, aber ich hatte nie den Mut, es zu versuchen.
quelle
JavaScript
Navigiert einfach zu einer anderen ( leckeren ) Website. :-)
Golf (10 Zeichen):
quelle
C #
Tötet sich selbst, indem jeder Prozess außer sich selbst beendet wird.
Um es ein wenig aufzupeppen, könnten wir PInvoke verwenden,
TerminateProcess
anstatt es zu verwendenProcess.Kill
quelle
BASH - 12 Zeichen
Klassische Gabelbombe. Sperrt den Computer und zwingt den Benutzer (oder Administrator) zum Neustart.
quelle
:()
und:|
Python (auf alten Laptops)
Auf alten Laptops mit Single-Core-Prozessoren und schlechter Kühlung:
Wenn der Laptop nach einigen Stunden explodiert (oder sich nur ausschaltet), wird das Programm nicht ausgeführt.
(Um optimale Ergebnisse zu erzielen, wickeln Sie den Laptop in eine Decke oder Ähnliches.)
quelle
Rubin
kill
s der laufende ruby / irb-prozess auf * nix.quelle
Apple 2 Basic
quelle
POKE
schreibt also einEND
Token über dasPRINT
Token, und der zweitePOKE
schreibt einen Befehlsabschluss über das erste"
. Wenn dieGOTO
ausgeführt wird, endet es angeranntEND
stattPRINT
und das Programm endet.In der Montage würde wahrscheinlich so etwas funktionieren:
Ich erinnere mich, dass diese Kompilierung tatsächlich DOS funktionierte. Damals wurde der Computer neu gestartet.
quelle
PHP
Effekte:
Löscht Ihre beschissene Skriptdatei und beendet dann Ihr Programm.
Wirf einen dieser bösen Jungs in eine Codebasis, um die Leute zu verwirren.
quelle
quit
aber die Parameterliste ist auszuführender Code. Beim Ausführen wird ein Analysefehler angezeigt.C 9 Zeichen
Kompiliert mit
gcc
und mit anderen Compilern, denen kleine Detailsmain
nichts ausmachen, weil sie keine Funktion sind.Funktioniert auf
x86
Plattformen - das Programm wird sofort beendet.195 ist der Operationscode der
ret
Anweisung.quelle
main
befindet sich in,.data
weil es ein int ist, nicht in.text
, und.data
wird in eine nicht ausführbare Seite geladen.Ich wollte das schon immer irgendwo posten, ich denke es passt hier, obwohl es bereits eine akzeptierte Antwort gibt.
Dies funktioniert auf allen Post 4.3BSD-Systemen und anderen Systemen, die
revoke
auf die gleiche Weise implementiert werden. Linux funktioniert nicht, obwohl es einen Prototyp dafür gibt, MacOS hat dies in der Vergangenheit getan, sondern gibt nur Fehler in den letzten Versionen zurück.revoke
nimmt einen Pfad zu einer Datei und zerstört gewaltsam alle Verweise auf diese Datei. Dies schließt alle Speicherzuordnungen dieser Datei ein, auch die ausführbare Datei selbst. Offensichtlich müssen Sie das Programm mit einem Pfad dazu starten. Dies funktioniert nicht, wenn es sich zufällig in PATH befindet.Eine Variante davon, die auf den meisten Unix-ähnlichen Systemen funktionieren sollte, ist:
Die Zuordnung der Seite wird einfach aufgehoben,
main
sodass der Aufrufmunmap
von return nirgendwo mehr Platz hat, zu dem er zurückkehren kann. Es besteht eine geringe Wahrscheinlichkeit, dass sich der Funktionsaufrufmunmap
nur an einer Seitengrenze befindet und die Rückgabe erfolgreich ist. Um sicherzugehen, dass dies funktioniert, müssen wir wahrscheinlich zuerst versuchen, zwei Seiten zu trennen.Und natürlich eine Variation zum selben Thema:
Heben Sie einfach die Zuordnung des Stapels auf, damit wir nirgendwo mehr zurückkehren können. Gleiche Einschränkung wie beim Aufheben der Zuordnung
main
- wir müssen möglicherweise zwei Seiten aufheben, außer dass wir uns daran erinnern müssen, dass der Stapel wahrscheinlich größer wird (es sei denn, Sie verwenden PA-RISC oder eine andere seltsame Architektur wie diese).Eine andere Möglichkeit, den Teppich unter den eigenen Füßen hervorzuziehen:
Es hängt vom Betriebssystem ab, wie das System mit einem CPU-Limit von 0 Sekunden umgeht und wie oft die CPU-Zeit abgerechnet wird. MacOS bricht den Prozess sofort ab, Linux benötigt die while-Schleife, ein anderes System, das ich ausprobiert habe, hat trotz einer Beschränkung von einer Sekunde und einer while-Schleife nichts unternommen, ich habe nicht weiter debuggt.
quelle
Sch
Sofortige Panik unter Linux. Zerstört alle Prozesse, einschließlich sich selbst
Cmd
Sofortiger blauer Bildschirm unter Windows. Beendet die
Client/Server Runtime SubSystem
. Pskill muss installiert sein.quelle
killall init
auch funktionieren?sudo killall init
In C (Compatible Windows / Linux / (wahrscheinlich auch Unix / Freed BSD)):
Anwendungsbeispiel:
Unter Windows kompilieren mit:
Und Linux:
Angenommen, der Compiler ist installiert und befindet sich in der aktuellen PATH-Variablen.
BEARBEITEN: Technisch wird unter Linux eine (vom Prozessor ausgelöste) Ausnahme ausgelöst, unter Windows gibt es jedoch keine solche Meldung. Daher ist dieser Eintrag wahrscheinlich nicht gültig. aber ich finde es cool: P
BEARBEITEN: In x86 Assembler (mit NAsm / YAsm)
Kompilieren mit:
(Windows)
(Linux)
Leider wird auf diese Weise auch ein Core-Dump unter Linux erstellt, weshalb es meiner Meinung nach der C-Methode funktional entspricht. außer effizienter.
quelle
-Wall -Wextra -std=c99 -pedantic
und es gibt überhaupt keine Warnungen.Mit Haskell die Dinge buchstäblich albern nehmen:
quelle
Python
Mit dem
multiprocessing
Modul können wir einen anderen Thread erzeugen, dessen Aufgabe es ist, über eine Warteschlange mit dem ursprünglichen Prozess zu kommunizieren und ihm mitzuteilen, wann er beendet werden soll:quelle
ANSI C
Ohne Codeoptimierung wird das folgende Programm so schnell beendet - es kann tatsächlich nicht gestartet werden, obwohl es in ein gültiges Programm kompiliert wurde
Dies kann systemabhängig sein - Kommentar, wenn Sie es starten können.
quelle
Okay. Wenn das einfache Aufrufen
System.exit
in Java nicht zulässig ist, wie wäre es dann, wenn Sie es über die Reflektion eines anderen Threads aufrufen?Sucht nach der exit-Methode, erzeugt einen neuen Thread und zählt
herunter,bis dieser Thread den Prozess abbricht, indem exit über Reflection aufgerufen wird.quelle
x86-Maschinensprache, 1 Zeichen
Normalerweise können Sie eine ausführbare Datei aus einer RET-Anweisung erstellen
quelle
C (Linux)
Selbstmord-Version
Sendet einen SIGKILL an sich.
Version "Tu quoque mi fili"
Gabeln, dann tötet der Sohn den Vater.
quelle
Perl
Das ist alles.
Erläuterung: Die Ausnahme wird
Unimplemented
ausgelöst und sofort beendet.quelle
Batch & Debug
Ein Oldie aber Goodie, funktioniert auf DOS-Rechnern für einen sofortigen Systemneustart. Ein Bonus ist, dass es sich um ein Skript handelt, das von zwei verschiedenen, inkompatiblen Interpreten interpretiert werden soll.
reset.bat
Die Batchdatei-Interpretation überspringt die Anweisungen, die für das Debuggen vorgesehen sind, und führt sich selbst dem Debuggen zur Interpretation zu. Die leere Zeile danach
goto
wird benötigt, um den Fehler zu löschen, der sich darausdebug
ergibt, dass ein unbekannter Befehl (goto) eingegeben wurde.quelle
Java
Der folgende Code ist nicht getestet und funktioniert nur auf einigen Plattformen.
quelle
sudo reboot
, unter Windowsshutdown /r /t 0
sudo java Quitter
.Power Shell
Speichern Sie dies als 'lastresort.ps1' und es sollte den Trick machen.
Wenn Sie auf Probleme stoßen, bei denen das Skript aufgrund einer dummen Richtlinie nicht ausgeführt wird, geben Sie Folgendes ein, bevor Sie das Skript ausführen:
quelle
TI-Basic 84
quelle
Python (eine einzeilige Alternative zum OP)
Ich dachte, es gäbe keine wirklich bessere Python-Antwort als das, was das OP vorschlug, aber ich mochte nicht, wie viele Zeilen es waren. Deshalb tun Sie genau so, wie das OP es tat, aber in einer Zeile:
Sie können dies zu einer Funktion machen und sie erledigt die Arbeit für Sie.
quelle
Meine eigene Idee, nicht teilzunehmen
TIGCC (für Texas Instrumens TI-89, TI-89 Titan, TI-92 +, TI-V200)
TI-Basic für die gleichen Rechner
Was das Programm macht: Zuerst löscht es sich aus dem RAM. (Legen Sie es nicht in das ROM oder es funktioniert nicht ...) Es kann weiterhin ausgeführt werden, da bei der Ausführung eine Kopie des Programms erstellt und ausgeführt wird.
asm(trap #2);
Ruft den ASM-Befehl auf4E424E750000
, bei dem es sich um den Befehl zum Zurücksetzen des Rechners, zum Löschen des Arbeitsspeichers (Flash-ROM bleibt unberührt) und zum erneuten Installieren aller Anwendungen handelt.EDIT: Habe gerade die Basic Version getestet. Es kann sich nicht selbst löschen ...
quelle
MS-DOS .com-Format
Es schreibt ungültige Anweisungen (FFFF) in den Speicher und führt sie dann aus, wodurch NTVDM abstürzt.
Hexadezimal
Assemblersprache Debug.exe
quelle