Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Bug and fix: `core::fmt` hangs with formatting flags (`{:#x}`, `{:#o}`, `{:#b}`, etc.)

Abierto
#871 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
52/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Tranquilo
Stack tecnológico
rust
Área
compilers

Línea de trabajo

Comienza con compiler-builtins/src/int/bswap.rs en las tres rutas indicadas, reproduce después los casos de formato mediante run.sh e inspecciona la cadena de llamadas generada. Verifica que las implementaciones de bswap ya no entren en recursión bajo rustc_codegen_gcc y que los ejemplos de alternate, alignment y padding terminen sin quedarse colgados.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Symptoms

When using formatting flags with an alternate flag or alignment/padding, the program hangs, produces no output, and raises no exception:

println!("{:#x}", 42u32);    // hangs
println!("{:#010x}", 42u32); // hangs
println!("{:>10}", 42u32);   // hangs
println!("{:x}", 42u32);     // works normally
println!("{}", 42u32);       // works normally
Root Cause

bswap.rs in compiler_builtins uses #[maybe_use_optimized_c_shim] + x.swap_bytes():

rust
// Original code (problematic)
#[maybe_use_optimized_c_shim]
pub extern "C" fn __bswapsi2(x: u32) -> u32 {
    x.swap_bytes()   // ← rustc_codegen_gcc compiles this into a call to __bswapsi2 itself
}
rustc_codegen_gcc compiles u32::swap_bytes() into a function call to __bswapsi2, leading to:

text
__bswapsi2 → ___bswapsi2 → __bswapsi2 → ___bswapsi2 → ... (infinite recursion)
After stack overflow, the PC jumps to an invalid address (e.g., 0xfb079370), causing the program to hang.

Inside core::fmt, handling the alternate flag (#) calls pad_integral, which in turn triggers __bswapsi2, exposing this bug.

Debugging Process

QEMU -d exec revealed the program stuck at 0x0dfc (OpenRISC exception vector area)

Vector 0xC00 = syscall exception, triggered by l.sys 0x8060

GDB breakpoint at 0xC00, ppc = 0x26914, located in the __bswapsi2 call chain

Disassembly showed mutual recursion: __bswapsi2 → ___bswapsi2 → __bswapsi2

Files to Modify

The bswap.rs files in the following three paths have identical content (same md5) and all need modification:

text
~/or1k-build/rustc_codegen_gcc/build/build_sysroot/sysroot/lib/rustlib/src/rust/library/compiler-builtins/compiler-builtins/src/int/bswap.rs
~/or1k-build/rustc_codegen_gcc/build/build_sysroot/sysroot_src/library/compiler-builtins/compiler-builtins/src/int/bswap.rs
~/or1k-build/rust-src/library/compiler-builtins/compiler-builtins/src/int/bswap.rs
The actual path used by run.sh (with -Z build-std=core) is the stage1 sysroot path, which can be confirmed with:

bash
find ~/or1k-build/rust-src/build -name "bswap.rs" -path "*/compiler-builtins/*" 2>/dev/null
Fix

Replace x.swap_bytes() with pure shift operations to eliminate recursion:

bash
# Backup (all three paths have identical content, backup together)
find /home/openrisc/or1k-build -name "bswap.rs" -path "*/compiler-builtins/*" | \
    while read f; do cp "$f" "${f}.bak"; echo "Backed up: $f"; done

# Modify (apply to all three paths)
find /home/openrisc/or1k-build -name "bswap.rs" -path "*/compiler-builtins/*" \
    ! -name "*.bak" | while read f; do
cat > "$f" << 'BSWAP_EOF'
intrinsics! {
    pub extern "C" fn __bswapsi2(x: u32) -> u32 {
        ((x & 0x000000FFu32) << 24) |
        ((x & 0x0000FF00u32) <<  8) |
        ((x & 0x00FF0000u32) >>  8) |
        ((x & 0xFF000000u32) >> 24)
    }
    pub extern "C" fn __bswapdi2(x: u64) -> u64 {
        ((x & 0x00000000000000FFu64) << 56) |
        ((x & 0x000000000000FF00u64) << 40) |
        ((x & 0x0000000000FF0000u64) << 24) |
        ((x & 0x00000000FF000000u64) <<  8) |
        ((x & 0x000000FF00000000u64) >>  8) |
        ((x & 0x0000FF0000000000u64) >> 24) |
        ((x & 0x00FF000000000000u64) >> 40) |
        ((x & 0xFF00000000000000u64) >> 56)
    }
    pub extern "C" fn __bswapti2(x: u128) -> u128 {
        let hi = ((x >> 64) & 0xFFFFFFFFFFFFFFFFu128) as u64;
        let lo = (x & 0xFFFFFFFFFFFFFFFFu128) as u64;
        let hi_swapped = __bswapdi2(hi) as u128;
        let lo_swapped = __bswapdi2(lo) as u128;
        (lo_swapped << 64) | hi_swapped
    }
}
BSWAP_EOF
    echo "Modified: $f"
done

# Clear compilation cache to trigger recompilation
find ~/riscion/sw/rust/testfmt/target -name "*compiler_builtins*" -delete
After modification, simply re-run run.sh. This fix must be reapplied after upgrading the nightly version.

Impact Scope

All code using core::fmt with alternate/alignment/padding formatting flags, including but not limited to:

{:#x}, {:#X}, {:#o}, {:#b}

{:#010x} and other width-specified alternate formats

{:>10}, {:<10}, {:^10} and other alignment formats

{:*^12}, {:0>8} and other custom padding formats
Lenguaje dominante
Rust
Estrellas
1.2k
Forks
105
Merge medio
6 h 30 min
PR fusionados (30 d)
22

Preparar el entorno

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 rust-lang/rustc_codegen_gcc

Todos los issues de rust-lang/rustc_codegen_gcc

Issues similares

Más issues de Rust

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.