Цікаві факти

10 найгірших помилок в програмуванні в історії людства

10 найгірших помилок в програмуванні в історії людства


Якщо баги в програмному забезпеченні призводять до зависання комп'ютера, то це нісенітниця. Набагато гірше, якщо з-за помилок в ПЗ ламаються автомобілі, вибухають ракети і гинуть люди.


Сама перший комп'ютерний баг в історії був виявлений в 1945 р., коли інженери знайшли в корпусі комп'ютера Harvard Mark II метелика. Цей метелик закорачивал контакти - і комп'ютер збоїв. Інженери зробили запис в журналі подій «Перший випадок виявлення бага» (по-англійськи «bug» означає «комаха»). З тих пір комп'ютерні збої прийнято називати багами.


По мірі розповсюдження цифрових пристроїв баги все глибше проникають в наше життя. Вони оточують нас всюди - на мобільних телефонах, у побутовій техніці, в автомобілях. На щастя, зазвичай баги не приносять ніякої шкоди, крім моральної. Але буває і по-іншому, коли баг викликає величезні фінансові втрати і навіть забирає людські життя. Журнал Wired присвятив цій проблемі цілу тему номери і опублікував список 10 найгірших багів в історії людства, у хронологічному порядку.


28 липня 1962 р. Космічний апарат Mariner I стартував у напрямку до Венері. З-за поломки антени корабель втратив зв'язок із земними службами управліннями і перейшов на власну систему пілотування. Але ця система містила прикрий маленький баг. В результаті апарат полетів зовсім не в ту сторону і його довелося підірвати над Атлантичним океаном. Подальше розслідування встановило, що в процесі програмування системи навігації була здійснена маленька помилка при введенні однією з формул був пропущений один символ.


1982 р. Аварія на Транссибірський трубопроводі. Оперативники ЦРУ впровадили баг (звіт у форматі PDF) в канадське програмне забезпечення, яка управляла газовими трубопроводами. Радянська розвідка отримала це як об'єкт промислового шпигунства і впровадила на Транссибірському трубопроводі. Результатом став найбільший неядерний вибух в історії людства.


1985-87 рр. Кілька людей отримали смертельну дозу опромінення під час сеансів радіаційної терапії з медичним прискорювачем Therac-25. Заснована на попередній версії прискорювача, «поліпшена» модель Therac-25 могла генерувати два види випромінювання: слабке електронний бета-випромінювання і нормальне рентгенівське випромінювання. Ще одне «покращення» полягало в тому, що замість електромеханічної захисту пацієнта в пристрої була реалізована програмна захист, нібито більш надійна. Обидві нові функції були некоректно реалізовані недосвідченим програмістом, результатом чого стали як мінімум п'ять смертей і величезна кількість несмертельних випадків переопромінення.


1988 р. Переповнення буфера в Berkeley Unix. Перший у світі комп'ютерний черв'як (так званий хробак Морріса) заразив від 2000 до 6000 комп'ютерів менш ніж за добу, експлуатуючи уразливість в реалізації функції gets(). В ОС Berkeley Unix ця функція вводу/виводу не мала обмеження на максимальну довжину.


1988-96 рр. Генератор випадкових чисел Kerberos протягом кількох років широко використовувався в різних системах шифрування. Передбачалося, що програма повинна вибирати ключ випадковим чином з багатьох мільярдів чисел, але генератор випадкових чисел вибирав з набагато меншого набору чисельністю приблизно в мільйон. Як результат, протягом восьми років будь-який користувач міг без праці проникнути в комп'ютерну систему, яка використовувала модуль Kerberos.


15 січня 1990 р. Падіння телефонної мережі AT&T. Помилка в новій версії прошивки міжміських комутаторів призвела до того, що комутатор перезавантажувався, якщо отримував специфічний сигнал від сусіднього комутатора. Але біда в тому, що цей сигнал генерувався в той момент, коли комутатор відновлював свою роботу після збою. В один прекрасний день, коли якийсь комутатор в Нью-Йорку перезавантажився, він подав той самий злощасний сигнал - і почалося. Незабаром 114 сусідніх комутаторів безперервно перезагружались кожні 6 секунд, а 60 тис. людей залишилися без міжміського зв'язку на 9 годин, поки інженери не встановили на комутатори попередню версію прошивки.


1993 р. Широко розрекламований процесор Intel Pentium неправильно виробляв ділення з плаваючою комою, помиляючись на 0006%. Хоча ця проблема реально торкнулася всіх користувачів, але стала справжнім кошмаром для іміджу Intel. Спочатку фірма погодилася міняти процесор тільки для тих користувачів, які могли довести, що їм в обчисленнях потрібна така точність, але потім погодилася поміняти процесор всім бажаючим. Цей баг коштував Intel близько $475 млн.


1995-96 рр. Пінг смерті. Відсутність перевірки на помилки при обробці IP-пакетів дозволяла зруйнувати практично будь-яку операційну систему, відправивши їй через інтернет спеціальний пакет («пінг»).


4 червня 1996 р. Нова ракета-носій Ariane 5 результат багаторічної роботи європейських вчених, гордість країн Євросоюзу, вибухнула через 40 секунд після свого першого старту. Тільки наукове обладнання на борту ракети коштувало близько $500 млн, не кажучи про безліч побічних фінансових наслідків. Система автоподрыва ракети спрацювала після зупинки обох процесорів в результаті ланцюжка помилок. Початком цього ланцюжка послужило переповнення буфера, оскільки система навігації подала неприпустимо велике значення параметра горизонтальної швидкості. Справа в тому, що система управління Ariane 5 перероблялася з Ariane 4 а там такого великого значення не могло бути теоретично. В цілях зниження навантаження на робочий комп'ютер інженери зняли захист від помилок переповнення буфера в цьому програмному модулі, оскільки були впевнені, що такого значення горизонтальної швидкості не може бути в принципі - і прорахувалися.


Листопад 2000 р. Національний інститут раку, Панама. Тут відбулася ціла серія інцидентів, викликана тим, що для планування радіаційної терапії виробництва американської компанії Multіdata Systems International неправильно розраховувало дози опромінення для пацієнтів. Програма дозволяла лікаря намалювати на комп'ютерному екрані розташування захисних металевих щитів, які захищають тіло від радіації. Але програма дозволяла маніпулювати тільки чотирма щитами, тоді як лікарі хотіли задіяти п'ять. Вони знайшли спосіб «обдурити» програму, якщо намалювати всі п'ять щитів у вигляді єдиного блоку з діркою посередині. Єдине, чого вони не знали, що програма розраховує різні дози радіації в залежності від того, як намальована дірка. Якщо малювати її особливим чином, то пристрій видавало подвійну дозу радіації. Щонайменше вісім людей загинули, а ще 20 отримали переоблучение. Лікарі, які повинні були вручну перевіряти розрахунки програми, були засуджені за вбивство.


Всі ці приклади, а особливо останній, ще раз показують, що ніколи не можна повною мірою довіряти комп'ютерів. Адже програми для комп'ютерів створюють люди, а людям властиво помилятися.