← Últimos artículos
💻 computer science

Investigating the application of differential fuzzing to support the identification and suppression of equivalent mutants: An experimental study

Este estudio experimental demuestra que el fuzzing diferencial es un enfoque práctico y agnóstico al lenguaje para identificar y suprimir eficientemente mutantes equivalentes a través de diversos proyectos de software del mundo real, logrando puntuaciones de mutación casi perfectas mientras genera entradas accionables para fortalecer las suites de pruebas tradicionales.

Autores originales: Bruno Ely Reis Garcia, Simone do Rocio Senger de Souza

Publicado 2026-08-27
📖 5 min de lectura🧠 Análisis profundo

Autores originales: Bruno Ely Reis Garcia, Simone do Rocio Senger de Souza

Artículo original bajo licencia CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Esta es una explicación generada por IA del artículo a continuación. No ha sido escrita ni avalada por los autores. Para mayor precisión técnica, consulte el artículo original. Leer descargo de responsabilidad completo

Las pruebas de software son el proceso de verificar si un programa informático funciona correctamente, pero encontrar todos los posibles errores es casi imposible porque los programas son complejos y las entradas son infinitas. Para abordar esto, los investigadores utilizan una técnica llamada pruebas de mutación, que consiste en introducir intencionadamente errores diminutos y realistas en el código para ver si las pruebas existentes pueden detectarlos. Si una prueba no detecta el error, significa que la suite de pruebas no es lo suficientemente sólida. Sin embargo, este método enfrenta un obstáculo persistente: algunos de estos errores falsos son tan sutiles que no cambian el comportamiento del programa en absoluto, lo que los hace imposibles de detectar. Estos se conocen como mutantes equivalentes, e identificarlos suele requerir que un experto humano dedique una cantidad significativa de tiempo a leer el código línea por línea, un proceso lento y costoso que ha frenado durante mucho tiempo el uso generalizado de este método de prueba.

Al mismo tiempo, otro método de prueba llamado fuzzing se ha convertido en una herramienta estándar para encontrar fallos de seguridad. El fuzzing funciona alimentando a un programa con cantidades masivas de datos aleatorios o malformados para ver si provoca una caída. Aunque es eficaz para encontrar errores que hacen que un programa deje de funcionar, el fuzzing tradicional suele pasar por alto el tipo de errores sutiles que cambian cómo un programa calcula o se comporta sin causar una caída. Un nuevo estudio realizado por investigadores de la Universidad de São Paulo explora una forma de combinar estos dos mundos. Investigaron una técnica llamada fuzzing diferencial, que ejecuta el programa original y una versión con un error diminuto uno al lado del otro, alimentándolos con exactamente los mismos datos y comparando los resultados. Si las dos versiones producen salidas diferentes, el error es detectado. Los investigadores querían ver si este enfoque podía identificar automáticamente esos esquivos mutantes equivalentes y hacerlo mucho más rápido de lo que podría hacerlo un humano.

Para probar esta idea, el equipo seleccionó seis funciones específicas de cuatro proyectos de software de código abierto muy conocidos, escritos en cuatro lenguajes de programación diferentes: C++, C, Go y Python. Estos proyectos incluían Bitcoin Core, un protocolo de criptomoneda; OpenSSL, una biblioteca de criptografía; LND, una red de canales de pago; y Arrow, una biblioteca de fechas y horas. Utilizando una herramienta capaz de generar errores para cualquier lenguaje de programación, crearon 1.090 variaciones válidas de estas funciones. Antes de que comenzara la prueba automatizada, los investigadores inspeccionaron manualmente los errores para eliminar aquellos que eran obviamente equivalentes, dejando un conjunto de casos desafiantes para ver si el sistema automatizado podía distinguir el resto. Luego, ejecutaron cinco escenarios de prueba diferentes sobre estos errores, que iban desde pruebas unitarias estándar hasta sesiones de fuzzing con límite de tiempo de cinco minutos por error.

Los resultados mostraron que el fuzzing tradicional, que solo busca caídas, era el método menos efectivo, detectando muy pocos errores. En contraste, el enfoque de fuzzing diferencial demostró ser notablemente poderoso. Cuando se le dio un límite de tiempo de cinco minutos para probar cada error, este método identificó y confirmó con éxito el comportamiento de los errores en cinco de las seis funciones, logrando una tasa de éxito de entre el 98 y el 100 por ciento. Para la función en la que inicialmente tuvo dificultades, los investigadores descubrieron que añadir una lista simple de palabras clave esperadas ayudó al sistema a comprender mejor la entrada, permitiéndole alcanzar finalmente una puntuación perfecta también. El estudio también reveló que el tiempo requerido para encontrar estos errores fue sorprendentemente corto; en promedio, el sistema encontró las diferencias en unos 30 segundos, mucho más rápido que los 15 minutos que le toma típicamente a un humano analizar un solo caso manualmente.

Más allá de solo encontrar los errores, los investigadores descubrieron que los datos utilizados durante el proceso de fuzzing poseían un valor oculto. La colección de entradas que la herramienta de fuzzing generó, conocida como corpus semilla, contenía casos de prueba específicos que las pruebas unitarias estándar habían pasado por alto. Estas entradas fueron capaces de "matar" mutantes que las suites de pruebas tradicionales no pudieron detectar. Esto sugiere que los datos ya generados por los equipos de seguridad pueden reutilizarse para fortalecer las suites de pruebas regulares, convirtiendo un subproducto de las pruebas de seguridad en un recurso para la calidad de software general. El estudio también analizó cuánto tiempo tomó encontrar los errores más difíciles de detectar, encontrando que, si bien la mayoría se encontraron rápidamente, algunos requirieron significativamente más tiempo y mostraron un patrón donde la dificultad variaba enormemente, de forma muy similar a cómo algunas tareas toman un poco más de tiempo mientras que otras toman muchísimo tiempo.

Los investigadores concluyeron que el fuzzing diferencial ofrece una forma práctica y agnóstica al lenguaje para apoyar la clasificación de estos errores difíciles. No requiere herramientas complejas nuevas ni configuraciones específicas de lenguaje, ya que simplemente compara el código original contra la versión modificada. Al tratar los errores supervivientes como candidatos para revisión manual en lugar de intentar clasificar cada uno de ellos, el método reduce drásticamente la cantidad de esfuerzo humano necesario. El estudio sugiere que este enfoque puede integrarse en los flujos de trabajo existentes para filtrar eficientemente los errores que son verdaderamente equivalentes, dejando a los expertos humanos enfocarse solo en el pequeño número de casos que permanecen inciertos. Este hallazgo indica que una simple comparación automatizada de los comportamientos del programa puede resolver un problema que durante mucho tiempo se ha considerado demasiado costoso y lento para su adopción industrial generalizada.

¿Ahogado en artículos de tu campo?

Recibe resúmenes diarios de los artículos más novedosos que coincidan con tus palabras clave de investigación — con resúmenes técnicos, en tu idioma.

Probar Digest →