[ruby-dev:3564] Re: ([nil]*i).compact bug?
From:
EGUCHI Osamu <eguchi@...>
Date:
1998-10-31 17:10:21 UTC
List:
ruby-dev #3564
えぐち@エスアンドイー です。
>>> On Sat, 31 Oct 1998 22:32:38 +0900, Kazuhiro HIWADA <hiwada@kuee.kyoto-u.ac.jp> said:
hiwada> ひわだです。
hiwada> ひわだ> #freebsd2.2.2 がまずいのかも。
hiwada>
hiwada> man realloc をみたところ freebsd2.2.2 では size が 0 だとfreeしたうえ
hiwada> で null pointer を返してくれるみたいです。freebsd2.2.7 では null が返っ
hiwada> たりしないみたいなんですが。
hiwada>
hiwada> とりあえず、freebsd2.2.2では以下で動いてます ^^;。
hiwada>
hiwada> --- gc.c.orig Sat Oct 31 21:54:38 1998
hiwada> +++ gc.c Sat Oct 31 22:06:24 1998
hiwada> @@ -97,7 +97,7 @@
hiwada> if (!ptr) return xmalloc(size);
hiwada> malloc_memories += size;
hiwada> mem = realloc(ptr, size);
hiwada> - if (!mem) {
hiwada> + if (!mem && size) {
hiwada> gc_gc();
hiwada> mem = realloc(ptr, size);
hiwada> if (!mem)
hiwada>
上のパッチだと、 xrealloc() が、0 を返す事になり、
これが後で問題になる可能性があります。
% ruby -e "p [nil, nil].compact << 1"
を FreeBSD-2.2.2 の ruby でやって落ちませんか?
ary_compact_bang() も、そのまま ary->ptr に
xrealloc() の戻り値を無批判に受け入れ、
その後、他の部分も ary->ptr の値に疑問をもっていない様です。
size == 0 の時は、size を 1 に丸めるのが無難でしょう。
% diff -du --show-c-function gc.c.orig gc.c
--- gc.c.orig Tue Sep 8 18:17:38 1998
+++ gc.c Sun Nov 1 01:18:52 1998
@@ -95,6 +95,7 @@ xrealloc(ptr, size)
ArgError("negative re-allocation size");
}
if (!ptr) return xmalloc(size);
+ if (size == 0) size = 1;
malloc_memories += size;
mem = realloc(ptr, size);
if (!mem) {
***
array#compact については、
ARY_DEFAULT_SIZE の精神からすると、 capa == 0 まで
縮小するのもアレだとは思います。
が、ものが ``compact''なだけに、最小サイズへの縮小が
狙いとも思えるので、 PARRAY(ary->ptr) == 0 に対応するのが、
本筋とも思えます。
アレーのメモリ管理ポリシーに何らかの仮定をしている
部分はあるのでしょうか?(含む拡張モジュール)
えぐち