📑
[Bug #22064] 特定のケースで Set の同一性が壊れるバグ報告
[Bug #22064] GC compaction breaks compare-by-identity sets
-
Set#compare_by_identityしたオブジェクトでGC.verify_compaction_references(expand_heap: true, toward: :empty)を実行するとSetのオブジェクトの同一性が壊れるというバグ報告-
GC.verify_compaction_referencesはコンパクションの参照の一貫性を検証する - GC.verify_compaction_references (Ruby 4.0 リファレンスマニュアル)
-
set = Set.new.compare_by_identity
o = Object.new
set.add(o)
puts set.include?(o)
# => true
# これの実行後だと set の同一性が壊れる
GC.verify_compaction_references(expand_heap: true, toward: :empty)
puts set.include?(o)
# 期待する挙動 => true
# 実際の挙動 => false
-
Set#compare_by_identityではhash値にアドレスを使用するのでGC.verify_compaction_referencesでアドレスが変わってしまうと壊れる、みたいな感じみたい? - この不具合は開発版の Ruby 4.1-dev で修正済み
set = Set.new.compare_by_identity
o = Object.new
set.add(o)
puts set.include?(o)
# => true
# これの実行後だと set の同一性が壊れる
GC.verify_compaction_references(expand_heap: true, toward: :empty)
puts set.include?(o)
# Ruby 4.0 => false
# Ruby 4.1 => true
Discussion