From: TOYOFUKU Chikanobu Date: 2008-09-04T02:44:33+09:00 Subject: [ruby-dev:36141] Re: [ ruby-Bugs-17454 ] irb crash while iterating over all objects 豊福です。 In [ruby-dev:36137] > 改めてチェックしてみましたが、長さ2以上のbignum 0は存在しま > すね。ObjectSpace.each_objectを使わないと見えないので、処理 > 途中の値として登場するのだと思います(あまり追いきれなかった)。 参照はされないけれど解放前のオブジェクトということであれば big2str_karatsuba に怪しいところがあります。 bigdivmod から呼ばれる bigdivrem で j = (nx==ny ? nx+2 : nx+1) - ny; for (i = 0;i < j;i++) zds[i] = zds[i+ny]; RBIGNUM_SET_LEN(*divp, i); というところがあるのですがここでセットされる長さが最適な 長さ+1となるケースがあります。 *divp は bigdivmod では normalize されずそのまま返されます。 big2str_karatsuba では bigdivmod(x, b, &q, &r); lh = big2str_karatsuba(q, base, ptr, ... ll = big2str_karatsuba(r, base, ptr + lh, .. return lh + ll; となっており上記の *divp が入った q が最適でない長さのままに なります。 divp だけでなく bigdivrem の *modp の if (dd) { t2 = 0; i = ny; while(i--) { t2 = (t2 | zds[i]) >> dd; q = zds[i]; zds[i] = BIGLO(t2); t2 = BIGUP(q); } } RBIGNUM_SET_LEN(*modp, ny); のところでもこの処理に入る前に zds[ny-1]>>dd == 0 だと 最適な長さと ny が1ずれることになると思います。 ---