Awaria (tzn. Powoduje, że interpreter przestaje działać i wymusza zamknięcie) Python [zamknięty]

16

Chciałbym zobaczyć, kto może doprowadzić do katastrofy Pythona przy najbardziej kreatywnym kodzie. Oznacza to, że kiedy program się uruchomi, na przykład Windows przejmie kontrolę i wyświetli komunikat „IDLE przestał działać”, lub Linux zrobi wszystko, co Linux zrobi, gdy program się zawiesi.

Zasady:

  1. Trzeba to zrobić w Pythonie 2.7 lub nowszym (więc stare błędy nie są wykorzystywane, które zostały naprawione w przyszłych wersjach Pythona).

  2. Definicja „awarii” to „IDLE lub Python zamykają się w niezamierzony sposób”. Nie oznacza to „zatrzymaj IDLE lub Python i daj ślad”. Oznacza to również, że exit, sys.quit, abort itp. Nie są prawidłowymi odpowiedziami. Na przykład nie zostanie to zaakceptowane:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Sprawianie, że Python przestaje odpowiadać, nie jest akceptowane.

  4. Kod musi zostać wyjaśniony na temat tego, co robi, aby zawiesić. Link do raportu o błędzie jest w porządku.

Najpopularniejsza odpowiedź po 10 dniach wygrywa! Zaczynać!!

EDYCJA: Czy mogę wyjaśnić, że celem nie jest spowodowanie, aby Python po prostu przestał uruchamiać program za pomocą funkcji śledzenia. Celem jest, aby Python całkowicie przestał działać lub przestał działać. Oznacza to, że jeśli to zadanie zostanie pomyślnie wykonane, system Windows to poda (nie zawieszam tutaj programu Word, to tylko przykład tego, co powinno się stać dla innego programu):

dialog błędów

albo to:

dialog błędów 2

Jerzy
źródło
1
Wyzwanie kodem tagu wymaga obiektywnego kryterium wygranej. Myślę, że najbardziej kreatywny nie jest wystarczająco obiektywny ...
Howard
Ok - Zrobię to tak krótko, jak to możliwe, jak większość innych wyzwań .. Kreatywność jest dość dwuznaczna ...
George
@GeorgeH Jeśli szukasz kreatywności, konkurs popularności działa idealnie. Osobiście uważam, że byłby to najlepszy konkurs na popularność. W przyszłości możesz przepytać swoje pytanie przez piaskownicę, w której można je opracować przed opublikowaniem.
Justin
2
@ Ludzie z wysokim przedstawicielem, moje prntpytanie jest celowe.
George
6
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ to pytanie wymaga złośliwego kodu.
AdmBorkBork

Odpowiedzi:

18

Powinien to być konkurs golfowy;) - Myślę, że kreatywność to stwierdzenie, które kod: „Po prostu nie wiem, co się tutaj dzieje…”

Skopiuj i wklej następujący znak w IDLE uruchomionym w systemie Windows:

𐒢

Awaria ma coś wspólnego z postacią kodowaną przez UTF-16 przez Windows i nieudaną konwersją na postać UTF-8 przez IDLE ...

Edycja: błąd python # 13153

David Herrmann
źródło
Nie jestem pewien, czy to naprawdę prawidłowa odpowiedź. Pytanie brzmi „kiedy program się uruchomi”. Ale tutaj program tak naprawdę nigdy nie jest uruchamiany. IDLE ulega awarii, gdy wystarczy wkleić plik 𐒢, zanim będzie można go uruchomić.
Sebastian Negraszus
Tak, muszę się zgodzić z @Sebastian. W programie Python zaczynasz od pliku tekstowego i uruchamiasz na nim interpreter Pythona, ale nie powinno to mieć znaczenia, jak tworzysz plik tekstowy.
David Z
1
Um ... puu.sh/7eVar.png
Oberon
Działa również na Macu!
TheDoctor
19

ctypes nadużycie:

import ctypes;ctypes.string_at(1)

Spowoduje to przekazanie 1 na adres i wyrejestrowanie go. W każdym zdrowym systemie (tj. W którym 0x00000001 nie jest adresem zamapowanym), spowoduje to natychmiastową awarię.

