Quand `malloc` a cassé le JPGLoader de Serenity, ou : la méthode pour gagner au loto (2021)
(sin-ack.github.io)-
Pourquoi
malloca cassé le JPGLoader de SerenityOS -
En enquêtant sur un bug d’affichage incorrect des couleurs lors du décodage d’images JPG dans SerenityOS
- Cela semblait être une confusion entre RGB et BGR, mais le problème persistait même après correction du code
-
Remonter à la source avec le bisecting
- Les 1000 derniers commits ont été passés au bisecting pour commencer à identifier la cause du problème
- SerenityOS utilise sa propre bibliothèque standard, AK, similaire à la STL de C++ mais plus lisible
- Les changements dans AK affectent tout le système d’exploitation, ce qui allonge le temps de compilation
-
Résultat du bisect
- Le commit à l’origine du problème a été identifié : celui qui implémentait
malloc_good_size() - Ce commit ajoutait une fonctionnalité optimisant la taille des allocations mémoire afin de réduire le gaspillage
- Le commit à l’origine du problème a été identifié : celui qui implémentait
-
Découverte surprenante
- L’hypothèse d’un problème lié à
HashTableetVectora été examinée - Après modification de la capacité de
HashTable, le problème a disparu
- L’hypothèse d’un problème lié à
-
Itération non déterministe sur les composants série
- JPGLoader stocke les composants d’un fichier JPG dans une
HashTableet les réutilise par itération - L’ordre des composants n’étant pas déterministe, cela provoquait le problème
- JPGLoader stocke les composants d’un fichier JPG dans une
-
Cause du bug
- Des objets nécessitant un ordre précis étaient stockés dans une
HashTable, puis parcourus avec l’itérateur par défaut - Les valeurs de hachage des identifiants de composants se retrouvaient par hasard dans le bon ordre
- Quand la taille de la
HashTablea changé, l’ordre a changé lui aussi, ce qui a déclenché le problème
- Des objets nécessitant un ordre précis étaient stockés dans une
-
Solution
- JPGLoader a été modifié pour itérer sur les composants de manière déterministe
- Une structure de données garantissant l’ordre a été utilisée à la place de
HashTable
-
Réflexions finales
- Même un problème simple peut révéler une erreur importante
- Le problème a été corrigé à la racine pour éviter toute réapparition
-
Remerciements
- Merci aux collègues qui ont aidé au débogage
- Le processus de découverte et de correction du bug a permis d’apprendre beaucoup
Le récapitulatif de GN⁺
- Cet article retrace l’enquête et la résolution d’un bug de décodage d’images JPG dans SerenityOS
- Le problème, causé par l’ordre non déterministe d’une
HashTable, a été résolu en imposant un ordre déterministe - L’article montre bien l’importance et la complexité du processus de débogage logiciel
- Parmi les projets aux fonctionnalités similaires, on peut citer
libjpegsur Linux
Aucun commentaire pour le moment.