JSON parser rejects 0e400 because parse_f64_approx returns NaN for a zero mantissa with a large exponent
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 88/100
Línea de trabajo
Comienza por crates/edit/src/float.rs, especialmente parse_f64_approx, y luego inspecciona json::Parser::parse_number y las pruebas existentes del parser JSON. Reproduce los casos de cero con exponente grande y de valores cercanos a i32::MAX, y haz que el parser devuelva cero finito o infinito sin entrar en panic. Añade o actualiza pruebas para verificar 0e400, -0e400, exponentes grandes válidos y el comportamiento del análisis de JSON.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
What happens
edit::float::parse_f64_approx returns NaN for a zero written with a large positive exponent, for example 0e400 or 0.0e999. f64::from_str returns 0.0 for the same input, and the module doc says the parser accepts the same grammar and differs by at most a few ULP.
Because json::Parser::parse_number rejects non finite numbers, the JSON value 0e400 (valid JSON, value zero) is reported as Invalid JSON when it appears in a settings file.
Separately, an exponent near i32::MAX (for example 1e2147483645) panics with attempt to add with overflow in debug and test builds.
What should happen
0e400 parses to 0.0 (and -0e400 to -0.0), and very large exponents return infinity or zero without panicking, matching f64::from_str.
Repro
use edit::float::parse_f64_approx;
assert_eq!("0e400".parse::<f64>().unwrap(), 0.0);
assert_eq!(parse_f64_approx(b"0e400"), Some(0.0)); // fails: Some(NaN)
let arena = edit::arena::scratch_arena(None);
edit::json::parse(&arena, "0e400").unwrap(); // Err: 1:6: Invalid JSON
parse_f64_approx(b"1e2147483645"); // debug build: attempt to add with overflow
Root cause
In crates/edit/src/float.rs the mantissa is scaled by 10f64.powi(exponent) whenever exponent != 0. For a zero mantissa and an exponent above about 308, powi returns infinity and 0.0 * inf is NaN.
The exponent is accumulated with saturating arithmetic, but the table lookup then computes exponent + 3 with a plain add, which overflows when the exponent saturated at i32::MAX.
- Lenguaje dominante
- Rust
- Estrellas
- 14.7k
- Forks
- 737
- Merge medio
- 20 h 42 min
- PR fusionados (30 d)
- 20
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- 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 microsoft/edit
-
Assertion fails when passing `C:` as command line argumentPosiblemente ocupada @rhysd la tomó hace 507 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
microsoft/edit#367 · 2 reacciones ·
Los mantenedores suelen responder en 1 día
-
[bug]: Cursor misalignment occurs when displaying inline code in Markdown under word wrapPosiblemente ocupada @xiaoditx la tomó hace 30 días. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 58/100
microsoft/edit#948 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 75/100
microsoft/edit#947 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
microsoft/edit#928 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
[feature request] more shortcutsAbierto
Dificultad 3/5 1-2 días Aptitud para principiantes 64/100
microsoft/edit#904 · 4 reacciones ·
Los mantenedores suelen responder en 1 día
Todos los issues de microsoft/edit
Issues similares
-
good first issue gpu serve
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 80/100
Los mantenedores suelen responder en 1 día
-
documentation E-easy good first issue help wanted
Dificultad 1/5 1-3 horas Aptitud para principiantes 91/100
Los mantenedores suelen responder en 1 día
-
documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
charles-hood/DiagramCraft#73 ·
-
Dificultad 1/5 1-3 horas Aptitud para principiantes 78/100
ontologyportal/sigma-rs#200 ·
Los mantenedores suelen responder en 1 día