[#18440] racc segv revisited — "Akinori MUSHA" <knu@...>

 次のバグの件なんですが、現時点では原因究明を含めて未解決という

24 messages 2002/10/02
[#18617] Re: racc segv revisited — "Akinori MUSHA" <knu@...> 2002/11/02

At Wed, 2 Oct 2002 23:19:59 +0900,

[ruby-dev:18517] Re: Segmentaion fault of miniruby

From: "U.Nakamura" <usa@...>
Date: 2002-10-15 06:35:19 UTC
List: ruby-dev #18517
こんにちは、なかむら(う)です。

In message "[ruby-dev:18515] Re: Segmentaion fault of miniruby"
    on Oct.13,2002 20:05:58, <konishih@fd6.so-net.ne.jp> wrote:
| >残念ながらcoreが生成されないので、何が悪いのかはっきりしたこ
| >とはわかりませんが、適当にあたりをつけて調べてみたところ、
| >gc.cが1.106までなら問題なし、1.107以降だと落ちるということは
| >わかりました。
| >なお、NetBSDではgc.cの1.107以降でもちゃんと最後まで通りまし
| >た。
| 最新版(ruby-1.7.3 (2002-10-12))でコンパイルしてみましたが、問題ないよう
| です。
| 環境は、
|   WinXP Home SP2 
|   NMAKE 6.00.8168.0
| です。
|   >win32/configure
|   >nmake
|   >nmake test
| の手順で、全てパスしました。

うちの別環境でもやっぱり問題を再現できなかったりしたのですが、
GC絡みじゃよくあることか、と思い直して、再現できる環境で地道
にデバッグしてみました(必殺printfデバッグ ^^;)。

variable.cのrb_global_entry()内でALLOC()、つまりruby_xmalloc()
を2回呼び出してるわけですが、2回目のALLOC()でmalloc_increase
がmalloc_limitより大きくなった場合、またはmalloc()に失敗した
場合、rb_gc()が実行されます。
で、rb_gc() -> rb_gc_mark_global_tbl() -> st_foreach() ->
mark_global_entry() と呼び出されるのですが、この時点ではvarが
まだ存在しないので、var->marker()の呼び出しで落ちてしまう、と
いうことだったようです。

というわけで、パッチ。

diff -u -1 -p -w -r1.71 variable.c
--- variable.c	2002/09/26 00:48:33	1.71
+++ variable.c	2002/10/15 06:31:55
@@ -356,4 +356,4 @@ rb_global_entry(id)
 	entry = ALLOC(struct global_entry);
-	st_add_direct(rb_global_tbl, id, entry);
 	var = ALLOC(struct global_variable);
+	st_add_direct(rb_global_tbl, id, entry);
 	entry->id = id;

それでは。
-- 
U.Nakamura <usa@osb.att.ne.jp>
# わかっちゃえば簡単...



In This Thread