From: Koji Oda Date: 2000-02-10T09:50:32+09:00 Subject: [ruby-dev:9180] Re: ruby-1.4.3 memory leak 小田@QNES です。 --- On Wed, 9 Feb 2000 07:41:06 +0900 [[ruby-dev:9159] Re: ruby-1.4.3 memory leak] nobu.nakada@nifty.ne.jp wrote: > なかだです。 > > 説明には、 > > このエラーは、メモリ ブロックの有効範囲を超えて、 > > 読み込み処理を行おうとしたときに発生します。 > > とありました。 > > > > char *x = "hoge"; > > char y[10]; > > memcpy(y, x, sizeof(y)); > > というようなケースの時にでるということでした。 > > でも、一度関数の引数になってしまったら配列の要素数は(少なくとも > 静的な解析だけでは)分からないのでは? 2つ目と3つ目はそういうこと > だと思えるのですが。 チェックツールがどういう制御をしているのか、よくは分かりませんが、 おそらく、memcpy関数などのメモリ関連の関数をフックして動的に 調べているんじゃないでしょうか。 つまり、上記例で行くと、 "hoge"の後にエラーチェック用のデータを動的に埋め込む。 memcpyでチェック用データ領域まで来たかチェック という感じで、エラーを検出しているんじゃないかと想像しています。 > > 構造体メンバのアライメントを4バイトに変更していたのが > > 原因でした。 > > 既定値の8バイトに戻したら、オーバーフローのエラーは > > 消えました。 > > なんかますますもって謎です(^^;。 アライメントによって、エラー検出用データをセットする位置が 変わったんじゃないかと想像してます。 例えば、 ruby-1.4.3 のarray.c の26行目辺り while (size--) { *mem++ = Qnil; } って、本当は while (size--) { *mem = Qnil; mem++; } ですよね?(1つ後ろの領域を潰している?) で、アライメントによって、たまたまOKになったと。 # 想像の域を出ないので何ともいえませんが(^^;;; ∪*****/\*****\/*****/\*****∪ Koji Oda NEC Software Kyusyu 1st Development Department Based Software Division E-Mail:oda@bsd1.qnes.nec.co.jp ∩*****/\*****\/*****/\*****∩