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

124 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```sh
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`.