nneonneo
źródło
Na moim komputerze nie wydaje się to zawieszać interpretera. Wyświetlane jest śledzenie z błędem WindowsError.
Dhara
@Dhara: Ach, to byłby zorganizowany moduł obsługi wyjątków ctypes wychwytujący awarię. Jestem pewien, że możesz zawiesić Pythona ctypesw Windowsie w inny sposób, ale być może nie tak mało znaków.
nneonneo
12

60

import sys
sys.setrecursionlimit(1<<30)
f=lambda f:f(f)
f(f)

Nie mój własny pomysł. Skopiowane z Pythona Wiki tutaj .

Powoduje to nieskończoną rekurencję i nie jest zatrzymywane przez interpretera, ponieważ zmieniliśmy limit rekurencji.

użytkownik12205
źródło
Dzięki - to świetna odpowiedź, ale na złe pytanie! Cel nie został wyjaśniony w pytaniu. Dziękuję za odpowiedź.
George
2
@George H Niestety nie używam teraz komputera z systemem Windows, ale czy błąd segmentacji nie powoduje, że interpreter Pythona zrzuca rdzeń? i.imgur.com/5gSGBpr.png
12205
10

signal nadużycie (tylko inne niż Windows):

import os;os.kill(0,4)

W większości systemów (w których SIGILL = 4) spowoduje to zabicie Pythona z błędem „niedozwolonej instrukcji”.

Lub możesz zabić program za pomocą budzika zabójcy :

import signal;signal.alarm(1)

Po chwili Python umiera z tajemniczą wiadomością „Budzik”.

nneonneo
źródło
Inne
jednoznakowe
9

W Python 3.3:

exec(type((lambda:0).__code__)(0,1,0,0,0,b'',(),(),(),'','',1,b''))

W kodzie Python 2.7 obiekty są nieco inne:

exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')

Tak, możesz przekazać dowolne stare śmieci do interpretera kodu bajtów i wykonuje to ( problem w języku Python # 17187 ).


źródło
Krótszy (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo
Dzięki! A w Pythonie 3 możemy użyć .__code__.
6

Iteratory rekurencyjne używają stosu C, a nie stosu Python ( problem nr 14010 i problem nr 14507 ):

i=''
for _ in range(9**6):i=filter(int,i)
del i

źródło
Nie powoduje to awarii Python 2.7.11 na moim komputerze Mac, ale powoduje awarię Python 3.5.1.
nneonneo,
4

Jednym z łatwych sposobów na zawieszenie interpretera jest oszukanie go w celu cofnięcia przydziału Brak:

import ctypes, sys
(ctypes.c_char*4).from_address(id(None))[:] = '\0'*4

Jako bonus, oto sprytny sposób na segfault Python 2:

import ctypes, struct, sys
inner = ()
outer = (inner,)
c_outer = (ctypes.c_char * sys.getsizeof(outer)).from_address(id(outer))
inner_index = c_outer[:].find(struct.pack('P', id(inner)))
c_outer[inner_index:inner_index+struct.calcsize('P')] = struct.pack('P', id(outer))
print outer

To, co dokładnie to robi, pozostawia czytelnikowi ćwiczenie.

Fraxtil
źródło
2
Po pierwsze: ustaw wartość zero na zero, co spowoduje, że zostanie ona przezabawnie zwolniona. Drugi: zbuduj i wydrukuj krotkę z odnośnikami.
nneonneo
3

Ktoś pomyślał, że może zapobiec tworzeniu nowych FlagsTypeobiektów przez ustawienie FlagsType.tp_new = NULL, ale zapomniał usunąć metodę ( problem # 13204 ):

import sys
t=type(sys.flags)
t.__new__(t)

( sys.version_infoma ten sam błąd.)


źródło
3

Zastosowanie allocaw ctypesmodule ( nr 13096 ):

from ctypes import *
POINTER('a'*9**8)

źródło
0

Jednym możliwym sposobem, który powoduje awarię mojego Pythona MemoryError:

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Wizja
źródło
2
To nie działa dla mnie - po prostu sprawia, że ​​Python zatrzymuje się przy pomocy MemoryError. Musi zostać zamknięty przez system operacyjny.
George
2
Huh Błąd występuje na zaskakująco małej głębokości.
user2357112 obsługuje Monikę