整数を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)))))
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]]]]]
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
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
コンパイルに失敗しているらしい。
長い変数名
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個で死ぬというのは、機械が生成したコードだとわりと引っかかるんじゃないかと思ったけど、どうなんだろう。
まあ人間が書いたコードだと問題ないだろうけど。