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

今週はネストしたループで caller_locations を呼び出すと segv するバグ報告などがありました。

[Feature #18057] Introduce Array#mean

  • 配列の平均値を求める Array#mean メソッドを追加する提案
    • 元々は Array#average という名前だったが #mean という名前に変わった
array = [1, 2, 3]
array.mean # 2

# 要素の値を変更しながら適用
array = [1.5, 2.2, 3.1]
array.mean(&:round) # 2.3333333333333335

array = [-3, -2, -1]
array.mean { |e| e.abs } # 2

[Bug #18053] Crashes and infinite loops when generating partial backtraces in Ruby 3.0+

  • 以下のコードを実行すると segv するというバグ報告
    • Ruby 3.0 以降で再現する
def foo
  caller_locations(2, 1).inspect # this will segv
  # caller_locations(2, 1)[0].path # this will infinite loop
end

1.times.map { 1.times.map { foo } }
  • Ruby 3.0 の最適化のバグっぽい?
  • 修正 PR は既に出てる
  • Ruby 3.0 に関しては最適化を元に戻すのが最善らしい
    • 実装が複雑になっているので今回のバグを対応する場合は更に実装が複雑になるとのこと
    • ただし、最適化を維持したい人がいれば別途対応するとのこと
    • https://bugs.ruby-lang.org/issues/18053#note-1

[Bug #18052] Find のignore_error オプションが、文字化けファイル遭遇時の例外に対応していない (Windows)

  • Find.find(".", ignore_error: true) のように ignore_error: true を指定しても文字化けしたファイルがあると例外が発生するらしい
# coding:cp932
p __ENCODING__

# cp932 では表現できないファイル名を作る(例はハングル文字)。  
open("testfile-\uD7A3 .jpg", "w")

require "find"
Find.find(".", ignore_error: true ) {|f|
    p f
}
# => #<Encoding:Windows-31J>
#    "."
#    "./testfile-???R?s?[.jpg"
#    Traceback (most recent call last):
#            25: from d:/opt/ruby/bin/irb:23:in `<main>'
#            24: from d:/opt/ruby/bin/irb:23:in `load'
#            23: from d:/opt/ruby/lib/ruby/gems/2.6.0/gems/irb-1.3.2/exe/irb:11:in `<top (required)>'
#            6: from (irb):10:in `<main>'
#            5: from d:/opt/ruby/lib/ruby/2.6.0/find.rb:43:in `find'
#            4: from d:/opt/ruby/lib/ruby/2.6.0/find.rb:43:in `each'
#            3: from d:/opt/ruby/lib/ruby/2.6.0/find.rb:48:in `block in find'
#            2: from d:/opt/ruby/lib/ruby/2.6.0/find.rb:48:in `catch'
#            1: from d:/opt/ruby/lib/ruby/2.6.0/find.rb:51:in `block (2 levels) in find'
#    d:/opt/ruby/lib/ruby/2.6.0/find.rb:51:in `lstat': Invalid argument @ rb_file_s_lstat - ./testfile-?[.jpg (Errno::EINVAL)