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) 基底配列が同じでないか確認する

関連

なし。