Profesor(es)
Guillermo Andrés Polito
Turno
Turno Tarde (13:30 a 16:30)
Cupo
50
Idioma
Español.
Descripción

El testing de compiladores es hoy en día un área crítica para el desarrollo de software profesional, dada la complejidad y constante evolución de los lenguajes de programación. El testing automático debe validar la interrelación entre nuevos lenguajes, nuevas representaciones intermedias de código, nuevas fases de optimización y transformación. Dentro del área de testing automatizado de compiladores, las técnicas de fuzzing proponen la creación automática de forma más o menos aleatoria, de valores de input para testear un programa.
Este curso presenta técnicas maduras de testing automático de compiladores. El curso se basa en tres ejes. En una primera parte, el curso presenta buenas prácticas de testing automatizado, aplicables no solo a compiladores. En una segunda parte, el curso estudia técnicas para generar automáticamente inputs para compiladores, y cómo guiarlos para testear distintas partes de un compilador. En tercer lugar, el curso presenta el problema del oráculo de testing y cómo este problema se instancia en el caso de los compiladores. En cada uno de esos ejes se estudian técnicas del estado del arte, acompañados de casos de estudio y artículos de investigación que ilustran los distintos casos.
El curso es teórico y práctico. La práctica tiene como objetivo la implementación de fuzzers automáticos y ponerlos en práctica para testear lenguajes de programación.

Programa del curso

Testing automatizado. Buenas prácticas y metodologías de testing. Generación automática de datos de testing con fuzzing. Fuzzing aleatorio y guiado. Fuzzing guiado por gramáticas. Fuzzing concólico. Fuzzing como mutación de inputs existentes. Mutaciones guiadas por la cobertura de código. Oráculos de test y su automatización. Programas auto-validados. Testing basado en propiedades. Testing diferencial. Testing metamórfico. Testing de compiladores. Generación de programas y variación de programas existentes. Testing de subcomponentes de compilador. Testing entre compiladores.

Requisitos del curso

Se sugiere:
Conocimientos de medios de programación para la parte teórica.
Es deseable, pero no bloqueante, conocimiento de sintaxis y gramática de los lenguajes de programación.
La parte práctica de este curso requiere experiencia en programación.
Es deseable el conocimiento de lenguajes de alto nivel como Python o Smalltalk (e.g., Pharo).

Bibliografía

A. Zeller, R. Gopinath, M. Böhme, G. Fraser and C. Holler. (2021). The Fuzzing Book. CISPA Helmholtz Center for Information Security. https://www.fuzzingbook.org/.
Barr, E. T., Harman, M., McMinn, P., Shahbaz, M., & Yoo, S. (2014). The oracle problem in software testing: A survey. IEEE transactions on software engineering, 41(5), 507-525.
Claessen, K., & Hughes, J. (2000, September). QuickCheck: a lightweight tool for random testing of Haskell programs. In Proceedings of the fifth ACM SIGPLAN international
conference on Functional programming (pp. 268-279).

Polito, G., Tesone, P., Ducasse, S., Fabresse, L., Rogliano, T., Misse-Chanabier, P., & Hernandez Phillips, C. (2021, September). Cross-ISA testing of the Pharo VM: lessons
learned while porting to ARMv8. In Proceedings of the 18th ACM SIGPLAN International Conference on Managed Programming Languages and Runtimes (pp. 16-25).

Polito, G., Ducasse, S., & Tesone, P. (2022, June). Interpreter-guided differential JIT compiler unit testing. In Proceedings of the 43rd ACM SIGPLAN International Conference on
Programming Language Design and Implementation (pp. 981-992).

Nagy, S., & Hicks, M. (2019, May). Full-speed fuzzing: Reducing fuzzing overhead through coverage-guided tracing. In 2019 IEEE Symposium on Security and Privacy (SP) (pp.
787-802). IEEE.