From: Tanaka Akira Date: 2006-06-24T21:50:18+09:00 Subject: [ruby-dev:28826] GC problem by rb_ary_new4(x, 0) boron でも起きていますが、手元でも SEGV するので調べてみました。 http://www.rubyist.net/~akr/chkbuild/debian-sarge/ruby-trunk/log/20060624T002949.txt.gz どうも、rb_ary_new4(i, 0) で確保したのを初期化する前に rb_eval を呼び出してその中の GC で初期化してない領域を参照し て問題が起きている、というのがひとつあるようです。 (それだけではないようですが) * そもそも初期化しないんなら rb_ary_new4 でなくて rb_ary_new2 でいいはず * それはそれとして rb_ary_new4 が初期化しないところを生きて いる領域とするのは危険 なので、こんなかんじでしょうか。 Index: array.c =================================================================== RCS file: /src/ruby/array.c,v retrieving revision 1.187 diff -u -r1.187 array.c --- array.c 9 Jun 2006 21:20:15 -0000 1.187 +++ array.c 24 Jun 2006 12:35:37 -0000 @@ -163,8 +163,8 @@ ary = rb_ary_new2(n); if (n > 0 && elts) { MEMCPY(RARRAY(ary)->ptr, elts, VALUE, n); + RARRAY(ary)->len = n; } - RARRAY(ary)->len = n; return ary; } Index: eval.c =================================================================== RCS file: /src/ruby/eval.c,v retrieving revision 1.903 diff -u -r1.903 eval.c --- eval.c 23 Jun 2006 08:28:04 -0000 1.903 +++ eval.c 24 Jun 2006 12:35:37 -0000 @@ -3635,7 +3635,7 @@ long i; i = node->nd_alen; - val = rb_ary_new4(i, 0); + val = rb_ary_new2(i); for (i=0;node;node=node->nd_next) { RARRAY(val)->ptr[i++] = rb_eval(self, node->nd_head); RARRAY(val)->len = i; @@ -4881,7 +4881,7 @@ if (n == 0) { return rb_yield_0(Qundef, 0, 0, 0); } - val = rb_ary_new4(n, 0); + val = rb_ary_new2(n); va_start(args, n); for (i=0; iptr[i] = va_arg(args, VALUE); -- [田中 哲][たなか あきら][Tanaka Akira]