nl: zero-padded numbering of i64::MIN panics or prints two minus signs
Los mantenedores suelen responder en 1 día
Ya se ha fusionado un pull request relacionado.
- #16092 de @fixfon — fusionado
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 25/100
Línea de trabajo
Read src/uu/nl/src/nl.rs, especially NumberFormat::format_to, and run the reproduction command in the issue in both debug and release builds. The issue notes that all 72 existing nl integration tests pass; use cargo test --no-default-features --features nl --test tests test_nl:: as a baseline. Done means -n rz prints the minimum value with one minus sign and does not panic.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
nl --number-format=rz mishandles the valid line number -9223372036854775808 (i64::MIN). A release build prints two minus signs and exits successfully; a debug build panics after writing a single -.
Reproduced on Linux x86_64 (Debian 13), with uutils 0.13.0 built from main at 62fcace0def184c550876d81ad1534408767f086. Compared with GNU coreutils 9.12 from the reference package linked in CONTRIBUTING.md; GNU 9.7 gives the same expected result.
From the repository root:
cargo build --release --no-default-features --features nl
export LC_ALL=C LANG=C
printf 'a\nb\n' | target/release/coreutils nl \
--starting-line-number=-9223372036854775808 -n rz -w 1 -s :
Actual output (exit status 0, empty stderr):
--9223372036854775808:a
-9223372036854775807:b
Expected output (GNU 9.12, exit status 0, empty stderr):
-9223372036854775808:a
-9223372036854775807:b
Building without --release and running the same command with target/debug/coreutils instead exits 101, writes only - to stdout, and reports attempt to negate with overflow.
This also happens when numbering reaches the minimum through a decrement:
printf 'a\nb\n' | target/release/coreutils nl \
--starting-line-number=-9223372036854775807 --line-increment=-1 \
-n rz -w 1 -s :
Here the second line gets the extra minus sign. Using -n rn or -n ln with the minimum value works correctly, as does -n rz starting at the adjacent value with the default increment.
The cause is in NumberFormat::format_to: the negative RightZero branch writes -, then calls number.abs(). The absolute value of i64::MIN is not representable as i64. Formatting its unsigned magnitude would avoid this overflow.
All 72 existing nl integration tests pass (cargo test --no-default-features --features nl --test tests test_nl::). The existing minimum-value tests use the default format rather than rz.
I searched open and closed issues and PRs for nl, the minimum value, and overflow/zero-padding reports. The related #15999 concerns parsing separate negative arguments; this reproducer uses the accepted --starting-line-number=... form. #13347 concerns large number widths, whereas this reproducer uses width 1.
- Lenguaje dominante
- Rust
- Estrellas
- 24.3k
- Forks
- 2.1k
- Merge medio
- 1 d 22 h
- PR fusionados (30 d)
- 396
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 uutils/coreutils
-
Unhelpful manual page(s)Abierto
Dificultad 2/5 Medio día Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día
-
pr: -n repeats line numbers after a form feedPosiblemente ocupada @1kailas la tomó hoy. AbiertoU - pr
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
U - nl
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
Los mantenedores suelen responder en 1 día
-
uniq: overflowing -f/-s/-w values with trailing garbage are silently acceptedPosiblemente ocupada @huuan26 la tomó hace 1 día. AbiertoU - uniq
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
Los mantenedores suelen responder en 1 día
-
README: Rust version is outdatedAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
Todos los issues de uutils/coreutils
Issues similares
-
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 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
riverqueue/river#1576 ·
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
stadelmanma/fitparse-rs#64 ·