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.
This commit is contained in:
1 parent
293e6a7280
commit
5a7382185b
8 files changed
+628
-1
No files matched your search
@@ -0,0 +1,124 @@
|
||||
# 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`.
|
||||
Reference in new issue
Block a user