Читаем Мифы о безопасном ПО - уроки знаменитых катастроф полностью

Ситуация возникла в момент, когда введенные параметры уже верифицированы подпрограммой Datent и монитор Treat в соответствии со значением переменной Tphase = 3 вызвал подпрограмму Set Up Test.

Во время установки и подгонки параметров подпрограмма Set Up Test вызывается несколько сотен раз пока все параметры не будут установлены и верифицированы, о чем эта подпрограмма судит по нулевому значению разделяемой переменной F$mal. Если же значение ненулевое цикл повторяется.

F$mal, в свою очередь, устанавливается подпрограммой Chkcol (Check Collimator) из критической задачи Housekeeper, проверяющей, все ли с коллиматором нормально; а вызывает Chkcol другая подпрограмма задачи Housekeeper под названием Lmtchk (analog-to-digital limit checking), и вызов этот происходит, только если значение разделяемой переменной Class3 ненулевое. А ненулевым его делает как раз сама Set Up Test, которая (пока F$mal=0) каждый раз выполняет над Class3 операцию инкремента.

Эта переменная однобайтовая, следовательно каждый 256-й проход заставляет ее сбрасываться в ноль. А ведь этот ноль свидетельство, что все параметры, наконец, установлены. Если повезет, что именно в этот момент оператор нажмет клавишу "set" для запуска установки коллиматора в надлежащую позицию (а он это может сделать в любой момент, так как уверен, что система позволит коллиматору начать позиционироваться, только если все параметры заданы и верифицированы), то основываясь на случайно возникшем нулевом значении Class3, подпрограмма Lmtchk уже не станет вызывать Chkcol, а значит установить ненулевое значение F$mal будет некому. Иными словами, в ситуации, когда параметры не установлены должным образом (в данном конкретном случае "челюсти" коллиматора были еще раскрыты слишком широко), программная блокировка не сработала: Set Test Up установила Tphase = 2, что позволило монитору Treat прекратить цикл вызова Set Up Test, а инициализировать подпрограмму Set Up Done, по существу запускающую процесс излучения, который и потек бурным потоком, а не узеньким ручейком, как предполагалось.

Коррекция этой ошибки также выполняется просто вместо выполнения инкремента переменной Class3 следует просто присваивать фиксированное ненулевое значение. Вот от каких, казалось бы, мелких и чисто технических ляпсусов программиста может зависеть жизнь человека!

Некоторые итоги

История с Therac-25 показательна, прежде всего, своей комплексностью: если в случае с Ariane 5 авария случилась один раз и из-за единственной ошибки, то катастрофические последствия с Therac-25 проявлялись неоднократно в течение длительного времени, и были следствием целого спектра причин, среди которых не только вполне конкретные программистские "баги", но и дефекты в самой постановке выполнявшегося многие годы проекта.

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

Что же до системной "глобальной особенности", то к ней можно отнести принципиальную переусложненность построения мультизадачной управляющей системы. С чисто программистской точки зрения можно отметить, что для реализации тонкой синхронизации параллельных процессов был выбран механизм разделения переменных, требующий очень внимательной проработки (это именно та область, где необходимо выполнять формальное доказательство правильности алгоритма, благо соответствующие методы разработаны и могут считаться рутинными для тех, кто ими владеет); получилось же так, что потенциально опасные в плане возникновения "race conditions" операции типа "set" и "test" не были сделаны "неделимыми" (indivisible), что и привело к наложению друг на друга их "критических секций" и соответственно к печальным последствиям.

Перейти на страницу:

Похожие книги

100 великих загадок современности
100 великих загадок современности

Новая книга из серии «100 великих» посвящена ряду загадок отечественной и всемирной истории XX и начала XXI века. Порой кажется, что столетие, лишь недавно канувшее в Лету, дает нам поводов для размышлений и материала для исследований больше, чем все прошедшие века и тысячелетия человеческой истории. Две мировые войны, множество локальных военных конфликтов, революции и гражданские войны, заговоры, путчи и перевороты, экономические «чудеса» и тяжелейшие кризисы, выдающиеся достижения культуры и великие научные открытия, взлеты и падения человеческого духа – все это уместилось на относительно небольшом хронологическом отрезке. Читателю предлагаются оригинальные версии, результаты исследований ученых, краеведов, журналистов.

Николай Николаевич Непомнящий

Энциклопедии / Прочая научная литература / Образование и наука
Складки на ткани пространства-времени. Эйнштейн, гравитационные волны и будущее астрономии
Складки на ткани пространства-времени. Эйнштейн, гравитационные волны и будущее астрономии

Гравитационные волны были предсказаны еще Эйнштейном, но обнаружить их удалось совсем недавно. В отдаленной области Вселенной коллапсировали и слились две черные дыры. Проделав путь, превышающий 1 миллиард световых лет, в сентябре 2015 года они достигли Земли. Два гигантских детектора LIGO зарегистрировали мельчайшую дрожь. Момент первой регистрации гравитационных волн признан сегодня научным прорывом века, открывшим ученым новое понимание процессов, лежавших в основе формирования Вселенной. Книга Говерта Шиллинга – захватывающее повествование о том, как ученые всего мира пытались зафиксировать эту неуловимую рябь космоса: десятилетия исследований, перипетии судеб ученых и проектов, провалы и победы. Автор описывает на первый взгляд фантастические технологии, позволяющие обнаружить гравитационные волны, вызванные столкновением черных дыр далеко за пределами нашей Галактики. Доступным языком объясняя такие понятия, как «общая теория относительности», «нейтронные звезды», «взрывы сверхновых», «черные дыры», «темная энергия», «Большой взрыв» и многие другие, Шиллинг постепенно подводит читателя к пониманию явлений, положивших начало эре гравитационно-волновой астрономии, и рассказывает о ближайшем будущем науки, которая только готовится открыть многие тайны Вселенной.

Говерт Шиллинг

Научная литература / Прочая научная литература / Образование и наука