2021/08/19 今週の気になった bugs.ruby のチケット

今週は右代入で特定のケースでシンタックスエラーになるというバグ報告がありました。

[Bug #18084] JSON.dump can crash VM.

  • 次のように再帰的な HashJSON.dump に渡すと VM がクラッシュするバグ報告
    • どうやら Linux 系でのみ発生しているぽい?
require 'json'

x = {}
# 自身に自身を割り当てる
x[:x] = x

# machine stack overflow in critical region (fatal)
p JSON.dump(x)
  • これは Ruby 2.7 から再現しており、Ruby 2.7 以前は SystemStackError が発生する
require 'json'

x = {}
x[:x] = x

# Ruby 2.6 の場合
# error: stack level too deep (SystemStackError)
p JSON.dump(x)
  • これが期待する動作なのかどうか、という旨がチケットに書かれていたが最新版では SystemStackError になるように修正された

[Bug #18080] Syntax error on one-line pattern matching

  • 次のようにカッコで囲まれていないパラメータを持つメソッドの戻り値を右代入で使用するとシンタックスエラーになる、というバグ報告
# パラメータがなかったり、カッコが付いている場合は OK
p do
end => a
p a #=> nil

p(1) do
end => a
p a #=> 1

# カッコがないパラメータがある場合はシンタックスエラーになる
p 1 do
end => a
#=>
# syntax error, unexpected =>, expecting end-of-input
# end => a
#    ^~

# これは1行 in でも同様にシンタックスエラーになる
p 1 do
end in a
#=>
# syntax error, unexpected `in', expecting end-of-input
# end in a
#     ^~
  • このエラーは意図的ではないが修正するのは難しいらしい