Skip to content

fix: update write pointer after Realloc in freezeArrayBuffer#5

Merged
kg68k merged 1 commit intokg68k:mainfrom
iwadon:fix-freeze-array-buffer
Nov 26, 2025
Merged

fix: update write pointer after Realloc in freezeArrayBuffer#5
kg68k merged 1 commit intokg68k:mainfrom
iwadon:fix-freeze-array-buffer

Conversation

@iwadon
Copy link
Copy Markdown
Contributor

@iwadon iwadon commented Nov 26, 2025

macOS上でビルドしたdisを実行すると"ヒープメモリが不足しています。"としてエラー終了することがありました。

iwatsuki-mbp:~/src/x68k/dis-mod% ./build/dis t.x t.s --overwrite
ソースコードジェネレータ for X680x0 version 4.05
Copyright (C)1989-1992 K.Abe, 1994-1997 R.ShimiZu, 2025-06-17 TcbnErik.
対象MPU: 68000
t.x を読み込みます。
/Users/don/src/x68k/dis-mod/include/doscall.mac を読み込みます。
/Users/don/src/x68k/dis-mod/include/iocscall.mac を読み込みます。
/Users/don/src/x68k/dis-mod/include/fefunc.mac を読み込みます。
リロケート情報を展開します。
シンボルテーブルを展開します。
プログラム領域解析中です。><
データ領域解析中です。#
データ領域の中からプログラム領域を探しています(1)。
文字列を探しています。.
データ領域の中からプログラム領域を探しています(2)。
ラベルチェック中。.:
ソースを作成中です。
ヒープメモリが不足しています。
[1]    78199 exit 1     ./build/dis t.x t.s --overwrite

もとのアセンブリ言語のソースコードは.dc.w $ff00のみの簡単なものです。

    .text
    .even
label::
    .dc.w   $ff00

調べましたところ、freezeArrayBuffer()にてRealloc()経由で呼び出されたrealloc()が再配置されたメモリブロックを返した際にab->bufferab->writeの位置関係が逆転することがあり、その結果size_t size = (char*)ab->write - (char*)ab->buffer;で計算された大きな値がRealloc()に渡りエラー終了する、という流れのようです。

すでにsecureArrayBufferCapacity()ab->bufferab->writeが一緒に更新されてましたので、同じようにfreezeArrayBuffer()においてもab->bufferab->writeを一緒に更新するように修正しました。手元では問題なく動くようになりましたが、この修正で問題ないでしょうか?

@kg68k
Copy link
Copy Markdown
Owner

kg68k commented Nov 26, 2025

なるほど、

  • realloc()は規格上、同じサイズや小さいサイズへの変更時にもメモリブロックが移動することがあり、macOSではそのような実装になっている。
  • 同じオブジェクトでfreezeArrayBuffer()を複数回呼んでいて、二回目の呼び出しでエラーになる。

ということですね。
マージさせていただきます。

@kg68k kg68k merged commit c83ca25 into kg68k:main Nov 26, 2025
6 checks passed
@iwadon iwadon deleted the fix-freeze-array-buffer branch November 27, 2025 01:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants