Crash (c'est-à-dire que l'interpréteur cesse de fonctionner et force la fermeture) Python [fermé]


16

Je voudrais voir qui peut faire en sorte que Python tombe en panne fatale avec le code le plus créatif. Cela signifie que lorsque le programme s'exécute, Windows par exemple, prendra le relais et affichera quelque chose comme «IDLE a cessé de fonctionner», ou Linux fera tout ce que Linux fait lorsqu'un programme se bloque.

Règles:

  1. Cela doit être fait en Python 2.7 ou supérieur (donc les anciens bogues ne sont pas exploités qui ont été corrigés dans les futures versions de Python).

  2. La définition de "plantage" est "faire sortir IDLE ou Python d'une manière non intentionnelle". Cela ne signifie pas "arrêtez IDLE ou Python et donnez une trace". Cela signifie également que exit, sys.quit, abort, etc. ne sont pas des réponses valides. Par exemple, cela ne sera pas accepté:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Faire arrêter Python de répondre n'est pas accepté.

  4. Le code doit être expliqué sur ce qu'il fait pour planter. Un lien vers un rapport de bogue est très bien.

La réponse la plus votée après 10 jours gagne! Commencer!!

EDIT: Puis-je préciser que l'objectif n'est pas de faire en sorte que Python arrête juste d'exécuter le programme avec une traceback. L'objectif est de faire complètement planter Python ou de cesser de fonctionner. Cela signifie que si cette tâche est accomplie avec succès, Windows donnerait ceci (je ne plante pas Word ici, c'est juste un exemple de ce qui devrait arriver pour un autre programme):

dialogue d'erreur

ou ca:

dialogue d'erreur 2


1
Le défi de code de balise nécessite un critère de gain objectif. Je pense que le plus créatif n'est pas assez objectif ...
Howard

Ok - Je vais le changer aussi court que possible, comme la plupart des autres défis .. La création est assez ambiguë en fait ...
George

@GeorgeH Si la créativité est ce que vous cherchiez, le concours de popularité fonctionne parfaitement. Je pense personnellement que ce serait mieux comme un concours de popularité. À l'avenir, vous pouvez poser votre question dans le bac à sable où ces anomalies peuvent être résolues avant d'être publiées.
Justin

2
@Personnes ayant un haut représentant, ma prntquestion est intentionnelle.
George

6
Je vote pour fermer cette question comme hors sujet car cette question demande du code malveillant.
AdmBorkBork

Réponses:


18

Cela aurait dû être un concours de golf de code;) - Je suppose que la créativité est la déclaration du code: "Je ne sais tout simplement pas ce qui se passe ici ..."

Copiez et collez le caractère suivant dans IDLE exécuté sur Windows:

𐒢

Le crash a quelque chose à voir avec le caractère encodé en UTF-16 par Windows et la conversion infructueuse en caractère UTF-8 par IDLE ...

Edit: bug python # 13153


Je ne sais pas si c'est vraiment une réponse valable. La question indique "lorsque le programme s'exécute". Mais ici, le programme n'est jamais vraiment exécuté. IDLE se bloque lorsque vous collez simplement le 𐒢, avant même de pouvoir l'exécuter.
Sebastian Negraszus

Ouais, je dois être d'accord avec @Sebastian. Dans un programme Python, vous commencez avec un fichier texte et exécutez l'interpréteur Python dessus, mais peu importe comment vous créez le fichier texte.
David Z


Cela fonctionne aussi sur Mac!
TheDoctor

19

ctypes abuser de:

import ctypes;ctypes.string_at(1)

Cela convertit 1 en une adresse et la déréférence. Sur n'importe quel système sain (c.-à-d. Celui sur lequel 0x00000001 n'est pas une adresse mappée), cela se produira instantanément.


Sur ma machine, cela ne semble pas faire planter l'interpréteur. Une traceback avec une erreur WindowsError s'affiche.
Dhara

@Dhara: Ah, ce serait le gestionnaire d'exceptions structuré de ctypes qui attraperait le crash. Je suis certain que vous pouvez planter Python avec ctypesWindows d'une autre manière, mais peut-être pas avec si peu de caractères.
nneonneo

12

60

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

Pas ma propre idée. Copié du Wiki Python ici .

Cela provoque une récursion infinie et n'est pas arrêté par l'interpréteur car nous avons modifié la limite de récursivité.


Merci - c'est une excellente réponse, mais pour la mauvaise question! L'objectif n'a pas été clarifié dans la question. Merci pour votre réponse.
George

2
@George H Désolé, je n'utilise pas de machine Windows maintenant, mais n'est-ce pas une erreur de segmentation qui fait que l'interpréteur python vide suffisamment le core? i.imgur.com/5gSGBpr.png
user12205

10

signal abus (non-Windows uniquement):

import os;os.kill(0,4)

Sur la plupart des systèmes (sur lesquels SIGILL = 4), cela tuera Python avec une erreur "instruction illégale".

Ou vous pouvez tuer le programme en utilisant le réveil tueur :

import signal;signal.alarm(1)

Après une seconde, Python meurt avec le message cryptique "Réveil".


Les autres codes de signal à un seul caractère qui fonctionnent incluent 1, 3, 5, 6, 8 et 9.
user12205

9

En Python 3.3:

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

En Python 2.7, les objets de code sont légèrement différents:

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

Oui, vous pouvez transmettre n'importe quel vieux déchet à l'interpréteur de code d'octet et il l'exécute ( problème Python # 17187 ).


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

Merci! Et en Python 3, nous pouvons utiliser .__code__.

6

Les itérateurs récursifs utilisent la pile C, pas la pile Python ( problème # 14010 et problème # 14507 ):

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

Cela ne plante pas Python 2.7.11 sur mon Mac, mais cela plante Python 3.5.1.
nneonneo

4

Un moyen simple de planter l'interpréteur est de le tromper en désallouant Aucun:

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

En bonus, voici un moyen intelligent 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

Ce que cela fait exactement est laissé au lecteur.


2
Première: définissez refcount of None sur zéro, ce qui entraîne sa désallocation hilarante. Deuxième: construire et imprimer un tuple auto-référencé.
nneonneo

3

Quelqu'un a pensé qu'il pourrait empêcher la création de nouveaux FlagsTypeobjets en définissant FlagsType.tp_new = NULL, mais il a oublié de supprimer la méthode ( problème # 13204 ):

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

( sys.version_infoa le même bug.)


3

Utilisation du module allocain ctypes( problème # 13096 ):

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

0

Une façon possible de bloquer mon Python avec MemoryError:

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

2
Cela ne fonctionne pas pour moi - cela arrête simplement Python avec a MemoryError. Il doit être fermé par le système d'exploitation.
George

2
Huh. L'erreur se produit à une profondeur étonnamment faible.
user2357112 prend en charge Monica
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.