# Heisenbug

No jargão da programação de computadores, heisenbug é um bug de software que parece desaparecer ou alterar seu comportamento quando se tenta estudá-lo. O termo é um trocadilho com o nome de Werner Heisenberg, o físico que primeiro afirmou o efeito observador da mecânica quântica, que afirma que o ato de observar um sistema altera inevitavelmente seu estado. Em eletrônica, o termo tradicional é efeito de prova, em que anexar uma ponta de prova a um dispositivo muda seu comportamento.
Termos semelhantes, como bohrbug, mandelbug, hindenbug e schrödinbug (consulte a seção sobre termos relacionados) foram ocasionalmente propostos para outros tipos de bugs de software incomuns, às vezes em tom de humor; no entanto, ao contrário do termo heisenbug, eles não são amplamente conhecidos ou usados.

## Exemplos

Heisenbugs ocorrem porque tentativas comuns de depurar um programa, como inserir instruções de saída ou executá-lo com um depurador, geralmente têm o efeito colateral de alterar o comportamento do programa de maneiras sutis, como alterar os endereços de memória de variáveis e o tempo de sua execução.
Um exemplo comum de heisenbug é um bug que aparece quando o programa é compilado com um compilador com suporte a otimização, mas não quando o mesmo programa é compilado sem otimização (como geralmente é feito com o propósito de examiná-lo com um depurador). Durante a depuração, os valores que um programa otimizado normalmente manteria nos registros são frequentemente colocados na memória principal. Isso pode afetar, por exemplo, o resultado de comparações de ponto flutuante, uma vez que o valor na memória pode ter alcance e precisão menores do que o valor no registrador. Da mesma forma, Heisenbugs podem ser causados por efeitos colaterais em expressões de teste usadas em asserções de tempo de execução em linguagens como C e C++, onde a expressão de teste não é avaliada quando as asserções são desativadas no código de produção usando a macro NDEBUG .
Outras causas comuns de heisenbugs são usar o valor de uma variável não inicializada (que pode mudar seu endereço ou valor inicial durante a depuração) ou seguir um ponteiro inválido (que pode apontar para um local diferente durante a depuração). Os depuradores geralmente permitem o uso de breakpoints ou fornecem outras interfaces de usuário que fazem com que o código-fonte adicional (como acessadores de propriedade) seja executado furtivamente, o que pode, por sua vez, alterar o estado do programa.
O tempo também pode ser um fator em heisenbugs, particularmente com aplicativos multi-thread. A execução de um programa sob controle de um depurador pode alterar o tempo de execução do programa em comparação com a execução normal. Erros sensíveis ao tempo, como condições de corrida, podem não ocorrer quando o programa é retardado por linhas de origem de passo único no depurador. Isso é particularmente verdadeiro quando o comportamento envolve interação com uma entidade que não está sob o controle de um depurador, como ao depurar o processamento de pacotes de rede entre duas máquinas e apenas uma está sob o controle do depurador.
Heisenbugs podem ser vistos como exemplos do efeito do observador na tecnologia da informação . Programadores frustrados podem culpar humoristicamente um heisenbug às fases da lua, ou (se ocorreu apenas uma vez) podem explicar como um erro leve devido a partículas alfa ou raios cósmicos afetando o hardware.

## Termos relacionados

Um bohrbug, por oposição, é um "bug bom e sólido". Como o modelo de átomo de Bohr determinístico, eles não mudam seu comportamento e são detectados com relativa facilidade.
Um mandelbug (batizado em homenagem ao fractal de Benoît Mandelbrot) é um bug cujas causas são tão complexas que não podem ser reparadas ou fazem seu comportamento parecer caótico ou mesmo não determinístico. O termo também se refere a um bug que exibe um comportamento fractal (ou seja, auto-similaridade), revelando mais bugs (quanto mais fundo um desenvolvedor vai no código para corrigi-lo, mais bugs ele encontra).
Um schrödinbug ou schroedinbug (nomeado em homenagem a Erwin Schrödinger e seu experimento de pensamento) é um bug que se manifesta na execução de software depois que um programador percebe que o código nunca deveria ter funcionado.
Um hindenbug (nomeado após o desastre de Hindenburg) é um bug com comportamento catastrófico.
Um higgs-bugson (nomeado após a partícula do bóson de Higgs) é um bug que deve existir com base em outras condições observadas (mais comumente, entradas de log vagamente relacionadas e relatórios de usuários anedóticos), mas é difícil, senão impossível, para reproduzir artificialmente em um ambiente de desenvolvimento ou teste. O termo também pode se referir a um bug que é óbvio no código (matematicamente comprovado), mas que não pode ser visto em execução (ainda que difícil ou impossível de realmente encontrar).

## História do termo

O termo também foi usado em 1985 por Jim Gray, em um artigo sobre falhas de software (e às vezes é erroneamente atribuído a ele por causa desta publicação) e também em 1986 por Jonathan Clark e Zhahai Stewart na lista de discussão (posteriormente Usenet grupo de notícias) comp.risks .
Bruce Lindsay, pesquisador da IBM, afirmou em uma entrevista da ACM Queue em 2004 que estava presente quando o Heisenbug foi originalmente definido.
Uma aparição anterior nas publicações da ACM é de 1983.

## Resolução

Heisenbugs são difíceis de identificar e corrigir; muitas vezes, a tentativa de resolvê-los leva a mais comportamentos inesperados. Como o problema se manifesta como resultado de um bug de base separado, o comportamento pode ser difícil de prever e analisar durante a depuração. No geral, o número de heisenbugs identificados deve diminuir à medida que um software amadurece.