[ruby-dev:48111] [ruby-trunk - Bug #9729] [Closed] Hash#each が無限ループする
From:
tarui@...
Date:
2014-04-20 03:58:30 UTC
List:
ruby-dev #48111
Issue #9729 has been updated by Masaya Tarui.
Status changed from Assigned to Closed
Applied in changeset r45642.
----------
* st.c (st_foreach_check): chnage start point of search at check
from top to current. [ruby-dev:48047] [Bug #9646]
----------------------------------------
Bug #9729: Hash#each が無限ループする
https://bugs.ruby-lang.org/issues/9729#change-46266
* Author: 三村 益隆
* Status: Closed
* Priority: Normal
* Assignee: Masaya Tarui
* Category: core
* Target version: current: 2.2.0
* ruby -v: ruby 2.2.0dev (2014-04-11 trunk 45566) [x86_64-darwin13]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
Hash のキーに配列を使い、
キーが同じ値になるように以下のような操作をすると
Hash#each が無限ループします。
~~~
h = {}
h[[]] = 1 # h #=> {[] => 1}
h.keys[0] << 1 # h #=> {[1] => 1}
h[[]] = 1 # h #=> {[1] => 1, [] => 1}
h.keys[1] << 1 # h #=> {[1] => 1, [1] => 1}
h.each { 1 } # 無限ループ
~~~
このコードは、Ruby 1.9.3-p545 だと、無限ループにならないことを確認しています。
また、以下のような手順で {[1] => 1, [1] => 1} を作った場合は、無限ループになりませんでした。
~~~
h = {}
h[[]] = 1 # h #=> {[] => 1}
h[[1]] = 1 # h #=> {[] => 1}
h.keys[0] << 1 # h #=> {[1] => 1, [1] => 1}
h.each { 1 } # 無限ループにならない
~~~
--
https://bugs.ruby-lang.org/