Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

[interpreter] memory.grow on an i64 memory past 2^48 pages succeeds but allocates wrong amount (or crashes)

クローズ 初心者向け
#2,281 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

関連するプルリクエストがすでにマージされています。

  • #2290 @rossberg による — マージ済み

評価

難易度
2/5
見積もり時間
1〜3時間
初心者へのやさしさ
76/100
issue の種類
バグ
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
ocaml, wasm
領域
backend, testing

調査の方向性

runtime/memory.mlから始め、特に27~38行付近のvalid_sizeと58~71行付近のcreate/growを確認し、その後、参照されているWebAssemblyのメモリ制限を調べてください。インタープリターで、2^48ページおよび2^48 + 1ページの報告されたケースを再現してください。過大なi64の拡張が-1で拒否され、memory.sizeが変わらず、正確な上限のケースでクラッシュしなければ完了です。

索引モデルが issue の本文から書いたものです。

説明

(module
  (memory i64 1)
  (func (export "grow") (param i64) (result i64) (memory.grow (local.get 0)))
  (func (export "size") (result i64) (memory.size)))
(assert_return (invoke "grow" (i64.const 0x1_0000_0000_0000)) (i64.const -1))
(assert_return (invoke "size") (i64.const 1))
Result: 1 : [i64]
Expect: -1 : [i64]
assertion failure: wrong return values

Growing to exactly 2^48 pages crashes instead:

(module
  (memory i64 1)
  (func (export "grow") (param i64) (result i64) (memory.grow (local.get 0))))
(invoke "grow" (i64.const 0xFFFF_FFFF_FFFF))
uncaught exception Invalid_argument("Bigarray.sub: bad sub-array")
Called from Wasm__Memory.grow in file "runtime/memory.ml", line 69

valid_size accepts every size for I64AT, so the 2^48-page bound on 64-bit memories is never checked, and create computes n * page_size in Int64, which wraps. For 2^48 + 1 pages the byte count wraps to 65536, so grow reports success with a one-page buffer; for 2^48 pages it wraps to 0 and the blit fails.

https://github.com/WebAssembly/spec/blob/340650f2f620169685814774bc5b019d05d4d3d7/interpreter/runtime/memory.ml#L27-L38
https://github.com/WebAssembly/spec/blob/340650f2f620169685814774bc5b019d05d4d3d7/interpreter/runtime/memory.ml#L58-L71

Tested at 340650f.

主要言語
WebAssembly
スター
3.5k
フォーク
540
平均マージ
1日 6分
マージ済み PR(30日)
25

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

WebAssembly/spec のほかの issue

WebAssembly/spec の issue をすべて見る

似ている issue

Backend & API Design の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。