Files
reiserfsprogs/tests/vm/RESULTS.md
T
lgcosta 5a7382185b
build / build (clang, ) (push) Failing after 6s
build / build (gcc, ) (push) Failing after 6s
build / build (gcc, --enable-io-failure-emulation) (push) Failing after 6s
build / build (gcc, --enable-warnings) (push) Failing after 5s
Add a libvirt/KVM test environment and fix the gcc-12 warning it found
The VM harness (tests/vm/) builds and exercises the tools on real Debian and
Alpine guests, driving the serial console (no sshd/cloud-init dependency).

Results on Debian 12 (glibc 2.36, gcc 12.2): 12/12 checks pass, 0 warnings
with -Wall -Wextra, including a real 128M -> 256M resize and the rollback
save/restore/reject paths.

Results on Alpine 3.20 (musl 1.2.5): the build cannot start. configure stops
at "reiserfsprogs requires a method to add printf modifiers" because
reiserfscore/prints.c depends on glibc's register_printf_specifier(3) and
<printf.h>, which musl does not provide. This is pre-existing and out of
scope here; measured at 341 use sites across 20+ files, all routed through
reiserfs_warning()/reiserfs_info(). Documented in tests/vm/RESULTS.md.

Fix the one real defect the harness surfaced:

fsck/semantic_check.c: check_check_regular_file() is called with NULL for
new_ih (line 466), so the block that would fill *new_ih is unreachable and
check_semantic_pass() never returns RELOCATED through that path. The
"case RELOCATED:" arm still reads relocated_ih.ih_key, which gcc 12.2
reports as "may be used uninitialized" (-Wmaybe-uninitialized); gcc 16 does
not, because it proves the path dead. Zero-initialise the struct and say why.

Verified: 0 warnings on gcc 12.2 after the change, and the Debian battery
stays at 12/12.
2026-11-12 00:11:31 -03:00

4.6 KiB
Raw Blame History

Resultados dos testes em VM

Bateria executada com tests/vm/run_in_vm.sh em duas distribuições, ambas em KVM (qemu:///session), com o código de 293e6a7.

Ambiente

Debian 12 (bookworm) Alpine 3.20.3
Kernel 6.1.0-54-cloud-amd64 6.6.49-0-virt
libc glibc 2.36 musl 1.2.5
gcc 12.2.0 13.2.1
init systemd + cloud-init OpenRC + cloud-init

Resultado por item

# Teste Debian Alpine
1 autogen.sh passa passa
1 configure --enable-warnings passa falha (ver abaixo)
1 make -j passa, 0 warnings não alcançado
2 mkreiserfs passa não alcançado
3 reiserfsck --check passa não alcançado
4 debugreiserfs -S passa não alcançado
5 reiserfstune -l passa não alcançado
6 resize_reiserfs 128→256 MiB passa não alcançado
7 fsck pós-resize passa não alcançado
8 rollback: grava passa não alcançado
8 rollback: restaura passa não alcançado
8 rollback: magic inválida rejeitada passa não alcançado
8 rollback: arquivo inexistente rejeitado passa não alcançado

Debian: 12/12. Alpine: bloqueado no item 1.

Achado 1 (bloqueante): não compila em musl

O configure do Alpine falha com:

checking for register_printf_modifier... no
checking for register_printf_specifier... no
configure: error: reiserfsprogs requires a method to add printf modifiers

Causa: reiserfscore/prints.c usa register_printf_specifier(3), extensão glibc-only (<printf.h>). O musl não fornece printf.h nem essas funções. O configure.ac trata isso como erro fatal explícito — o comportamento é correto, mas o projeto não compila fora da glibc.

Alcance medido:

Especificador Uso
%k 139
%K 106
%H 52
%M 25
%b 9
%U 4
%y 2
%30H, %20y, %20k, %20K 4
total 341

Todos passam por reiserfs_warning() / reiserfs_info(). Portar exigiria substituir o mecanismo por funções de formatação explícitas (por exemplo char *format_key(const struct reiserfs_key *) com %s), uma mudança de API interna ampla — não um ajuste local.

Impacto prático: reiserfsprogs fica restrito à glibc. Como o único uso atual da ferramenta é resgate de dados, isso importa: live images de recuperação baseadas em Alpine/musl não conseguem compilar o projeto.

Achado 2 (corrigido nesta rodada): warning real no gcc 12

O gcc 12.2 do Debian acusou, duas vezes:

../include/reiserfs_fs.h:63:54: warning: ‘relocated_ih’ may be used uninitialized

O gcc 16 do host não acusa. Investigação:

  • fsck/semantic_check.c:620 passa &relocated_ih para check_semantic_pass();
  • o bloco que escreveria *new_ih está comentado (linhas 471–486);
  • a chamada em check_check_regular_file() (linha 466) passa NULL como new_ih, com o comentário /* relocate ? new_ih : */ NULL;
  • portanto RELOCATED nunca é retornado por esse caminho e case RELOCATED: (linha 665) leria relocated_ih não inicializado.

Não é alcançável hoje, mas é uma leitura potencial de lixo de pilha atrás de um #case que o compilador não consegue descartar. Correção: inicialização explícita = { 0 } com comentário explicando por que permanece zero.

Verificado: 0 warnings no gcc 12.2 após a correção.

Em fsck/semantic_rebuild.c o caminho equivalente é seguro: o bloco if (relocate) { ... *new_ih = *ih; retval = RELOCATED; } está ativo (linhas 808–822), então new_ih é escrito antes do case RELOCATED: (linha 999).

Achado 3: limitação do ambiente (não do código)

Nas imagens cloud o cloud-init não aplicou a senha do usuário: o datasource NoCloud exige o rótulo cidata e o CD correto, e o sshd demora a subir. O console serial, porém, fica disponível assim que o getty sobe — por isso o tests/vm/guestcmd.py dirige o pty e é o canal de automação usado. Isso não afeta o produto; afeta apenas como os testes são conduzidos.

Além disso, a rede user-mode (passt) não entrega DHCP nem DNS por padrão: a interface sobe como enp1s0 mas fica sem IP. Foi necessário configurar IP e resolver manualmente para instalar pacotes nas VMs.

Como reproduzir

cd tests/vm
./setup_env.sh                 # imagens + VMs (uma vez)
./run_in_vm.sh rfs-debian      # build + bateria completa
./run_in_vm.sh rfs-alpine      # deve falhar no configure (esperado)
./teardown_env.sh

Detalhes do ambiente, topologia e limitações: tests/vm/README.md.