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.[1] 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,[2] 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,[3][4][5] e schrödinbug.[6][7]
Esempi
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]Il termine appare nelle pubblicazioni della ACM dal 1983.[8] È stato usato nel 1985 da Jim Gray in un articolo sui software failures[9] (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).[10]
Termini correlati
[modifica | modifica wikitesto]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.[11][12]
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.[13]
Un hindenbug[14] (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.
Note
[modifica | modifica wikitesto]- ^ The Jargon File: heisenbug, su catb.org.
- ^ CATB.org, "phase of the moon"
- ^ The Jargon File: Mandelbug, su catb.org. URL consultato il 5 settembre 2013.
- ^ Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
- ^ Clarke, Arthur C., The Ghost from the Grand Banks, Bantam Books, 1990
- ^ The Jargon File: Schroedinbug, su catb.org. URL consultato il 5 settembre 2013.
- ^ Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
- ^ Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium on High-Level Debugging, Pacific Grove, California, March 20–23, 1983, Association for Computing Machinery, 1983, Google Books search:
«This is the Heisenberg Uncertainty Principle as applied to debugging (an instance of such a bug was called a "Heisenbug" by one participant.)»
Also cited in LeBlanc, Richard J.; Robbins, Arnold D.; Event-Driven Monitoring of Distributed Programs, in Proceedings of the IEEE 5th International Conference on Distributed Computing Systems (ICDCS), IEEE Computer Society, Computer Society Press, 1985, pp. 515-522 Google Books search:
«This the Heisenberg Uncertainty Principle as applied to Debugging, sometimes called the "Heisenbug" Principle [ACM83].»
- ^ Jim Gray, Why Do Computers Stop And What Can Be Done About It?, su Technical Report 85.7, Tandem Computers, 1985.
- ^ (16 December 1986) RISKS DIGEST 4.30 - (23 December 1986) RISKS DIGEST 4.34, moderated by Peter G. Neumann
- ^ Goshgarian, Gary; Exploring Language, HarperCollins College Publishers, 1995
- ^ "Such transient software failures have been given the whimsical name “Heisenbug” because they disappear when reexamined. By contrast, “Bohrbugs” are good solid bugs." (IEEE Computer Group News, Volume 24, Numbers 7–12, 1991)
- ^ schroedinbug, su catb.org.
- ^ Hinden Bug, su c2.com.
Collegamenti esterni
[modifica | modifica wikitesto]- The Heisenberg Debugging Technology, su sourceware.org.
- A Story About Magic, su ftp.sunet.se. URL consultato il 27 novembre 2014 (archiviato dall'url originale il 16 dicembre 2010).