🐥
[Bug #20868] 意図せず Method#hash の値が変わってしまうというバグ報告
[Bug #20868] Method#hash changes after compaction
-
GC.verify_compaction_references
を呼び出すとMethod#hash
の値が変わってしまうというバグ報告-
GC.verify_compaction_references
は『コンパクションの参照の一貫性を検証する』メソッドらしい - 厳密にいうと
expand_heap: true, toward: :empty
が設定されている
-
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
Discussion