Skip to content

AUTO変数領域サイズ計算のワード桁あふれを修正 (GH#2 取りこぼし)#33

Merged
shuyo merged 1 commit into
mainfrom
fix/autovar-area-size-word-overflow
Jun 20, 2026
Merged

AUTO変数領域サイズ計算のワード桁あふれを修正 (GH#2 取りこぼし)#33
shuyo merged 1 commit into
mainfrom
fix/autovar-area-size-word-overflow

Conversation

@shuyo

@shuyo shuyo commented Jun 18, 2026

Copy link
Copy Markdown
Owner

概要

src/*.has の見逃しバグ確認ワークフロー中に発見。GH#2(str変数128個以上でワードオフセットが符号反転)の修整が AUTO(func ローカル)変数領域では str しか直っていなかった取りこぼしを修正する。

詳細

XB2.HASVariable_clr_sub(v_initF パス)は、型ごとに変数領域サイズを a1 に加算してエリア先頭ポインタを並べる。GH#2 修整時に str だけ ext.l + adda.l(32bit)化され、int/char/float は adda.w(ワード)のまま残っていた。

adda.w は加算値を符号拡張するため、サイズが $8000 以上になると符号反転して領域が壊れる。1関数内のその型のローカル変数数で:

修整前 あふれ閾値
int lsl.w #2adda.w(×4) 約8192個
char andi.wadda.w(≈×1) 約32765個
float lsl.w #3adda.w(×8) 約4096個
str ext.l+lsl.l #8+adda.l ✅ GH#2で修整済

str と同じ ext.l + 32bit 加算に揃え、閾値を約32767に引き上げた(実質無制限)。空の型(個数-1 = -1)は addq.w #1 を先に行う既存イディオムで 0 になり、ext.l 後も正しく 0 のまま。

clear パス(a1_clr_d0x4)は a1 をポインタ後置増分で進め、ワード dbra の閾値も int/char/float とも ≥32768(str init 修整値と同等)なので変更不要。GLOBAL 変数領域(XBSTAT.HAS)は既に正しく long。

影響

実用閾値(1関数に数千個のローカル変数)は高く即時被害は考えにくいが、GH#2 と同クラスの潜在バグであり、str の修整との一貫性も欠いていた。

検証

HAS.X でビルドし run68 で:

  • グローバル変数プログラム(SELFTEST):正常
  • func ローカル int/char/float(autovar):ret=30 / c=65 / g=1.25 すべて正しい(修整したパスを実際に通過)
  • アセンブルエラーなし

🤖 Generated with Claude Code

Variable_clr_sub の v_initF パスで、変数領域サイズを a1 に加算する際
GH#2 修整時に str だけが ext.l + adda.l に直され、int/char/float は
adda.w のまま残っていた。ワード加算は符号反転するため、1関数内に
その型のローカル変数が int:約8192個 / float:約4096個 / char:約32765個
以上あると領域計算が破綻する。str と同じ32bit計算に揃えた。

実用閾値は高く即時被害は考えにくいが、GH#2 と同クラスの潜在バグ。
HAS.X でビルドし、グローバル(SELFTEST) と func ローカル int/char/float
(autovar) の両方で正常動作を確認。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@shuyo shuyo merged commit 61385a7 into main Jun 20, 2026
@shuyo shuyo deleted the fix/autovar-area-size-word-overflow branch June 20, 2026 02:40
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.

1 participant