Heisenbug

Ο όρος Heisenbug είναι όρος της «αργκό» του κλάδου της  Πληροφορικής και χρησιμοποιείται για τον προσδιορισμό της ύπαρξης ενός σφάλματος λογισμικού που φαίνεται να εξαφανίζεται ή να τροποποιεί τη συμπεριφορά του όταν κάποιος προσπαθεί να το εντοπίσει. Ο όρος είναι ένα λογοπαίγνιο τον όρο «bug» (σφάλμα) και το όνομα του Βέρνερ Χάιζενμπεργκ, του φυσικού που υποστήριξε για πρώτη φορά στην κβαντομηχανική, την επίδραση του παρατηρητή, δηλώνοντας ότι η παρατήρηση ενός συστήματος αναπόφευκτα μεταβάλλει την κατάσταση του.
Παρόμοιοι όροι, όπως «bohrbug», «mandelbug», και «schrödinbug» έχουν κατά καιρούς χρησιμοποιηθεί για άλλα είδη ασυνήθιστων σφαλμάτων λογισμικού. 
Ωστόσο, σε αντίθεση με το «heisenbug», οι υπόλοιποι όροι δεν είναι ευρέως γνωστοί.

Παραδείγματα

Τα «heisenbugs» εμφανίζονται επειδή οι κοινές προσπάθειες για εντοπισμό σφαλμάτων σε ένα πρόγραμμα υπολογιστή, όπως η εισαγωγή ειδικών δεδομένων ή η εκτέλεση (λογισμικό) σε αποσφαλματωτές, συνήθως τροποποιούν τον κώδικα, αλλάζοντας τις διευθύνσεις μνήμης των μεταβλητών κατά τη διάρκεια εκτέλεσής του.
Κοινό παράδειγμα ενός σφάλματος «heisenbug» είναι το σφάλμα που εμφανίζεται όταν το πρόγραμμα μεταγλωττιστεί με έναν μεταγλωττιστή βελτιστοποίησης (ή με παραμέτρους βελτιστοποίησης), αλλά όχι όταν το ίδιο πρόγραμμα μεταγλωττίζεται χωρίς βελτιστοποίηση (όπως γίνεται συχνά κατά την αποσφαλμάτωση). Η διαδικασία αποσφαλμάτωσης, εκτιμά ότι ένα βελτιστοποιημένο πρόγραμμα θα κρατήσει κανονικά κάποιες τιμές στους τους καταχωρητές του επεξεργαστή, αλλά συχνά αυτοί ωθούνται στην κύρια μνήμη. Αυτό μπορεί να επηρεάσει, για παράδειγμα, το αποτέλεσμα πράξεων ή συγκρίσεων μεταξύ αριθμών κινητής υποδιαστολής, καθώς η καταχώρηση της τιμής στη μνήμη μπορεί να έχει μικρότερο εύρος ή ακρίβεια από την τιμή του καταχωρητή. Επίσης, σφάλματα «heisenbug» μπορεί να εμφανιστούν από παρενέργειες σε εκφράσεις ελέγχου που χρησιμοποιήθηκαν κατά τη διάρκεια εκτέλεσης εκφράσεων-δηλώσεων assertions σε γλώσσες όπως η C και η C ++, καθώς η έκφραση ελέγχου δεν εκτελείται όταν οι δηλώσεις της γλώσσας (assertions) απενεργοποιηθούν στον παραχθέντα κώδικα χρησιμοποιώντας τη μακροεντολή   NDEBUG .
Άλλες συνηθισμένες αιτίες ύπαρξης σφαλμάτων «heisenbugs» είναι η χρήση μη-αρχικοποιημένων μεταβλητών μέσα στο πρόγραμμα (πρακτική που αλλάζει τη διεύθυνση ή/και την αρχική τιμή κατά τη διάρκεια της αποσφαλμάτωσης), ή η παρακολούθηση δεικτών  που μπορεί να δείχνουν σε διαφορετικά σημεία, κατά τη διάρκεια αποσφαλμάτωσης. Oι debuggers συνήθως παρέχουν σημεία διακοπής (breakpoints) ή άλλες διεπαφές χρήστη που προκαλούν εκτέλεση πρόσθετου κώδικα που μπορεί να εκτελεστεί στο παρασκήνιο, και δύναται  να αλλάξει την κατάσταση του προγράμματος.
Ο χρόνος μπορεί επίσης να είναι ένας παράγοντας ύπαρξης σφαλμάτων «heisenbugs», ιδιαίτερα σε εφαρμογές που χρησιμοποιούν περισσότερα από ένα νήμα. Κατά τη διάρκεια της αποσφαλμάτωσης μπορεί να αλλάζει το χρονοδιάγραμμα εκτέλεσης σημείων του προγράμματος σε σύγκριση με την κανονική εκτέλεση. Σφάλματα ευαίσθητα στο χρόνο μπορεί να μη συμβούν όταν το πρόγραμμα επιβραδύνεται κατά την εκτέλεση «βήμα-βήμα» των γραμμών  του κώδικα. Αυτό ισχύει ιδιαίτερα όταν η συμπεριφορά περιλαμβάνει την αλληλεπίδραση με μια οντότητα που δεν βρίσκεται υπό τον έλεγχο του αποσφαλματωτή, όπως για παράδειγμα όταν γίνεται αποσφαλμάτωση δικτύων επεξεργασίας πακέτων μεταξύ δύο μηχανημάτων και μόνο το ένα είναι υπό τον έλεγχο του αποσφαλματωτή.
Τα σφάλματα «heisenbug» μπορούν να θεωρηθούν αποτέλεσμα της επίδρασης του παρατηρητή στον τομέα της τεχνολογίας πληροφοριών.

Σχετικοί Όροι

Το «bohrbug», αντίθετα με το «heisenbug», είναι ένα συνηθισμένο σφάλμα. Όπως και το ντετερμινιστικό ατομικό πρότυπο του Μπορ, βάσει του οποίου τα άτομα δεν αλλάζουν τη συμπεριφορά τους και είναι σχετικά εύκολο να εντοπιστούν.
Το «mandelbug» (λογοπαίγνιο με το όνομα του Μπενουά Μάντελμπροτ) είναι ένα σφάλμα του οποίου τα αίτια είναι υπερβολικά, πολύπλοκα που αψηφούν την επισκευή, ή η συμπεριφορά του φαίνεται χαοτική ή ακόμα και μη-ντετερμινιστική.
Το «schrödinbug» (λογοπαίγνιο με το όνομα του Έρβιν Σρέντινγκερ και τη γάτα του) είναι ένα σφάλμα που εκδηλώνεται με τη λειτουργία του λογισμικού αφού ο προγραμματιστής συμπεράνει ότι ο κώδικας θα ήταν αδύνατο να δουλέψει.
Ένα «hindenbug»  (λογοπαίγνιο με το όνομα του Hindenburg disaster) είναι ένα σφάλμα με καταστροφική συμπεριφορά.

Ιστορία του όρου

Ο όρος χρησιμοποιήθηκε πρώτη φορά από τον Jim Gray, σε μια επιστημονική δημοσίευση πάνω στις βλάβες λογισμικού καθώς επίσης το 1986 από τους Jonathan Clark και Zhahai Stewart στην mailing list (later Usenet news group) comp.risks.
Ο Bruce Lindsay, ερευνητής της IBM, επιβεβαίωσε σε μια συνέντευξη το 2004 ACM Queue ότι ήταν παρών όταν ο όρος «heisenbug» ορίστηκε αρχικά.
Μια προγενέστερη αναφορά του έγινε στο ACM το 1983.