From: Nobuhiro IMAI Date: 2010-01-21T01:52:28+09:00 Subject: [ruby-dev:40120] SEGV on zipruby with irb いまいです。 zipruby[1] という gem を使っているのですが、以下のようなスクリプトを irb で実行すると SEGV します。 1. http://zipruby.rubyforge.org/ の 0.3.2 です。 環境は、Debian パッケージの ruby1.8(1.8.7.249-1) と rubygems1.8(1.3.5-2)です。ruby1.8.8dev は自分でビルドしたものです。 $ cat z.rb require "rubygems" require "zipruby" p RUBY_DESCRIPTION zip = Zip::Archive.open("foo.zip", Zip::CREATE) zip.add("foo"){} GC.start zip.close $ irb -rubygems z.rb >> require "rubygems" => false >> require "zipruby" => true >> ?> p RUBY_DESCRIPTION "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]" => nil >> zip = Zip::Archive.open("foo.zip", Zip::CREATE) => # >> zip.add("foo"){} => nil >> GC.start => nil >> zip.close z.rb:8: [BUG] Segmentation fault ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux] Aborted (core dumped) 引数で rubygems を require しないと、エラーにはなるものの SEGV にはな りません。 $ irb z.rb >> require "rubygems" => true >> require "zipruby" => true >> ?> p RUBY_DESCRIPTION "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]" => nil >> zip = Zip::Archive.open("foo.zip", Zip::CREATE) => # >> zip.add("foo"){} => nil >> GC.start => nil >> zip.close z.rb:8: warning: Error in Proc: undefined method `call' for "_ = IRB.CurrentContext.last_value":String (NoMethodError) Zip::Error: Close archive failed: Internal error from z.rb:8:in `close' from z.rb:8 from (null):0 ruby で直接実行すると、引数で rubygems を require するしないに関わらず、 エラーは起こらず正常に終了します。 $ ruby -rubygems z.rb "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]" $ ruby z.rb "ruby 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]" ruby 1.8.8dev (2010-01-19 revision 26358) [i686-linux] だと、irb では最 後のエラーメッセージが以下のように変わりますが、どちらの方法で rubygems を require しても、SEGV にはなりません。 >> zip.close z.rb:8: warning: Error in Proc: undefined method `call' for "/home/nov/ruby1.8/lib/ruby/1.8/irb/workspace.rb":String (NoMethodError) Zip::Error: Close archive failed: Internal error from z.rb:8:in `close' from z.rb:8 from /home/nov/ruby1.8/lib/ruby/1.8/date.rb:814 ruby で直接実行すると問題ないのは 1.8.7 と同じです。どの組み合わせでも、 GC.start の行を消すと、正常に終了します。 * SEGV になるのは zipruby の問題でしょうか? * irb の引数で require するのと、irb が起動してから require するのは、 何か違いがあるのでしょうか? * irb ではエラーや SEGV になって、ruby ではうまく行くのは、irb の問題 でしょうか? という辺りが知りたいです。 -- Nobuhiro IMAI Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106