[#47804] [ruby-trunk - Bug #9109][Open] extend したモジュールメソッドと RSpec の let で 2 つ同名を使ったときに segmentation fault になる — "sunaot (sunao tanabe)" <sunao.tanabe@...>

8 messages 2013/11/14

[ruby-dev:47803] [ruby-trunk - Bug #9105][Open] callcc による不整合(例:Hash)

From: "tarui (Masaya Tarui)" <tarui@...>
Date: 2013-11-13 01:50:11 UTC
List: ruby-dev #47803
Issue #9105 has been reported by tarui (Masaya Tarui).

----------------------------------------
Bug #9105: callcc による不整合(例:Hash)
https://bugs.ruby-lang.org/issues/9105

Author: tarui (Masaya Tarui)
Status: Open
Priority: Normal
Assignee: 
Category: core
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-11-11 trunk 43647) [x86_64-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
以下のコードを実行すると、
 equire 'continuation'
 h = {1=>2,3=>4}
 c = nil
 f = false
 h.each { callcc {|c2| c = c2 } }
 unless f
     f = true
     c.call
 end
 h.each {|i| h.delete(1); p i}

以下のような結果になります。

 [1, 2]
 [false, false]
 test.rb:10:in `each': hash modified during iteration (RuntimeError)
         from test.rb:10:in `<main>'

[false, false]自体はst_foreach_checkで全く機能していない
 /* call func with error notice */
 retval = (*func)(0, 0, arg, 1);
を消せばいいのですが、
RuntimeErrorが発生するのはcallccによりhash_foreach_ensureの実行が2重に行われて、
RHASH_ITER_LEV(hash)の管理が破綻してしまっている為です。

他の所でも容易に起こりうると思うのですが、未調査です。
&そもそもどう対処すべきでしょう?

=end


-- 
http://bugs.ruby-lang.org/

In This Thread

Prev Next