KDOC 442: メモリエイリアシング検出と対策の例を見る

この文書のステータス

  • 作成
    • 2025-09-22 貴島
  • レビュー
    • 2025-09-22 貴島

概要

メモリエイリアシングとは、異なる変数や参照が同じメモリ領域を指している状態を指す。メモリの効率使用に寄与するが、バグの原因になる可能性もある。

big: handle aliasing correctly for Rat.SetFrac. · golang/go@c7cf56bでは、メモリエイリアシング検出と、検出した場合のコピーを実装している。

 // SetFrac sets z to a/b and returns z.
 func (z *Rat) SetFrac(a, b *Int) *Rat {
-	z.a.Set(a)
 	z.a.neg = a.neg != b.neg
-	z.b = z.b.set(b.abs)
+	babs := b.abs
+	if &z.a == b || alias(z.a.abs, babs) {
+		babs = nat(nil).set(babs) // make a copy
+	}
+	z.a.abs = z.a.abs.set(a.abs)
+	z.b = z.b.set(babs)
 	return z.norm()
 }
  • &z.a == b 直接ポインタを比較する
  • alias(z.a.abs, babs) 基底配列が同じでないか確認する

関連

抽象。

  • 同じ実体を複数の参照が指すと、書き換えが互いに干渉する
  • 重なりを検出したら複製して干渉を避ける

関連。