LLVMMemoryCopyFillLowering: in-bounds `memory.fill`/`memory.copy` trap on a 4 GiB memory
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 62/100
Línea de trabajo
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.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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:
__memory_copy has the same computation:
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.
- Lenguaje dominante
- WebAssembly
- Estrellas
- 8.7k
- Forks
- 897
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 103
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de WebAssembly/binaryen
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
WebAssembly/binaryen#9135 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 Medio día Aptitud para principiantes 76/100
WebAssembly/binaryen#9018 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 15/100
WebAssembly/binaryen#9260 · 5 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
WebAssembly/binaryen#9249 ·
Los mantenedores suelen responder en 1 día
-
Memory64Lowering: table.get/table.set keep i64 index on lowered table64, output fails validationAbierto
Dificultad 3/5 Medio día Aptitud para principiantes 66/100
WebAssembly/binaryen#9245 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de WebAssembly/binaryen
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
snowballstem/snowball#311 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
JakeChampion/lang#12684 ·
Los mantenedores suelen responder en 1 día
-
`lvm_compact` has no self-hosted twin, and `docs/158` §5 says every language-face component mustAbiertobug sev-3 vm
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
-
Bisect issue233157Abiertobisect
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
dtcxzyw/llvm-bisect-service#545 · 1 comentario ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día