山本です。

できました。
色々削ってるうちに思っているより短くなりました。
socketが絡んでるだろうと思い込んでて余計に時間食ってしまいました。
以下再現スクリプトです。


#evalbug.rb

def runEval(arg)
  load "loadscript.rb"
  str = String.new

  eval("
    p 'in eval' if str.class != String
  ")
end

while true
  Thread.start do
    sleep(0.001)
    runEval("arg")
  end
end


loadしている"loadscript.rb"
は、ただ 1 とのみ書いた1バイトのスクリプトです。

ポイントは、多数同時進行で、threadのなかで、load > eval
だと思われます。

OSはredhat7.3,8.0で確認しました。


実行結果例

$ ruby evalbug.rb
"in eval"
"in eval"
(eval):2: [BUG] Segmentation fault(eval):2: [BUG] Segmentation fault
ruby 1.8.0 (2003-07-03) [i686-linux]

Aborted


山本 円 dan / xa2.so-net.ne.jp

----- Original Message ----- 
From: "yamamoto madoka" <dan / xa2.so-net.ne.jp>
To: "ruby developers list" <ruby-dev / ruby-lang.org>
Sent: Thursday, July 03, 2003 6:23 PM
Subject: [ruby-dev:20493] Re: [BUG] evalがらみでSIGSEGV


> 山本です。
>
> 条件がいまいちふめいで色々絡んでて難しそうですが、
> なんとか作ってみようと思います。
>
> ----- Original Message ----- 
> From: <nobu.nakada / nifty.ne.jp>
> To: "ruby developers list" <ruby-dev / ruby-lang.org>
> Sent: Thursday, July 03, 2003 6:13 PM
> Subject: [ruby-dev:20492] Re: [BUG] evalがらみでSIGSEGV
>
>
> > なかだです。
> >
> > At Tue, 1 Jul 2003 15:37:45 +0900,
> > yamamoto madoka wrote:
> > > ./foo.rb:26: [BUG] Segmentation fault
> > > ruby 1.8.0 (2003-06-30) [i686-linux]
> > >
> > > 該当部分のコードは以下のようなものです。
> > >
> > > if Array != val.class
> > >
> > > osはredhat8です。
> > >
> > > 発生するスクリプトまたもスレッド、ソケット、さらにevalを使ったもので
す。
> > > (一連のバグはすべて同じスクリプトで発見してます)
> >
> > すいません、これだけだとちょっと手がかりが少ないのですが、再現
> > できるスクリプトなどはないでしょうか。
> >
> > > 出るタイミングはまたしても、たまに出る、という感じです。
> > > 場所も、GC.startなどを挟むと変わります。
> >
> > おそらくGC絡みだと思いますが、SEGVしたときにはもう肝心の部分が
> > 壊れてしまってるので。
> >
> > > Program received signal SIGSEGV, Segmentation fault.
> > > 0x08056c27 in rb_eval (self=1075325136, n=0x6c6f6f74) at ruby.h:630
> > > 630         if (SYMBOL_P(obj)) return rb_cSymbol;
> >
> > 実際にはその次の
> >     return RBASIC(obj)->klass;
> > で、既に開放されているobjをアクセスしてるんでしょう。
> >
> > -- 
> > --- 僕の前にBugはない。
> > --- 僕の後ろにBugはできる。
> >     中田 伸悦
> >
>
>