Об опасности ошибок в программировании

Что такое ошибка? По версии Википедии: непреднамеренное отклонение от правильных действий, поступков, мыслей; разница между ожидаемой или измеренной и реальной величиной. Каждый день мы совершаем ошибки. Одни доставляют неудобства только нам, другие же влекут за собой более серьезные последствия. В этой статье представлены факты об ошибках в программировании, которых можно было бы избежать, если бы проверка кода происходила более корректно.


О человеческом факторе


Человеческий мозг - область до конца неизученная. Много книг и статей написано на тему исследований его возможностей, но большинство ученых сходятся в одном - мы далеко не на 100% используем свои возможности. Человек - это не только интеллект, логика, эрудиция, это также чувства, эмоции, воспитание. Даже самый высококвалифицированный специалист с показателем IQ выше 140 (средний уровень 100-120) может устать, расстроиться или банально проявить невнимательность. Результатом такого стечения обстоятельств может стать ошибка.


Программисты - люди педантичные, увлеченные и, безусловно, очень умные. Но при написании кода на C/C++ и других языках они допускают ошибки. Многие из этих ошибок находятся благодаря -Wall, ассертам, тестам, дотошному code review, предупреждениям со стороны IDE, сборкой проекта разными компиляторами под разные ОС, работающие на разном железе, и так далее. Но даже при использовании всех этих мер ошибки часто остаются незамеченными.


Человек, далекий от программирования, может подумать: нет ничего критичного в ошибке! Страшна ошибка хирурга во время операции, а неправильно проставленный символ в коде - лишь недоразумение. И он будет категорически не прав. Но чтобы вы смогли прочувствовать важность отсутствия ошибок в коде, я приведу вам конкретные примеры.


Про деньги


4 июня 1996 года четыре полуторатонных спутника научной программы Cluster (изучение взаимодействия солнечного излучения с магнитным полем Земли) и европейская одноразовая ракета носитель Ariane 5, используемая для вывода на околоземную орбиту средних или тяжелых космических аппаратов, превратились в "конфетти". Авария при запуске привлекла внимание общественности, политиков и руководителей ответственных организаций.


Заключение комиссии:


Расследование показало, что одной из ключевых причин аварии стало использование программного модуля, доставшегося Ariane 5 от предыдущих моделей. Ariane 5 имел уже принципиально другую дисциплину выполнения предполетных действий, поэтому работа рокового программного модуля после времени старта не имела никакого смысла. Модуль не был модифицирован под Ariane 5, поэтому анализ всех операций, проводимый разработчиками, не защитил ракетоноситель от крушения.


В последствии были выявлены и другие ошибки, которые можно было исключить, проведя более основательную проверку программного обеспечения ракетоносителя.


Цена подобной халатности: 370.000.000 $. Последствия: увеличение инвестирования в исследования, направленные на повышение надежности систем с особыми требованиями к безопасности. Последующий автоматический анализ кода Ariane (написан на Ada) стал первым случаем применения статического анализа в рамках крупного проекта с использованием методики абстрактной интерпретации.


Про человеческие жертвы


Therac-25 — аппарат лучевой терапии, медицинский ускоритель. Канадская государственная организация "Atomic Energy of Canada Limited" выпустила три версии: Therac-6, Therac-20 и Therac-25. 6 и 20 были произведены совместно с французской компанией CGR.


Программный код в Therac-20 основывался на коде Therac-6. На всех трёх аппаратах был установлен компьютер PDP-11. Предыдущим моделям он не требовался, так как они были спроектированы как автономные устройства. Техник по лучевой терапии настраивал различные параметры вручную, в том числе и положение поворотного диска для настройки режима работы аппарата.



На Therac-6 и 20 аппаратные механизмы блокировки не позволяли оператору сделать что-то опасное, скажем, выбрать электронный пучок высокой мощности без рентгеновской мишени на месте.


В Therac-25 аппаратная защита была убрана и функции безопасности были возложены на программное обеспечение. Поэтапное, но несогласованное внедрение улучшений в софт привело к фатальным ошибкам. С июня 1985 года по январь 1987 года этот аппарат стал причиной шести передозировок радиации, некоторые пациенты получили дозы в десятки тысяч рад (типичная разовая терапевтическая доза радиации составляет до 200 рад, 1000 рад — смертельная доза). Как минимум двое умерли непосредственно от передозировок.


В программном обеспечении Therac-25 были найдены как минимум четыре ошибки, которые могли привести к переоблучению.


При разбирательстве выяснилось, что программное обеспечение было проверено минимальным количеством тестов на симуляторе, а большинство времени тестировалась вся система в целом. Таким образом, модульным тестированием пренебрегали, а проводили только интеграционное тестирование.


И немного фоток в тему)

Об опасности ошибок в программировании Баг, Программирование, Радиация, История, Факты, Длиннопост
Об опасности ошибок в программировании Баг, Программирование, Радиация, История, Факты, Длиннопост
Об опасности ошибок в программировании Баг, Программирование, Радиация, История, Факты, Длиннопост