Crash (es decir, hacer que el intérprete deje de funcionar y forzar el cierre) Python [cerrado]

16

Me gustaría ver quién puede hacer que Python tenga un bloqueo fatal con el código más creativo. Esto significa que cuando se ejecuta el programa, Windows, por ejemplo, se hará cargo y aparecerá algo como "IDLE ha dejado de funcionar", o Linux hará lo que haga Linux cuando un programa se bloquee.

Reglas:

  1. Esto debe hacerse en Python 2.7 o superior (por lo que no se aprovechan los errores antiguos que se han corregido en futuras versiones de Python).

  2. La definición de "bloqueo" es "hacer que IDLE o Python salgan de manera involuntaria". Esto no significa "hacer que IDLE o Python se detengan y dar un rastreo". Esto también significa que exit, sys.quit, abort, etc. no son respuestas válidas. Por ejemplo, esto no será aceptado:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. No se acepta hacer que Python deje de responder.

  4. El código debe explicarse sobre lo que hace para bloquearse. Un enlace a un informe de error está bien.

¡La respuesta más votada después de 10 días gana! ¡¡Empezar!!

EDITAR: ¿ Puedo dejar en claro que el objetivo no es hacer que Python simplemente detenga la ejecución del programa con un rastreo? El objetivo es hacer que Python se bloquee por completo o deje de funcionar. Esto significa que si esta tarea se realiza con éxito, Windows le daría esto (no estoy bloqueando Word aquí, es solo un ejemplo de lo que debería suceder para un programa diferente):

diálogo de error

o esto:

diálogo de error 2

Jorge
fuente
1
El desafío de código de etiqueta requiere un criterio objetivo ganador. Creo que lo más creativo no es lo suficientemente objetivo ...
Howard
Ok, lo cambiaré a lo más corto posible, como la mayoría de los otros desafíos ... Creative es bastante ambiguo en realidad ...
George
@GeorgeH Si lo que estabas buscando era creatividad, el concurso de popularidad funciona perfectamente. Personalmente, creo que esto sería mejor como un concurso de popularidad. En el futuro, puede ejecutar su pregunta a través de la caja de arena donde se pueden resolver estos problemas antes de publicar.
Justin
2
@Personas con alto representante, mi prntpregunta es intencional.
George
66
Estoy votando para cerrar esta pregunta como fuera de tema porque esta pregunta pide código malicioso.
AdmBorkBork

Respuestas:

18

Debería haber sido un concurso de golf de código;) - Creo que la creatividad es la declaración que hace el código: "Simplemente no sé qué está pasando aquí ..."

Copie y pegue el siguiente carácter en IDLE que se ejecuta en Windows:

𐒢

El bloqueo tiene algo que ver con el carácter codificado como UTF-16 por Windows y la conversión fallida a un carácter UTF-8 por IDLE ...

Editar: error de python # 13153

David Herrmann
fuente
No estoy seguro de si esta es realmente una respuesta válida. La pregunta dice "cuando se ejecuta el programa". Pero aquí el programa nunca se ejecuta realmente. IDLE se bloquea cuando simplemente pega el 𐒢, antes de que incluso pueda ejecutarlo.
Sebastian Negraszus
Sí, tengo que estar de acuerdo con @Sebastian. En un programa de Python, comienza con un archivo de texto y ejecuta el intérprete de Python en él, pero no debería importar cómo crea el archivo de texto.
David Z
1
Um ... puu.sh/7eVar.png
Oberon
¡Funciona también en Mac!
TheDoctor
19

ctypes abuso:

import ctypes;ctypes.string_at(1)

Esto arroja 1 a una dirección y la desreferencia. En cualquier sistema cuerdo (es decir, uno en el que 0x00000001 no es una dirección asignada), esto fallará instantáneamente.

nneonneo
fuente
En mi máquina, esto no parece bloquear el intérprete. Se muestra un rastreo con un error de WindowsError.
Dhara
@Dhara: Ah, ese sería el manejador de excepciones estructurado de ctypes que cogería el accidente. Estoy seguro de que puede bloquear Python con ctypesWindows de alguna otra manera, pero tal vez no con tan pocos caracteres.
nneonneo
12

60 60

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

No es mi propia idea. Copiado de Python Wiki aquí .

Esto causa una recursión infinita y el intérprete no la detiene porque cambiamos el límite de recursión.

usuario12205
fuente
Gracias, esta es una gran respuesta, ¡pero por la pregunta equivocada! El objetivo no se ha aclarado en la pregunta. Gracias por tu respuesta sin embargo.
George
2
@ George H. Lo siento, no estoy usando una máquina Windows ahora, pero ¿no es una falla de segmentación que hace que el intérprete de Python descargue el núcleo lo suficiente? i.imgur.com/5gSGBpr.png
user12205
10

signal abuso (no solo para Windows):

import os;os.kill(0,4)

En la mayoría de los sistemas (en los que SIGILL = 4) esto matará a Python con un error de "instrucción ilegal".

O puedes matar el programa usando el despertador asesino :

import signal;signal.alarm(1)

Después de un segundo, Python muere con el críptico mensaje "Despertador".

nneonneo
fuente
Otros códigos de señal de un solo carácter que funcionan incluyen 1, 3, 5, 6, 8 y 9.
user12205
9

En Python 3.3:

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

En Python 2.7, los objetos de código son ligeramente diferentes:

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

Sí, puede pasar cualquier basura vieja al intérprete de código de bytes y lo ejecuta ( Python número 17187 ).


fuente
Más corto (Python 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo
¡Gracias! Y en Python 3 podemos usar .__code__.
6

Los iteradores recursivos usan la pila C, no la pila Python ( número 14010 y número 14507 ):

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

fuente
Esto no bloquea Python 2.7.11 en mi Mac, pero sí bloquea Python 3.5.1.
nneonneo
4

Una manera fácil de bloquear el intérprete es engañarlo para que desasigne Ninguno:

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

Como beneficio adicional, aquí hay una forma inteligente de segmentar 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

Lo que hace exactamente esto se deja como ejercicio para el lector.

Fraxtil
fuente
2
Primero: establezca el recuento de None en cero, lo que hace que se desasigne hilarantemente. Segundo: construya e imprima una tupla autorreferenciada.
nneonneo
3

Alguien pensó que podría evitar FlagsTypeque se crearan nuevos objetos mediante la configuración FlagsType.tp_new = NULL, pero olvidaron eliminar el método ( problema # 13204 ):

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

( sys.version_infotiene el mismo error)


fuente
3

Uso de allocaen el ctypesmódulo ( número 13096 ):

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

fuente
0

Una posible forma que bloquea mi Python con MemoryError:

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Visión
fuente
2
Esto no funciona para mí, solo hace que Python se detenga con a MemoryError. Necesita ser cerrado por el sistema operativo.
George
2
Huh El error ocurre a una profundidad sorprendentemente baja.
user2357112 es compatible con Monica