Cranelift: interpreter: incorrect edge-case handling in fcvt_to_{u,s}int.i128
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 83/100
Línea de trabajo
Lee cranelift/interpreter/src/step.rs alrededor de las conversiones de float a i128 y la documentación de instrucciones en cranelift/codegen/meta/src/shared/instructions.rs. Después, examina runtests/i128-conversion.clif y ejecuta la prueba pertinente del intérprete de Cranelift. El trabajo estará terminado cuando las conversiones con signo fuera del rango provoquen un trap y las conversiones sin signo devuelvan los valores esperados para entradas en [2¹²⁷, 2¹²⁸).
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Minor/pedantic bug. The float-to-int128 conversions in the interpreter misbehave when passed very large (or very negative) values:
- fcvt_to_sint.i128 returns i128::MAX or i128::MIN for out-of-range inputs. The doc comments say it should trap.
- fcvt_to_uint.i128 and fcvt_to_uint_sat.i128 clamp some large inputs (in the interval [2¹²⁷, 2¹²⁸)) to i128::MAX, even though those values should fit in the result.
I noticed this issue because runtests/i128-conversion.clif matches the implementation, so it has three incorrect expectations:
- Line 14:
; run: %fcvt_to_uint_i128(0x1.fffffep127) == 170141183460469231731687303715884105727- Should return: 340282346638528859811704183484516925440
- The nearly identical call on line 40 should have the same result:
; run: %fcvt_to_uint_sat_i128(0x1.fffffep127) == 170141183460469231731687303715884105727
- Line 28:
; run: %fcvt_to_sint_i128(0x1.fffffep127) == 170141183460469231731687303715884105727- Should trap
The root cause is that the interpreter's fcvt_to_uint and fcvt_to_sint cast the input with as i128 before the bounds check.
- Lenguaje dominante
- Rust
- Estrellas
- 18.8k
- Forks
- 1.9k
- Merge medio
- 1 d 3 h
- PR fusionados (30 d)
- 380
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una 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 bytecodealliance/wasmtime
-
bug wasm-proposal:exceptions wasmtime:debugging
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bytecodealliance/wasmtime#14102 ·
Los mantenedores suelen responder en 1 día
-
wasm-proposal:gc
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
bytecodealliance/wasmtime#13808 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
bytecodealliance/wasmtime#15195 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 20/100
bytecodealliance/wasmtime#15193 ·
Los mantenedores suelen responder en 1 día
-
awfy performance
Dificultad 4/5 3-5 días Aptitud para principiantes 44/100
bytecodealliance/wasmtime#15192 ·
Los mantenedores suelen responder en 1 día
Todos los issues de bytecodealliance/wasmtime
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
RustCrypto/utils#1597 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Non-`main` default branchesAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
max-sixty/worktrunk#4727 · 7 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 86/100
Los mantenedores suelen responder en 1 día
-
follow-up
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
carrick-sh/carrick#1859 ·
Los mantenedores suelen responder en 1 día