Szukam (jestem?) Fragmentu kodu, który natychmiast się kończy - w absolutnie niekonwencjonalny sposób.
Nie oznacza to: System.exit((int) 'A');
(Java).
Może to oznaczać:
#!/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()
Najpopularniejsza odpowiedź wygrywa! Wszystkie języki, wszystkie architektury.
Edycja: rzucanie wyjątków nie będzie już akceptowane!
exit()
, ale wciąż jest to zaimplementowana funkcja ...Odpowiedzi:
uderzenie, 6 znaków
exec
zastępuje bieżący proces czymś innym.[
jest najkrótszym poleceniem, które mogę znaleźć, które jest nieszkodliwe (jest to aliastest
)źródło
exec
„ing na[
polecenia :)~ $ echo $PATH/?
->/bin/X /bin/[ /bin/w
. Rybia skorupa dała mi jeszcze dwa inne polecenia.w
jest moim zdaniem interesujące.Grzmotnąć
Kończy program tak szybko, jak użytkownik może zareagować ;-)
źródło
Redcode
(Tło: Redcode to pseudo-asembler używany w grze programistycznej Core War wprowadzonej przez AK Dewdney w 1984 roku. Zazwyczaj korzysta z samodomodyfikującego się kodu. Kilka lat temu napisałem fajny samouczek na temat programowania Redcode . )
Ten program z pojedynczą instrukcją nie tylko sam się zabija, ale także usuwa własny kod programu z pamięci, nie pozostawiając po sobie śladu w pamięci.
Nudny, mówisz? W końcu powyższy program i tak by umarł, nawet gdyby nie nadpisał swojego kodu. OK, oto taki, który wyciera cały rdzeń do czysta, zanim w końcu sam się wyciera i umiera:
Pierwsze dwie instrukcje faktycznie wykonują większość pracy: jest to zwykła pętla kopiowania / przeskakiwania, która kopiuje pustą komórkę instrukcji (która jest inicjowana
DAT 0, 0
) po zakończeniu programu do każdej kolejnej komórki (przy użyciu pośredniego trybu adresowania postkrementalnego>
), aż wskaźnik w końcu owinie się do początku pamięci i nadpiszeMOV
samą pętlę. Gdy to nastąpi,JMN
(JuMp, jeśli nie zero) wykrywa go i przewraca się.Problem polega na tym, że wciąż
JMN
nie rozprasza się. Aby się go pozbyć, musimy innyMOV
aby wytrzećJMN
... ale to oznacza, że musimy jeszcze innyMOV
do wycierania , któreMOV
i tak dalej. Aby cały program zniknął bez śladu, musimy jakoś zorganizować pojedyncząMOV
instrukcję, aby wyczyścić zarówno siebie, jak i co najmniej jedną inną instrukcję.Tam właśnie
SPL
przychodzi - to jeden z najdziwniejszych kodów w Redcode. Zasadniczo jest to instrukcja „Rozgałęziać obie drogi”. Widzisz, zamiast prostego rejestru „licznika programu”, jak każdy normalny procesor, maszyna wirtualna Redcode ma „kolejkę procesów”: cykliczną listę wskaźników do instrukcji do wykonania. Zwykle w każdym cyklu wskaźnik instrukcji jest przesuwany poza głowę kolejki, instrukcja jest wykonywana, a następna instrukcja (chyba że nastąpił skok lub niedozwolona instrukcja) jest wypychana na ogon kolejki. AleSPL
powoduje, że zarówno kolejna instrukcja, jak i podana instrukcja docelowa (która w przypadkuSPL 1
jest również kolejną instrukcją) jest wypychana do kolejki.Konsekwencją tego wszystkiego jest to, że po wykonaniu dwóch
SPL 1
instrukcji w kolejce są teraz cztery procesy, wszystko o wykonywaniu ostatniegoMOV
. To wystarczy, aby wyczyścićJMN
zarównoSPL
s , jak iMOV
samą, a także pozostawiaptr
komórkę instrukcji jakoDAT 0, 0
- nie do odróżnienia od otaczającego ją pustego rdzenia.(Ewentualnie moglibyśmy zastąpić
ptr
instrukcję instrukcjąMOV 1, 1
, która zostałaby przekonwertowanaMOV 1, 0
na wcześniejsze instrukcje, a więc sama by się wyczyściła, tak jak zrobił to pierwszy program powyżej).Ps. Jeśli chcesz przetestować ten program, pobierz symulator Redcode (inaczej MARS). Polecam albo CoreWin, albo czcigodny pMARS , chociaż jest też kilka innych dobrych symulatorów.
źródło
MOV source, dest
. Ale jak powiedziałem, całe adresowanie w Redcode jest względne, więc adres0
faktycznie oznacza „adres tej instrukcji”, podczas gdy adres1
faktycznie oznacza „adres tej instrukcji + 1”. (I absolutny adres 0 nie jest w żaden sposób specjalna w Redcode każdym razie, w rzeczywistości jeden interesujący konsekwencją „wszystko jest względne adresowanie” konstrukcja jest taka, że jest to rzeczywiście niemożliwe dla programu Redcode znaleźć swój własny adres bezwzględny w rdzeniu! )do
Pamiętaj, że to nie jest przenośny kod. Współpracuje z ZOG C na ART DS9000 . Uważam, że użycie niekonwencjonalnego uzbrojenia kwalifikuje ten kod do tego wyzwania. Jeśli obawiasz się, że opóźnienie w dostarczeniu tego fragmentu kodu nie kwalifikuje się jako natychmiastowe , skontaktuj się z nami, aby uzyskać porady na temat ostrzeżeń zapobiegawczych.
Na moim komputerze domowym nawet się nie kompiluje - nie mam odpowiednich sterowników i bibliotek. Słyszałem, że istnieją popularne implementacje języka C, w których ten program kompiluje się i działa z mniej spektakularnymi efektami, ale nigdy nie miałem odwagi spróbować.
źródło
JavaScript
Wystarczy przejść do innej ( pysznej ) strony internetowej. :-)
Gra w golfa (10 znaków):
źródło
DO#
Zabija się, zabijając każdy proces oprócz siebie.
Aby trochę urozmaicić, moglibyśmy
TerminateProcess
użyć PInvoke zamiast używaćProcess.Kill
źródło
BASH - 12 znaków
Klasyczny widelec. Blokuje komputer i zmusza użytkownika (lub administratora) do ponownego uruchomienia.
źródło
:()
i:|
Python (na starych laptopach)
Na starych laptopach z jednordzeniowymi procesorami i złym chłodzeniem:
Gdy laptop eksploduje (lub po prostu się wyłącza) po kilku godzinach, program się nie uruchomi.
(Aby uzyskać najlepsze wyniki, owiń laptopa w koc lub coś takiego)
źródło
Rubin
kill
s działający proces ruby / irb na * nix.źródło
Apple 2 Basic
źródło
POKE
zapisujeEND
token nadPRINT
tokenem, a następnie drugiPOKE
zapisuje terminator poleceń nad pierwszym"
. KiedyGOTO
zostanie wykonane, kończy sięEND
zamiast,PRINT
a program się kończy.W asemblerze coś takiego prawdopodobnie działałoby:
Pamiętam, że kompiluje to faktycznie działało DOS. Wtedy ponownie uruchomił komputer.
źródło
PHP
Efekty:
Usuwa twój kiepski plik skryptu, a następnie zabija program.
Wrzuć jednego z tych złych chłopców do bazy kodowej, aby zmylić ludzi.
źródło
quit
ale lista parametrów to kod do uruchomienia. Podczas próby uruchomienia pojawia się błąd analizy.C, 9 znaków
Kompiluje się z
gcc
innymi kompilatorami, które nie mają nic przeciwko drobnym szczegółom, takim jakmain
brak funkcji.Działa na
x86
platformach - program natychmiast kończy działanie.195 to kod operacji
ret
instrukcji.źródło
main
znajduje się w,.data
ponieważ jest to int, a nie in.text
i.data
jest ładowany na stronie niewykonywalnej.Zawsze chciałem gdzieś to opublikować, chyba pasuje tutaj, mimo że istnieje już akceptowana odpowiedź.
Działa to na dowolnym systemie post 4.3BSD i innych, które implementują
revoke
w ten sam sposób. Linux nie ma nawet prototypu, MacOS zrobił to w przeszłości, ale zwraca błędy tylko w najnowszych wersjach.revoke
pobiera ścieżkę do pliku i siłą niszczy wszystkie odwołania do tego pliku. Obejmuje to wszelkie mapowania pamięci tego pliku, nawet sam plik wykonywalny. Oczywiście musisz uruchomić program ze ścieżką do niego, to nie zadziała, jeśli zdarzy się, że jest w PATH.Odmianą tego, która powinna działać na większości systemów uniksowych, jest:
Po prostu odwzorowujemy stronę, która jest mapowana
main
, aby po wezwaniu domunmap
powrotu nie miała nigdzie do niej wrócić. Istnieje niewielka szansa, że wywołanie funkcjimunmap
jest tylko na granicy strony, a powrót zakończy się powodzeniem, więc aby być całkowicie pewnym, że to działa, prawdopodobnie najpierw musimy usunąć mapowanie dwóch stron.I oczywiście odmiana na ten sam temat:
Wystarczy odwzorować stos, abyśmy nie mieli do kogo wrócić. To samo zastrzeżenie co odmapowanie
main
- może być konieczne usunięcie mapowania dwóch stron, z wyjątkiem tego, że musimy pamiętać, że stos prawdopodobnie rośnie (chyba że korzystasz z PA-RISC lub innej dziwnej architektury tego typu).Kolejny sposób na wyciągnięcie dywanu spod własnych stóp:
Jest to zależne od systemu operacyjnego od tego, jak system obsługuje limit 0 sekund procesora i od tego, jak często rozlicza się czas procesora. MacOS natychmiast zabija proces, Linux wymaga pętli while, inny system, którego próbowałem, nie zrobił nic, nawet z limitem jednej sekundy, a pętla while nie debugowała dalej.
źródło
sh
Natychmiastowa paniczna kernal w systemie Linux. Przeznacza wszystkie procesy, w tym siebie
Cmd
Natychmiastowy niebieski ekran w systemie Windows. Kończy się
Client/Server Runtime SubSystem
. Pskill musi być zainstalowany.źródło
killall init
też działałoby?sudo killall init
W C (kompatybilny z Windows / Linux / (prawdopodobnie także Unix / Freed BSD)):
Przykład użycia:
Pod Windows skompiluj z:
I Linux:
Zakładając, że kompilator jest zainstalowany i w bieżącej zmiennej PATH.
EDYCJA: Technicznie generuje wyjątek (zgłoszony przez procesor) w systemie Linux, ale nie ma takiego komunikatu w systemie Windows. Więc ten wpis prawdopodobnie nie jest prawidłowy; jednak myślę, że to fajne: P
EDYCJA: W asemblerze x86 (używając NAsm / YAsm)
Połącz z:
(Windows)
(Linux)
Niestety w ten sposób produkuje się również zrzut pamięci na Linux, więc uważam, że jest funkcjonalnie równoważny metodzie C; z wyjątkiem bardziej wydajnych.
źródło
-Wall -Wextra -std=c99 -pedantic
i nie ma żadnych ostrzeżeń.Haskell traktuje sprawy dosłownie w głupi sposób:
źródło
Pyton
Za pomocą
multiprocessing
modułu możemy odrodzić inny wątek, którego zadaniem jest komunikacja z pierwotnym procesem za pośrednictwem kolejki, informując go, kiedy należy wyjść:źródło
ANSI C
Bez optymalizacji kodu następujący program kończy się tak szybko - w rzeczywistości nie można go uruchomić, nawet jeśli skompiluje się w poprawny program
może to zależeć od systemu - skomentuj, jeśli możesz go uruchomić.
źródło
W porządku. Jeśli zwykłe wywołanie
System.exit
nie jest dozwolone w Javie, co powiesz na wywołanie poprzez odbicie z innego wątku?Wyszukuje metodę wyjścia, odradza nowy wątek i odlicza
czas,aż ten wątek zabije proces, wywołując wyjście przez odbicie.źródło
język maszynowy x86, 1 znak
Zazwyczaj można wykonać wykonalny plik wykonywalny z jednej instrukcji RET
źródło
C (Linux)
Wersja samobójcza
Wysyła SIGKILL do siebie.
Wersja „Tu quoque mi fili”
Forks, a następnie syn zabija ojca.
źródło
Perl
To wszystko.
Objaśnienie: Zgłasza wyjątek
Unimplemented
i natychmiast kończy działanie.źródło
Partia i debugowanie
Starsze ale dobre, działa na maszynach DOS w celu natychmiastowego ponownego uruchomienia systemu. Premia w tym, że jest to jeden skrypt przeznaczony do interpretacji przez dwóch różnych niekompatybilnych tłumaczy.
reset.bat
Interpretacja pliku wsadowego pomija instrukcje przeznaczone do debugowania i podaje się do debugowania w celu interpretacji. Pusty wiersz po
goto
jest potrzebny, aby usunąć błąd wdebug
wynikach, ponieważ podano mu nieznane polecenie, którym jest goto.źródło
Jawa
Poniższy kod nie jest testowany i będzie działał tylko na niektórych platformach.
źródło
sudo reboot
system Windowsshutdown /r /t 0
sudo java Quitter
.PowerShell
Zapisz to jako „lastresort.ps1” i powinno wystarczyć.
Jeśli napotkasz problemy z niewykonywaniem skryptu z powodu pewnych głupich zasad, wpisz to przed wykonaniem skryptu:
źródło
TI-Basic 84
źródło
Python (jednoliniowa alternatywa dla OP)
Uznałem, że nie ma tak naprawdę lepszej odpowiedzi w Pythonie niż sugestia OP, ale nie podobało mi się, ile było tak wielu linii, więc oto, jak robisz dokładnie tak, jak OP, ale w jednym wierszu:
Możesz sprawić, by ta funkcja działała dla Ciebie.
źródło
Mój własny pomysł, brak udziału
TIGCC (dla Texas Instrumens TI-89, TI-89 Titanium, TI-92 +, TI-V200)
TI-Basic dla tych samych kalkulatorów
Co robi program: Najpierw usuwa się z pamięci RAM. (Nie wkładaj go do pamięci ROM, bo inaczej nie zadziała ...) Może nadal działać, ponieważ podczas wykonywania tworzona jest i wykonywana kopia programu.
asm(trap #2);
wywołuje polecenie ASM4E424E750000
, które służy do resetowania kalkulatora, usunięcia jego pamięci RAM (Flash ROM pozostaje nietknięty) i ponowną instalację wszystkich aplikacji.EDYCJA: Właśnie przetestowałem wersję podstawową. Nie można go usunąć ...
źródło
Format MS-DOS .com
Zapisuje w pamięci nieprawidłowe instrukcje (FFFF), a następnie je wykonuje, powodując awarię NTVDM.
Szesnastkowy
Język asemblera Debug.exe
źródło