From: Akinori MUSHA Date: 2002-11-03T08:14:42+09:00 Subject: [ruby-dev:18617] Re: racc segv revisited At Wed, 2 Oct 2002 23:19:59 +0900, I wrote: > #1 0x120079bf8 in ruby_re_match (bufp=0x11fdc1a8, > string_arg=0x1 , size=301841768, pos=537876416, > regs=0x0) at ../regex.c:3564 > #2 0x120079898 in ruby_re_search (bufp=0x1204a8100, > string=0x120380000 '-' ..., size=10240, startpos=0, range=10240, > regs=0x1202032f0) at ../regex.c:3260 > #3 0x12006b984 in rb_reg_search (re=4833958560, str=4833948400, pos=0, reverse=0) at ../re.c:603 > #4 0x120087ba8 in rb_str_index_m (argc=537876416, argv=0x1, str=4833948400) at ../string.c:684 > #5 0x1200184d4 in call_cfunc (func=0x1200879a0 , recv=4833948400, len=0, > argc=10240, argv=0x4f94f5ea6c1e9b28) at ../eval.c:4274  その後 SMP な FreeBSD/alpha マシンでかなり時間を割いて調べている のですが、 rdinlineparser.ry を racc に通すと、 rb_reg_search() が 4862 回呼ばれた後、また rb_eval() に戻るのですが、そこからは毎回 違うタイミングなのですが、 rb_reg_search() 内の static struct re_registers regs のメンバ allocated が破壊されてしまいます。  num_regs 以下他のメンバは無事なのですが、 allocated がとんでも ない負の値になり、結果、件の場所で segfault します。  watch をセットして何時間も走らせてみたりしましたが、どこかで ループしてしまうのか、一向に返ってきません。一方でソースを見ても allocated が負の値になることはないようなので静的領域が意図せず 破壊されているのだと思いますが、因果関係が見えないので難儀して います。  一応、 allocated の値を == 0 でチェックしているところを <= 0 と すれば、落ちることはなくなります。結果も(たまたま)正しいようです。 メモリリークになりますし、他も破壊しているかもしれない真のバグを 隠すことにしかならないのですが。  1.6.8 リリースまでになんとかしたいところですが、どうも煮詰まって しまったので、幾分かでもヒントを出し合う形になればと思い、中間報告 しておきます。 # ところでそろそろ preview 出しませんか? -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "When I leave I don't know what I'm hoping to find When I leave I don't know what I'm leaving behind.."