[#3536] Re: [ruby-list:10256] Re: for が修飾子だったら — Junichi Kurokawa <jun@...>

Reply-To: ruby-devとしました。

15 messages 1998/10/22

[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 に対応するのが、
本筋とも思えます。

アレーのメモリ管理ポリシーに何らかの仮定をしている
部分はあるのでしょうか?(含む拡張モジュール)
	えぐち

In This Thread