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

Chiusa
#16,083 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Una pull request collegata è già stata integrata.

  • #16092 di @fixfon — integrata

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
25/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
rust
Ambito
cli

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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.

Lingua principale
Rust
Stelle
24.3k
Fork
2.1k
Merge medio
1g 20h
PR unite (30g)
380

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di uutils/coreutils

Tutte le issue di uutils/coreutils

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.