El caso de cómo `malloc` rompió el JPGLoader de Serenity, o: cómo ganar la lotería (2021)
(sin-ack.github.io)-
Por qué
mallocrompió el JPGLoader de SerenityOS -
Se investigó un bug en el que los colores se mostraban incorrectamente al decodificar imágenes JPG en SerenityOS
- Parecía una confusión entre RGB y BGR, pero el problema no se resolvió incluso después de corregir el código
-
Rastreando el problema con bisecting
- Se comenzó a buscar la causa del problema haciendo bisecting sobre los 1000 commits más recientes
- SerenityOS usa su propia biblioteca estándar, AK, que es similar al STL de C++ pero más fácil de leer
- Los cambios en AK afectan a todo el sistema operativo, por lo que el tiempo de compilación es largo
-
Resultado del bisect
- Se encontró el commit que causaba el problema: el commit que implementó
malloc_good_size() - Este commit agregó una función para optimizar el tamaño de asignación de memoria y reducir el desperdicio de memoria
- Se encontró el commit que causaba el problema: el commit que implementó
-
Un descubrimiento sorprendente
- Se investigó si
HashTableyVectorpodían ser la causa del problema - Después de cambiar la capacidad de
HashTable, el problema se resolvió
- Se investigó si
-
Iteración no determinista de componentes seriales
- JPGLoader guarda los componentes del archivo JPG en un
HashTabley los usa de forma iterativa - El orden de los componentes no era determinista, lo que provocaba el problema
- JPGLoader guarda los componentes del archivo JPG en un
-
La causa del bug
- Se almacenaron en
HashTableobjetos que requerían orden y se usó el iterador predeterminado - Los valores hash de los IDs de los componentes, por casualidad, quedaban alineados en el orden correcto
- Al cambiar el tamaño de
HashTable, el orden cambió y entonces apareció el problema
- Se almacenaron en
-
La solución
- Se modificó JPGLoader para iterar sobre los componentes de forma determinista
- Se usó una estructura de datos que garantiza el orden en lugar de
HashTable
-
Reflexión final
- Incluso un problema simple puede revelar un gran error
- Se resolvió el problema de raíz para evitar que vuelva a ocurrir
-
Agradecimientos
- Se agradece a los colegas que ayudaron con la depuración
- Se aprendió mucho durante el proceso de encontrar y resolver el bug
Resumen de GN⁺
- Este artículo trata sobre el proceso de rastrear y resolver un bug de decodificación de imágenes JPG ocurrido en SerenityOS
- El problema, causado por el orden no determinista de
HashTable, se resolvió cambiándolo por un orden determinista - El texto muestra muy bien la importancia y la complejidad del proceso de depuración de software
- Un proyecto con funcionalidad similar es
libjpegde Linux, entre otros
Aún no hay comentarios.