Island Life

< 浮動小数点数遊び | PCアップグレードメモ >

2010/08/21

偽ポインタ

GC本読書会 - ときどきの雑記帖

#shiro さんが shibuya.lisp あたりで 64bit アーキテクチャでは
#ポインター/非ポインターの誤判定が増えたという話をされたような
#覚えがあるけど詳細思い出せず。
#ポインターじゃないものをポインターに判定して回収されないゴミが
#増えるという話だったかなあ?

逆で、問題が出たのは32bitアーキテクチャ。

4GBの空間を目一杯使うようなプログラムだと、ランダムな32bit整数が 有効な領域を指すポインタと誤認される確率がとても高くなるということ。

ヒープオブジェクトの先頭を指している時のみポインタと判断する、 というふうにすれば大抵防げると思う(Boehm GCのオプションで切り替え可)のだけれど、 Gaucheではオブジェクトの中を指していれば有効と判断しているので。

「先頭のみ」にすると、オブジェクトの中をいじってる時に一瞬でも 先頭への参照を失わないように気をつけてコードを書かないと、 触ってるオブジェクトが途中で回収されてしまう可能性がある。 コンパイラの最適化が絡むと結構厄介だ。例えば次のコード。 オブジェクト内へのポインタを有効とする場合は安全だけれど、 オブジェクト先頭へのポインタしか認識しない場合は安全ではなくなる。 (ScmStringは、const char*な文字列へのポインタを持つ構造体。 Scm_GetStringConstはそれを取り出す。)

void foo(ScmString *arg)
{
  const char *s = Scm_GetStringConst(arg);

  for (; *s; s++) {
    /* sでなんかする */
  }
}

Tags: Programming, Gauche

Post a comment

Name: