Гайзенбаґ (англ. heisenbug) — дотепний жаргонний термін у програмуванні для баґа, що зникає коли хтось намагається дослідити його.[1] Термін є каламбуром від імені Вернера Гайзенберга, фізика, який першим заявив принцип спостерігача в квантовій механіці, який стверджує, що саме спостереження за системою неминуче змінює її стан.
Приклади
Гайзенбаґи стаються через те, що поширені варіанти зневадження програм, такі як вставлення операцій виведення або виконання у зневаджувачі, зазвичай змінюють код, змінюють адреси змінних у пам'яті і часовий перебіг виконання.
Один з поширених прикладів гайзенбаґа є баґ, який з'являється у програмі, скомпільованій з оптимізацією, але коли програма скомпільована без оптимізації (як це часто роблять з метою вивчення її з допомогою зневаджувача) — все гаразд. Під час зневадження значення, які за умови оптимізації зберігались би в регістрах процесора, часто виштовхуються в загальну пам'ять. Це може зачепити, наприклад, результат порівнянь чисел з рухомою комою, бо значення в пам'яті можуть мати меншу точність і діапазон, ніж значення в регістрі.
Іншими поширеними причинами гайзенбаґа є використання значення неініціалізованої змінної (яка може змінювати свою адресу та/чи початкове значення під час зневадження) або використання нечинного вказівника (який вказує на іншу адресу ніж за умов зневадження). Зазвичай зневаджувачі також надають можливість використання вартових (англ. watches) або інші користувацькі інтерфейси, які спричиняють появу додаткового сирцевого коду (такого як доступ до членів), який виконується крадькома і також може змінити поточний стан програми.
Фактором гайзенбаґа також може бути час, особливо в багатопотокових програмах. Виконання програми в зневаджувачі може змінити перебіг виконання порівняно з нормальним виконанням. Чутливі до часового перебігу баґи, такі як стан гонитви, можуть не виявляти себе, коли програма уповільнена покроковим виконанням у зневаджувачі. Це відбувається частіше у програмах, що взаємодіють із зовнішньою сутністю, яка непідконтрольна зневаджувачу, наприклад коли йдеться про обробку мережевих пакетів і під контролем зневаджувача лише одна з машин.
Див. також
Примітки
- ↑ The Jargon File: heisenbug. Архів оригіналу за 5 вересня 2012. Процитовано 26 вересня 2012.