O caso em que o Malloc quebrou o JPGLoader do Serenity, ou: como ganhar na loteria (2021)
(sin-ack.github.io)-
Por que o
mallocquebrou o JPGLoader do SerenityOS -
Investigação de um bug em que as cores eram exibidas incorretamente ao decodificar imagens JPG no SerenityOS
- Parecia ser uma confusão entre RGB e BGR, mas o problema não foi resolvido mesmo após corrigir o código
-
Rastreamento do problema com
bisect- Começou-se a procurar a causa do problema fazendo
bisectnos 1000 commits mais recentes - O SerenityOS usa sua própria biblioteca padrão, a AK, que é semelhante à STL do C++, mas mais fácil de ler
- Alterações na AK afetam o sistema operacional inteiro, o que torna o tempo de build mais longo
- Começou-se a procurar a causa do problema fazendo
-
Resultado do
bisect- Foi encontrado o commit que causou o problema: o commit que implementou
malloc_good_size() - Esse commit adicionou uma função para otimizar o tamanho das alocações de memória e reduzir o desperdício
- Foi encontrado o commit que causou o problema: o commit que implementou
-
Descoberta surpreendente
- Foi investigada a possibilidade de
HashTableeVectorserem a causa do problema - Após alterar a capacidade da
HashTable, o problema foi resolvido
- Foi investigada a possibilidade de
-
Iteração não determinística de componentes seriais
- O JPGLoader armazena os componentes do arquivo JPG em uma
HashTablee os usa iterativamente - O problema ocorreu porque a ordem dos componentes não era determinística
- O JPGLoader armazena os componentes do arquivo JPG em uma
-
Causa do bug
- Objetos que exigiam ordem foram armazenados em uma
HashTable, usando o iterador padrão - Os valores de hash dos IDs dos componentes, por acaso, ficavam organizados na ordem correta
- Quando o tamanho da
HashTablemudou, a ordem também mudou e o problema apareceu
- Objetos que exigiam ordem foram armazenados em uma
-
Solução
- O JPGLoader foi corrigido para iterar os componentes de forma determinística
- Em vez de
HashTable, foi usada uma estrutura de dados que garante a ordem
-
Considerações finais
- Mesmo um problema simples pode revelar um erro grande
- O problema foi resolvido na raiz para evitar recorrência
-
Agradecimentos
- Agradecimento aos colegas que ajudaram na depuração
- Muito foi aprendido no processo de encontrar e corrigir o bug
Resumo do GN⁺
- Este texto trata do processo de rastrear e corrigir um bug de decodificação de imagens JPG ocorrido no SerenityOS
- O problema foi resolvido ao trocar a ordem não determinística da
HashTablepor uma ordem determinística - O texto mostra bem a importância e a complexidade do processo de depuração de software
- Projetos com funcionalidade semelhante incluem o
libjpegdo Linux
Ainda não há comentários.