Cómo usar pruebas generativas para detectar errores en compiladores

Fuentes: How to use generative testing to find bugs in regex engines

El artículo técnico explora la eficacia de las pruebas generativas (fuzzing) frente a las pruebas de ejemplo basadas en casos unitarios para descubrir errores en compiladores de expresiones regulares. El autor, matklad, presenta un caso de estudio práctico donde un fuzzer propio detectó un segundo bug en la librería regex de Rust, validando parcialmente el enfoque, aunque reconoce que su argumento es débil al conocer el error objetivo.

El texto detalla la metodología para construir un fuzzer efectivo, destacando la importancia crítica de tener un 'oráculo' de referencia. En el caso de los compiladores de regex, esto se logra comparando la salida de la librería principal con la de una librería alternativa (regex_lite) que ofrece la misma API. El artículo enfatiza que los errores suelen residir en ejemplos pequeños y truculentos, no en entradas masivas, y recomienda usar generadores de caracteres con distribuciones aleatorias para maximizar la probabilidad de interacción entre características del sistema.

Se describe el proceso de generación de entradas: se selecciona un subconjunto del alfabeto de caracteres y se asigna peso a las características de la regex (alternación, repetición, comodines) para generar expresiones aleatorias. El código incluye técnicas de reutilización de memoria estática para mantener la velocidad de ejecución. La conclusión es que, aunque las herramientas de fuzzing son poderosas, su diseño debe ser co-diseñado con el sistema para garantizar que detecten los errores críticos, y que incluso los generadores aleatorios simples como xoroshiro pueden ser efectivos si se aplican correctamente.