LoginSignup
28
9

More than 5 years have passed since last update.

python にとても長い式を食べさせると死ぬ

Last updated at Posted at 2018-02-24

整数を419378回インクリメントするとMacのg++が死ぬ

C++でアスタリスクをつけすぎると端末が落ちる
にインスパイアされて。

python で

(((((1)))))
[[[[[1]]]]]
1+1-1+1-1+1-1+1-1+1-1
aaaaaaaaaaaaaaaa=1

のような式を食べさせて、どれぐらいで死ぬのか調べてみた。

環境は macOS High Sierra。メモリ 16GB。
python は、Python 3.6.3。
測定には ruby 2.5.0 を使った。

ruby 自体については調査済み。ruby にとても長い式を食べさせると死ぬ を参照のこと。

(((((1)))))

ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="print"+"("*n+"1"+")"*n
  puts "#{n}"
  "1" != %x( python3.6 -c "#{s}" ).strip
end)
#=>93

100に届かないとは。意外と弱い。
出るエラーは

s_push: parser stack overflow
MemoryError

s_push の辺りに苦しみが表現されているのかも。

[[[[[1]]]]]

ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="print("+"["*n+"1"+"]"*n+")"
  puts "#{n}"
  begin
    %x( python3.6 -c "#{s}" ).empty?
  rescue
    true
  end
end)
#=>92

先ほどのとは括弧の数え方が違うので、状況としては同じ。括弧の種類とは関係なく、100個弱で死ぬ模様。
出るエラーも同じ。

1+1-1+1-1+1-1+1-1+1-1

ruby2.5
a = [*1..20000]
p(a.bsearch do  |n|
  s="print(1+"+"-1+1"*n+")"
  puts "#{n}"
  begin
    %x( python3.6 -c "#{s}" ).empty?
  rescue
    true
  end
end)
#=>1499

括弧と比べてだいぶ頑張ったが、ruby と比べるとだいぶ少ない。
出るエラーは

RecursionError: maximum recursion depth exceeded during compilation

コンパイルに失敗しているらしい。

長い変数名

ruby2.5
a = [*1..100000000]
p(a.bsearch do  |n|
  File.open( "hoge.py", "w" ){ |f| f.puts( "a"*n+"=1" ) }
  puts "#{n}"
  begin
    %x( python3.6 hoge.py )
    false
  rescue
    true
  end
end)
#=> nil

1億文字まで試したけど、大丈夫だった。
所詮文字列いくらでも来い、という感じなんだろう。

まとめ

括弧100個で死ぬというのは、機械が生成したコードだとわりと引っかかるんじゃないかと思ったけど、どうなんだろう。
まあ人間が書いたコードだと問題ないだろうけど。

28
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
9