Crash (ovvero causa l'interruzione del lavoro dell'interprete e la sua forzatura in chiusura) Python [chiuso]


16

Vorrei vedere chi può fare in modo che Python abbia un arresto irreversibile con il codice più creativo. Ciò significa che quando il programma viene eseguito, ad esempio Windows, prenderà il sopravvento e si aprirà con qualcosa come "IDLE ha smesso di funzionare", o Linux farà qualsiasi cosa Linux faccia quando un programma si blocca.

Regole:

  1. Questo deve essere fatto in Python 2.7 o versioni successive (quindi i vecchi bug non vengono sfruttati e sono stati corretti nelle versioni future di Python).

  2. La definizione di "crash" è "far uscire IDLE o Python in modo non intenzionale". Questo non significa "fermare IDLE o Python e dare un traceback". Questo significa anche che exit, sys.quit, abort etc non sono risposte valide. Ad esempio, questo non sarà accettato:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Far smettere di rispondere a Python non è accettato.

  4. Il codice deve essere spiegato su cosa fa in caso di arresto anomalo. Un collegamento a una segnalazione di bug va bene.

La risposta più votata dopo 10 giorni vince! Inizio!!

EDIT: Posso chiarire che l'obiettivo non è quello di far interrompere Python semplicemente eseguendo il programma con un traceback. L'obiettivo è rendere Python completamente in crash o smettere di funzionare. Ciò significa che se questa attività viene eseguita correttamente, Windows darebbe questo (non sto andando in crash Word qui, è solo un esempio di cosa dovrebbe accadere per un programma diverso):

dialogo di errore

o questo:

dialogo di errore 2


1
Il tag code-challenge richiede un criterio vincente oggettivo. Penso che la maggior parte dei creativi non sia abbastanza oggettiva ...
Howard,

Ok - Lo cambierò il più breve possibile, come la maggior parte delle altre sfide. La creatività in realtà è abbastanza ambigua ...
George

@GeorgeH Se la creatività è ciò che stavi cercando, il concorso di popolarità funziona perfettamente. Personalmente ritengo che questo sarebbe meglio come concorso di popolarità. In futuro, puoi eseguire la tua domanda attraverso la sandbox in cui questi nodi possono essere elaborati prima della pubblicazione.
Giustino,

2
@Persone con alto rappresentante, la mia prntdomanda è intenzionale.
George

6
Sto votando per chiudere questa domanda come fuori tema perché questa domanda richiede codice dannoso.
AdmBorkBork,

Risposte:


18

Avrebbe dovuto essere una gara di code-golf;) - Immagino che la creatività sia l'affermazione che il codice fa: "Semplicemente non so cosa sta succedendo qui ..."

Copia e incolla il seguente carattere in IDLE in esecuzione su Windows:

𐒢

Il crash ha a che fare con il personaggio che viene codificato come UTF-16 da Windows e la conversione non riuscita in un personaggio UTF-8 da IDLE ...

Modifica: bug python # 13153


Non sono sicuro che questa sia davvero una risposta valida. La domanda dice "quando il programma viene eseguito". Ma qui il programma non è mai realmente eseguito. IDLE si arresta in modo anomalo quando si incolla semplicemente 𐒢, prima ancora di eseguirlo.
Sebastian Negraszus,

Sì, devo essere d'accordo con @Sebastian. In un programma Python si inizia con un file di testo ed si esegue l'interprete Python su di esso, ma non dovrebbe importare come si crea il file di testo.
David Z


Funziona anche su Mac!
TheDoctor

19

ctypes abuso:

import ctypes;ctypes.string_at(1)

Questo lancia 1 a un indirizzo e lo dereferenzia. Su qualsiasi sistema sano (vale a dire uno su cui 0x00000001 non è un indirizzo mappato), questo si collegherà all'istante.


Sulla mia macchina, questo non sembra mandare in crash l'interprete. Viene visualizzato un traceback con un errore WindowsError.
Dhara,

@Dhara: Ah, sarebbe il gestore delle eccezioni strutturato di ctypes che cattura l'incidente. Sono certo che puoi bloccare Python con ctypesWindows in qualche altro modo, ma forse non con così pochi caratteri.
nneonneo,

12

60

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

Non è una mia idea. Copiato dal Wiki Python qui .

Ciò provoca una ricorsione infinita e non viene interrotto dall'interprete perché abbiamo modificato il limite di ricorsione.


Grazie - questa è un'ottima risposta, ma per la domanda sbagliata! L'obiettivo non è stato chiarito nell'interrogazione. Grazie per la tua risposta però.
George,

2
@ George H Mi dispiace non sto usando una macchina Windows ora, ma non è un errore di segmentazione che causa il dump dell'interprete Python per il core abbastanza? i.imgur.com/5gSGBpr.png
user12205

10

signal abuso (solo non Windows):

import os;os.kill(0,4)

Sulla maggior parte dei sistemi (su cui SIGILL = 4) questo ucciderà Python con un errore "istruzioni illegali".

Oppure puoi uccidere il programma usando la sveglia killer :

import signal;signal.alarm(1)

Dopo un secondo, Python muore con il messaggio criptico "Sveglia".


Altri codici di segnale a carattere singolo che funzionano includono 1, 3, 5, 6, 8 e 9.
user12205

9

In Python 3.3:

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

In Python 2.7 gli oggetti di codice sono leggermente diversi:

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

Sì, puoi passare qualsiasi vecchia spazzatura all'interprete del codice byte e lo esegue ( problema Python n. 17187 ).


Shorter (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo,

Grazie! E in Python 3 possiamo usare .__code__.

6

Gli iteratori ricorsivi usano lo stack C, non lo stack Python ( numero 14010 e numero 14507 ):

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

Questo non provoca l'arresto anomalo di Python 2.7.11 sul mio Mac, ma provoca l'arresto anomalo di Python 3.5.1.
nneonneo,

4

Un modo semplice per bloccare l'interprete è indurlo a deallocare None:

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

Come bonus, ecco un modo intelligente per 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

Ciò che fa esattamente questo è lasciato come esercizio al lettore.


2
Primo: imposta il conteggio di Nessuno su zero, facendo sì che venga deallocato in modo esilarante. Secondo: costruisci e stampa una tupla autoreferenziale.
nneonneo,

3

Qualcuno pensava di poter impedire la FlagsTypecreazione di nuovi oggetti impostando FlagsType.tp_new = NULL, ma si sono dimenticati di rimuovere il metodo ( numero 13204 ):

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

( sys.version_infoha lo stesso bug.)


3

Uso di allocanel ctypesmodulo ( numero 13096 ):

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

0

Un modo possibile che blocca il mio Python con MemoryError:

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

2
Questo non funziona per me - fa semplicemente fermare Python con a MemoryError. Deve essere chiuso dal sistema operativo.
George,

2
Huh. L'errore si verifica a una profondità sorprendentemente bassa.
user2357112 supporta Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.