Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

LLVMMemoryCopyFillLowering: in-bounds `memory.fill`/`memory.copy` trap on a 4 GiB memory

Aperta
#9,257 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
62/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
cpp, wasm
Ambito
compilers

Direzione di ricerca

The bug is in src/passes/LLVMMemoryCopyFillLowering.cpp: the generated __memory_fill bounds check (around lines 213-225) and __memory_copy (around lines 123-130) compute the memory size in bytes with i32 arithmetic, which wraps to 0 at 65536 pages. Reproduce with the WAT in the issue using wasm-opt --llvm-memory-copy-fill-lowering, then run the output to confirm the unreachable trap. Done when the bounds check is done in i64 and the 65536-page module no longer traps, with the existing bulk-memory lowering tests still passing.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Repro

(module
 (memory 65536)
 (func (export "f")
  (memory.fill (i32.const 0) (i32.const 0) (i32.const 1))))
$ wasm-opt in.wat --enable-bulk-memory --llvm-memory-copy-fill-lowering -o out.wasm
$ wasmtime run --invoke f in.wat
$ wasmtime run --invoke f out.wasm
Error: failed to run main module `out.wasm`

Caused by:
    0: failed to invoke `f`
    1: error while executing at wasm backtrace:
    0:     0x44 - <unknown>!<wasm function 1>
    1:     0x32 - <unknown>!<wasm function 0>
    2: wasm trap: wasm `unreachable` instruction executed

f returns normally. After --llvm-memory-copy-fill-lowering, f traps (unreachable).

In pseudocode, the generated __memory_fill checks:

if (dst + size > memory.size << 16) trap    // i32: 65536 << 16 = 0

With 65535 pages it does not trap.

Cause

The memory size in bytes is computed in i32, which wraps to 0 for 65536 pages:

https://github.com/WebAssembly/binaryen/blob/1d7748aa4ef48ac93f90712c2437ef88c6441389/src/passes/LLVMMemoryCopyFillLowering.cpp#L213-L225

__memory_copy has the same computation:

https://github.com/WebAssembly/binaryen/blob/1d7748aa4ef48ac93f90712c2437ef88c6441389/src/passes/LLVMMemoryCopyFillLowering.cpp#L123-L130

The pass header excludes pointer overflow, but this access does not overflow; only the computed memory size does.

Possible fix

Do the bounds check in i64.

Question

I'm not familiar with how this pass is used in practice. It seems to work as a polyfill for targets without bulk memory, so I'm not sure whether a module with a 65536-page memory actually reaches it.

Lingua principale
WebAssembly
Stelle
8.7k
Fork
897
Merge medio
2g 4h
PR unite (30g)
103

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di WebAssembly/binaryen

Tutte le issue di WebAssembly/binaryen

Issue simili

Altre issue su Compilers

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.