Estado de la campaña
Resumen ejecutivo
Cobertura por archivo — C++ (libFuzzer + LLVM)
-fprofile-instr-generate -fcoverage-mapping, ejecución sobre corpus completo, procesado con llvm-profdata merge + llvm-cov report. Harness excluido con -ignore-filename-regex='harness.cc|execute-rt.cc'.
Cobertura diferencial — Campaña 1 vs Campaña 2
Bloqueadores detectados — Magic Values
0x25504446 ("%PDF")"\x25\x50\x44\x46" (bytes de "%PDF"). Seed mínimo: 4 bytes con el magic."PCORE_DOC_V2""PCORE_DOC_V2" al diccionario. Considerar seed XML con xmlns correcto para desbloquear parsing completo.Cobertura Rust — cargo-fuzz · fuzz_json_validator
json::parser::from_bytes(). El módulo json::validator requiere schema pre-cargado via schema::loader::load_file() que el harness no inicializa. 82% del código de validación inaccesible.
cargo +nightly fuzz coverage fuzz_json_validator
Anti-patrones detectados en esta campaña
| Anti-patrón | ¿Presente? | Impacto | Acción correctiva |
|---|---|---|---|
| Usar cobertura reportada por libFuzzer (runtime 47%) para comparaciones | SI — Campaña 1 | Inflaba cobertura en ~6 pp con código de harness | Migrado a llvm-cov con -ignore-filename-regex |
| No filtrar harness de reportes | SI — Campaña 1 | harness.cc y execute-rt.cc sumaban cobertura artificial | Corregido en campaña 2 |
| Ignorar inputs que crashean al generar cobertura | NO | — | execute-rt.cc implementa fork() |
| No rastrear cobertura a lo largo del tiempo | SI | Sin baseline de campaña 1 no se detecta regresión schema_validator | Archivar .profdata con timestamp en CI |
| Mezclar instrumentación LLVM y GCC | NO | — | Solo LLVM/clang en todos los targets |
| Harness Rust sin inicializar dependencias necesarias | SI — fuzz_json_validator | Bloquea 66% del código Rust — causa del plateau | Reescribir harness con schema embebido |
Recomendaciones priorizadas
# pdf.dict
"\x25\x50\x44\x46"
# xml.dict
"PCORE_DOC_V2"
// harness.rs — añadir antes de fuzz loop
let schema = Schema::from_bytes(include_bytes!("../fixtures/base.schema.json"))?;
llvm-cov show ./fuzz_exec -instr-profile=campaign2.profdata \
-instr-profile=campaign1.profdata -show-line-counts-or-regions \
src/validators/schema_validator.cc
llvm-profdata merge -sparse fuzz.profraw -o coverage-$(date +%Y%m%d).profdata
# Seed mínimo PDF: 4 bytes magic + header básico
printf '\x25\x50\x44\x46-1.4\n' > corpus/seed_minimal.pdf