Falha (por exemplo, faça com que o intérprete pare de funcionar e force o fechamento) Python [fechado]


16

Gostaria de ver quem pode fazer o Python sofrer um acidente fatal com o código mais criativo. Isso significa que, quando o programa for executado, o Windows, por exemplo, assumirá o controle e aparecerá algo como “O IDLE parou de funcionar” ou o Linux fará o que o Linux fizer quando um programa travar.

Regras:

  1. Isso deve ser feito no Python 2.7 ou superior (para que não sejam explorados erros antigos que foram corrigidos em versões futuras do Python).

  2. A definição de "falha" é "fazer com que o IDLE ou o Python saia de maneira não intencional". Isso não significa "fazer com que o IDLE ou o Python parem e dê um traceback". Isso também significa que exit, sys.quit, abort etc não são respostas válidas. Por exemplo, isso não será aceito:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Fazer o Python parar de responder não é aceito.

  4. O código deve ser explicado sobre o que faz para falhar. Um link para um relatório de bug está correto.

A resposta mais votada após 10 dias vence! Início!!

EDIT: Posso deixar claro que o objetivo não é fazer com que o Python pare de executar o programa com um rastreamento. O objetivo é fazer o Python travar completamente ou parar de funcionar. Isso significa que, se essa tarefa for concluída com êxito, o Windows forneceria isso (não estou travando o Word aqui, é apenas um exemplo do que deve acontecer para um programa diferente):

diálogo de erro

ou isto:

diálogo de erro 2


11
O desafio do código da tag requer um critério de vitória objetivo. Eu acho mais criativo não é suficiente objetivo ...
Howard

Ok - Vou alterá-lo para o mais curto possível, como a maioria dos outros desafios. Na verdade, o criativo é bastante ambíguo ... #
George George

@GeorgeH Se criativo é o que você estava procurando, o concurso de popularidade funciona perfeitamente. Pessoalmente, acho que isso seria melhor como um concurso de popularidade. No futuro, você poderá executar sua pergunta na caixa de areia, onde essas torções podem ser resolvidas antes da postagem.
27714 Justin

2
@ Pessoas com alta representante, o meu prntna questão é intencional.
George

6
Estou votando para encerrar esta questão como off-topic, porque ela pede código malicioso.
AdmBorkBork

Respostas:


18

Deveria ter sido um concurso de código de golfe;) - Acho que a criatividade é a afirmação do código: "Eu simplesmente não sei o que está acontecendo aqui ..."

Copie e cole o seguinte caractere no IDLE em execução no Windows:

𐒢

A falha tem algo a ver com o caractere sendo codificado como UTF-16 pelo Windows e a conversão sem êxito em um caractere UTF-8 pelo IDLE ...

Edit: python bug # 13153


Não tenho certeza se essa é realmente uma resposta válida. A pergunta diz "quando o programa é executado". Mas aqui o programa nunca é realmente executado. O IDLE trava quando você simplesmente cola o 𐒢, antes mesmo de executá-lo.
Sebastian Negraszus

Sim, eu tenho que concordar com @Sebastian. Em um programa Python, você começa com um arquivo de texto e executa o interpretador Python nele, mas não importa como você cria o arquivo de texto.
David Z


Também funciona no Mac!
TheDoctor

19

ctypes Abuso:

import ctypes;ctypes.string_at(1)

Isso converte 1 em um endereço e o desreferencia. Em qualquer sistema sensato (por exemplo, aquele no qual 0x00000001 não é um endereço mapeado), isso ocorrerá um erro instantâneo.


Na minha máquina, isso não parece travar o intérprete. Um retorno com um erro WindowsError é exibido.
Dhara 28/02

@Dhara: Ah, isso seria o manipulador de exceção estruturado do ctypes que está travando. Estou certo de que você pode travar o Python ctypesno Windows de alguma outra maneira, mas talvez não em tão poucos caracteres.
Nneonneo

12

60

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

Não é minha ideia. Copiado do Python Wiki aqui .

Isso causa uma recursão infinita e não é interrompido pelo intérprete porque alteramos o limite de recursão.


Obrigado - esta é uma ótima resposta, mas pela pergunta errada! O objetivo não foi esclarecido na pergunta. Obrigado pela sua resposta embora.
George George

2
@ George H Desculpe, não estou usando uma máquina Windows agora, mas não é uma falha de segmentação que faz com que o intérprete python despeje o núcleo o suficiente? i.imgur.com/5gSGBpr.png
user12205

10

signal abuso (somente não Windows):

import os;os.kill(0,4)

Na maioria dos sistemas (nos quais SIGILL = 4), isso mata o Python com um erro de "instrução ilegal".

Ou você pode matar o programa usando o despertador matador :

import signal;signal.alarm(1)

Após um segundo, o Python morre com a mensagem enigmática "Despertador".


Outros códigos de sinal de um só caracter que incluem trabalho 1, 3, 5, 6, 8 e 9.
user12205

9

No Python 3.3:

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

No Python 2.7, os objetos de código são um pouco diferentes:

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

Sim, você pode passar qualquer lixo antigo para o interpretador de código de bytes e ele será executado ( problema no Python # 17187 ).


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

Obrigado! E no Python 3 podemos usar .__code__.


4

Uma maneira fácil de travar o intérprete é enganá-lo e desalocar Nenhum:

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

Como bônus, aqui está uma maneira inteligente de 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

O que exatamente isso faz é deixado como um exercício para o leitor.


2
Primeiro: defina refcount de None como zero, fazendo com que seja desalocado hilariamente. Segundo: construa e imprima uma tupla auto-referente.
nneonneo

3

Alguém pensou que poderia impedir a criação de novos FlagsTypeobjetos definindo FlagsType.tp_new = NULL, mas esqueceu de remover o método ( edição 13204 ):

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

( sys.version_infotem o mesmo bug.)


3

Uso de allocano ctypesmódulo ( edição # 13096 ):

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

0

Uma maneira possível que trava meu Python com MemoryError:

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

2
Isso não funciona para mim - apenas faz o Python parar com um MemoryError. Ele precisa ser fechado pelo sistema operacional.
George George

2
Hã. O erro ocorre em uma profundidade surpreendentemente rasa.
User2357112 suporta Monica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.