2017-03-02 12 views
4

私たちはアプリでスクリプト言語として埋め込みcpythonを使用しています。起動時にsys.pathを変更して、アプリケーションの外部からコードを実行しないようにしていますが、PYTHONPATHのsitecustomize.pyを持つユーザーがsys.pathを修正する前にコードを実行させていますそのコードには厳しいクラッシュがあると考えています(例外ではなく、正常に捕捉されて処理されます)。どうすればPython 3.5をクラッシュさせることができますか?

私はpythonを初期化する前に環境からPYTHONPATH変数をクリアするのが正しいと考えていますが、問題を再現できないため正しくテストできません。

私が見つけた最も簡単な方法は、次のような、メモリへの書き込みをctypesのを使用している:

import ctypes 
p = (ctypes.c_char).from_address(0) 
while True: 
    p[0] = 0 
    p = p + 1 

しかし、Pythonの3.5で、それは私にエラーを与えて、種類をc_charへの書き込みを許可していません"TypeError: 'c_char'オブジェクトは項目割り当て"をサポートしていません。

https://wiki.python.org/moin/CrashingPythonで利用できるいくつかの方法を試してみましたが、

純粋なPythonコードからPython 3.5をクラッシュする信頼できる方法はありますか?

+0

'とそれをインデックス化する。 – user2357112

+0

http://svn.python.org/view/python/trunk/Lib/test/crashers/ですべてのサンプルを試しましたか?私は3.5へのアクセス権がありませんが、repl.itで実行するとクラッシュするようなものもあります。[nasty_eq_vs_dict.py](http://svn.python.org/view/python/trunk/Lib/test /crashers/nasty_eq_vs_dict.py?view=log)、[mutation_inside_cyclegc.py](http:// svn。python.org/view/*checkout*/python/trunk/Lib/test/crashers/mutation_inside_cyclegc.py?content-type=text%2Fplain)、[gc_inspection.py](http://svn.python.org/view /tcheckout*/python/trunk/Lib/test/crashers/gc_inspection.py?content-type=text%2Fplain) – davedwards

+0

ありがとう、@ user2357112、以前はctypesを使用せず、コードをコピーして貼り付けていましたが、明らかに私はそれをより詳しく見ているので、私には明らかに完璧な意味があります。 – alvion

答えて

2

多くの方法があります。​​例えば、あなたのコードの修正版:

p = ctypes.pointer(ctypes.c_char.from_address(5)) 
p[0] = b'x' 

あなたはctypesのを使用しない場合、あなたはdict.__repr__実装でCスタックオーバーフローを引き起こす可能性:これは

x = {} 
for i in range(1000000): 
    x = {1: x} 
repr(x) 

パッチを適用してしまうかもしれません将来のPythonリリースでは、今のところ、ハードクラッシュが発生するはずです。

独自のバイトコードオブジェクトを作成することによってもそれを行う方法があります。これは、Pythonが実行しているバイトコードが意味をなさないことを確認することはほとんどありません。

+0

ああ、そうです。私は明らかな間違いをした。これは最も分かりやすいコードでもっとも簡単な答えですので、私はこれを受け入れています。ありがとうございました。 – alvion

0

私は通常、Python 2.7のみを使用しますが、あなたの質問が正しく理解されている限り、ここでも同じことが当てはまります。強制的にPythonプログラムを終了したいのであれば、私が知る最も簡単な方法はSystemExitを呼び出すことです。これはかなり簡単な例です:

for i in range (0, 10): 
    if (i == 6): #Stop the program at 6 just.. because 
     raise SystemExit 
    print(i) 

私はこれが参考になることを願っています!

ハッピーコーディング!

+0

これは、Pythonがクラッシュすることはありません。単純に 'sys.exit()'を呼び出す以外の方法はありません。 – ekhumoro

1

が見つかり、このワンライナー:

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

このcode-golf質問から引っかかるた:あなたは `c_charに*ポインタ*を作成することになった

+0

これは私にはうまく見えますが、私はそれをテストしませんでした。 user2357112の答えは私のために働きました。コードは分かりやすくなっています。あなたの答えをありがとう。 – alvion

関連する問題