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


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


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


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ę.


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.


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”.



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 ).


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

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.


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.)


3

Zastosowanie allocaw ctypesmodule ( nr 13096 ):

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

0

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

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

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ę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.