# Heisenbug

Nel gergo della programmazione, un heisenbug è un bug che sembra scomparire o si comporta in maniera differente quando si tenta di studiarlo e farne il debug. Il termine è un calembour del cognome di Werner Heisenberg, fisico formulatore del principio di indeterminazione di Heisenberg. Secondo tale principio, riferito alla meccanica quantistica, lo stesso fatto di osservare un fenomeno altera in qualche misura il fenomeno stesso. Per la risoluzione degli heisenbug è necessario un debug molto accorto, magari con l'analisi dei dump dei processi e dei log di lint o di altri software analoghi.
I programmatori possono riferirsi ironicamente agli heisenbug sostenendo che il comportamento del programma dipenda dalla fase lunare, o, nel caso il comportamento sia stato osservato una sola volta, sia stato causato da fenomeni improbabili, come l'azione dei raggi cosmici sull'hardware.
Termini correlati per riferirsi ad altri tipi di bug particolari sono bohrbug, mandelbug, e schrödinbug.

## Esempi

Un heisenbug è dovuto al fatto che le tecniche di debug comportano la modifica in qualche misura del codice sorgente, o l'alterazione dello stato del sistema a runtime, ad esempio l'indirizzamento delle variabili o i tempi di esecuzione. Per tale motivo, se un bug dipende da tali fattori il suo comportamento può essere alterato dai tentativi stessi di debug.
Un heisenbug può manifestarsi quando il programma è compilato con direttive di ottimizzazione, ma lo stesso comportamento può non verificarsi quando, lo stesso codice, viene compilato senza ottimizzazione (ad esempio, quando viene compilato per l'analisi con un debugger). In fase di debug le variabili che permangono nei registri vengono spesso invece tenute in memoria, e questo può influenzare il risultato delle operazioni in virgola mobile, in quanto i valori in memoria possono avere accuratezza differente rispetto a quelli nei registri. Un heisenbug può essere inoltre dovuto ai side-effect di espressioni usate nelle asserzioni eseguite a runtime a scopo di test (ad esempio con la libreria assert.h del C), che si manifestano o scompaiono quando le asserzioni vengono disabilitate.
Un heisenbug può essere anche causato da un fattore temporale, particolarmente nel caso di applicazioni multithread. L'esecuzione del programma sotto il controllo del debugger altera la tempistica di esecuzione e il parallelismo, mascherando ad esempio alcuni casi di race condition, o creando problemi quando il programma interagisce con entità che non sono sotto il controllo del debugger, ad esempio quando opera su pacchetti trasmessi in rete da altre macchine.

## Storia del termine

Il termine appare nelle pubblicazioni della ACM dal 1983. È stato usato nel 1985 da Jim Gray in un articolo sui software failures (al punto che talvolta la sua introduzione gli viene erroneamente attribuita) e nel 1986 da Jonathan Clark e Zhahai Stewart nella mailing list comp.risks (successivamente divenuta un newsgroup Usenet).

## Termini correlati

In opposizione al heisenbug, un bug "solido", che non cambia il proprio comportamento, viene detto bohrbug, perché è deterministico come il modello atomico formulato da Bohr.
Un mandelbug (dal cognome di Benoît Mandelbrot, matematico celebre per il suo studio dei frattali) è un bug talmente complesso che non si riesce a trovare un modo di eliminarlo, o il cui effetto appare caotico e sembra non deterministico.
Uno schrödinbug (da Erwin Schrödinger, in riferimento al noto paradosso da lui formulato) è un bug che non si manifesta fino a quando qualcuno non usa il programma in maniera inusuale o controlla il codice e scopre che il programma non avrebbe mai dovuto funzionare.
Un hindenbug (dal nome del dirigibile LZ 129 Hindenburg, distrutto in fase di atterraggio a seguito di un grave incidente) è un bug le cui conseguenze sono particolarmente gravi.