クラッシュ(つまり、インタプリタが動作を停止して強制的に閉じる)Python [閉じた]


16

誰がPythonを最もクリエイティブなコードで致命的なクラッシュに陥らせることができるかを知りたいです。これは、たとえばWindowsがプログラムを実行すると、「IDLEが動作を停止しました」などのメッセージが表示され、Linuxがプログラムのクラッシュ時にLinuxが実行することを意味します。

ルール:

  1. これはPython 2.7以降で行う必要があります(したがって、Pythonの将来のバージョンで修正された古いバグは悪用されません)。

  2. 「クラッシュ」の定義は、「意図しない方法でIDLEまたはPythonを終了させる」です。これは、「IDLEまたはPythonを停止してトレースバックを与える」という意味ではありません。これは、exit、sys.quit、abortなどが有効な回答ではないことも意味します。たとえば、これは受け入れられません。

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. Pythonが応答しなくなることは受け入れられません。

  4. コードは、クラッシュするために何をするかについて説明する必要があります。バグレポートへのリンクは問題ありません。

10日後に最も支持された答えが勝ちます!ベギン!!

編集: 目的は、Pythonがトレースバックを使用してプログラムの実行を停止するだけでないことを明確にすることができます。目的は、Pythonを完全にクラッシュさせるか、動作を停止させることです。これは、このタスクが正常に完了した場合、Windowsがこれを提供することを意味します(ここでWordをクラッシュさせることはありません。これは、別のプログラムで何が起こるかの一例に過ぎません)。

エラーダイアログ

またはこれ:

エラーダイアログ2


1
タグのコードチャレンジには、客観的な勝利基準が必要です。ほとんどの創造性は十分に客観的ではないと思います...
ハワード14


@GeorgeHクリエイティブがあなたが探していたものなら、人気コンテストは完璧に機能します。個人的には、これが人気コンテストとして最適だと思います。将来、質問をサンドボックスで実行して、投稿する前にこれらのねじれを解決できます。
ジャスティン14

2
@担当者の多い人、私prntの質問は意図的です。
ジョージ

6
この質問は悪意のあるコードを要求するため、私はこの質問をトピック外として終了することに投票しています。
AdmBorkBork

回答:


18

コードゴルフコンテストでなければなりませんでした;)-創造性は、コードが行う声明であると思います。「ここで何が起きているのかわかりません...」

Windowsで実行されているIDLEに次の文字をコピーして貼り付けます。

𐒢

クラッシュは、WindowsによってUTF-16としてエンコードされている文字と、IDLEによるUTF-8文字への変換の失敗に関係しています...

編集:python bug#13153


これが本当に有効な答えであるかどうかはわかりません。質問は「プログラムが実行されるとき」と言います。しかし、ここではプログラムは実際には実行されません。IDLEは𐒢、単に実行する前にを貼り付けるだけでクラッシュします。
セバスチャンネグラスズ14

ええ、@ Sebastianに同意する必要があります。Pythonプログラムでは、テキストファイルから開始し、そのファイルに対してPythonインタープリターを実行しますが、テキストファイルの作成方法は重要ではありません。
デビッドZ 14年

1
うーん... puu.sh/7eVar.png
Oberon

Macでも動作します!
TheDoctor 14年

19

ctypes 乱用:

import ctypes;ctypes.string_at(1)

これにより、1がアドレスにキャストされ、逆参照されます。正常なシステム(つまり、0x00000001がマップされたアドレスではないシステム)では、これは即座にセグメンテーション違反になります。


私のマシンでは、これはインタープリターをクラッシュさせないようです。WindowsErrorエラーを伴うトレースバックが表示されます。
ダラ

@Dhara:ああ、それはクラッシュをキャッチするctypesの構造化例外ハンドラーでしょう。ctypes他の方法でWindowsでPythonをクラッシュさせることはできますが、おそらく少数の文字でクラッシュすることはできません。
nneonneo

12

60

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

私自身の考えではありません。こちらのPython Wikiからコピーしました。

これにより無限再帰が発生し、再帰制限を変更したためインタープリターによって停止されません。


ありがとう-これは素晴らしい答えですが、間違った質問に対してです!質問の目的は明確にされていません。あなたの答えをありがとう。
ジョージ14

2
@George H申し訳ありませんが、現在Windowsマシンを使用していませんが、Pythonインタープリターがコアを十分にダンプするセグメンテーションフォールトではありませんか?i.imgur.com/5gSGBpr.png
user12205

10

signal 悪用(非Windowsのみ):

import os;os.kill(0,4)

ほとんどのシステム(SIGILL = 4)では、これは「不正な命令」エラーでPythonを殺します。

または、キラー目覚まし時計を使用してプログラムを殺すことができます:

import signal;signal.alarm(1)

1秒後、Pythonは「アラームクロック」という不可解なメッセージで死にます。


動作する他の単一文字信号コードには、
1、3、5、6、8

9

Python 3.3の場合:

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

Python 2.7では、コードオブジェクトはわずかに異なります。

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

はい、古いゴミをバイトコードインタープリターに渡して実行できます(Python issue#17187)。


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

ありがとう!そして、Python 3では次を使用できます.__code__

6

再帰反復子は、PythonスタックではなくCスタックを使用します(問題#14010および問題#14507):

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

これは私のMacではPython 2.7.11をクラッシュさせませんが、Python 3.5.1をクラッシュさせます。
nneonneo

4

インタプリタをクラッシュさせる簡単な方法の1つは、それをだましてNoneの割り当てを解除することです。

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

おまけとして、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

正確にこれが行うことは、読者への演習として残されます。


2
最初の方法:なしのrefcountをゼロに設定し、陽気に割り当てを解除します。2番目:自己参照タプルを作成して出力します。
nneonneo

3

誰かがFlagsType設定によって新しいオブジェクトの作成を防ぐことができると思っていましたがFlagsType.tp_new = NULL、メソッドを削除するのを忘れていました(問題#13204):

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

sys.version_info同じバグがあります。)


3

使用allocactypesのモジュール(問題#13096):

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

0

私のPythonをクラッシュさせる可能性のある方法MemoryError

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

2
これは私にはうまくいきません-PythonをMemoryError。OSによって閉じる必要があります。
ジョージ14

2
ええ エラーは驚くほど浅い深さで発生します。
user2357112はMonica
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.