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.
4.6 KiB
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:620passa&relocated_ihparacheck_semantic_pass();- o bloco que escreveria
*new_ihestá comentado (linhas 471–486); - a chamada em
check_check_regular_file()(linha 466) passaNULLcomonew_ih, com o comentário/* relocate ? new_ih : */ NULL; - portanto
RELOCATEDnunca é retornado por esse caminho ecase RELOCATED:(linha 665) leriarelocated_ihnã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.