🐥

[Bug #20868] 意図せず Method#hash の値が変わってしまうというバグ報告

2024/10/26に公開

[Bug #20868] Method#hash changes after compaction

  • GC.verify_compaction_references を呼び出すと Method#hash の値が変わってしまうというバグ報告
def a; end

def get_hash
  method(:a).hash
end

# ここは同じ hash 値が返ってくる
pp get_hash   # => 161273473511457888
pp get_hash   # => 161273473511457888

GC.verify_compaction_references(expand_heap: true, toward: :empty)

# GC.verify_compaction_references を呼び出したあとに hash 値が変わってしまう
pp get_hash   # => 1383780992949518684
  • hash 値が変わってしまうとハッシュテーブルで保持しているときに意図しない挙動になる可能性がある、とのこと
  • この問題は開発版の Ruby 3.4-dev で修正済みです
def a; end

def get_hash
  method(:a).hash
end

pp get_hash   # => 161273473511457888

GC.verify_compaction_references(expand_heap: true, toward: :empty)

# Ruby 3.4 だと値は変わらない
pp get_hash   # => 1383780992949518684
GitHubで編集を提案

Discussion