nl: zero-padded numbering of i64::MIN panics or prints two minus signs

Cerrado
#16,083 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
rust
Área
cli

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

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de uutils/coreutils

Todos los issues de uutils/coreutils

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.