segunda-feira, outubro 15, 2007

Excel 2007: Explicação para o bug

Embora a Microsoft não pretenda dar mais detalhes sobre o bug, uma explicação extremamente detalhada pode ser encontrada em

http://www.lomont.org/Math/Papers/2007/Excel2007/Excel2007Bug.pdf

Chris Lomont se deu ao trabalho de debugar o Excel, achar a rotina com problema, comparar com a mesma rotina nas versões anteriores e explicar o que aconteceu.

De forma resumida, por motivos de desempenho o Excel possui uma rotina de conversão de ponto flutuante para texto escrita em Assembler. Esta rotina estava escrita no velho assembler de 16 bits e no Excel 2007 foi convertida para usar as instruções e registradores de 32 bits. Neste ponto foram introduzidos dois erros. No caso do cálculo 850 * 77,1 em um determinado momento a rotina anterior possuiu o valor 0xFFFF no registrador AX, o incrementava, resultando em zero, o que causava um desvio. Nos 32 bits, o valor 0x0000FFFF em EAX vira 0x00010000 que não é zero e portanto a execução segue pelo caminho errado. O outro erro é algo parecido mas em outro trecho do código.

Esta análise parece vir de encontro com o que eu tinha chutado no meu post original (será um exemplo de psychic debugging?) : um ponto onde o algorítimo precisa selecionar entre dois caminhos E ocorre um overflow (no meu post eu coloquei ou...). Portanto meu veredito é que ocorreu falha no teste unitário da rotina, que não exercitou corretamente este ponto de decisão.

Nenhum comentário: