"Валерий Аджиев "Мифы о безопасном ПО: уроки знаменитых катастроф" [V]" - читать интересную книгу автора

"3"; в результате после окончания работы Datent монитор Treat вызовет
подпрограмму Set Up Test, выполняющую проверку считающихся уже
установленными параметров.

еобходимо упомянуть еще одну переменную MEOS ( Mode/Energy Offset),
разделяемую между Datent, Keyboard Handler и еще одной некритической
задачей Hand. Старшие байты MEOS используются подпрограммой Datent для
установки одного из двух режимов облучения и величины энергии испускаемого
потока, в то время как младшие используются параллельно работающей задачей
Hand для установки коллиматора в положение, соответствующее выбранному
режиму и энергии.

Оператор мог после ввода параметров режима и энергии редактировать эти
величины по отдельности. Однако, здесь присутствовал тонкий момент
разработчики установили: об окончании процесса ввода (и редактирования!)
параметров свидетельствует то, что все параметры заданы и курсор находится
в командной строке, на предмет чего каждые 8 сек. (величина выбрана, исходя
из некоторых технических соображений, связанных с инерционностью приборов)
производится опрос переменной Data_entry_complete. Если в пределах этих 8
сек. курсор покидает командную строку и после быстрого редактирования
параметров успевает вернуться на нее, то Keyboard Handler этого события
просто не заметит, и соответственно, никак переменную Data_entry_ complete
не изменит.

Иными словами, потенциально существует возможность для следующей
последовательности действий:

* Keyboard Handler отследил местонахождение курсора на командной строке
и установил флаг Data_entry_complete; * затем оператор изменил данные в
MEOS; * не заметив этого (если к моменту опроса курсор оказался вновь на
командной строке), Keyboard Handler не переустанавливает флаг
Data_entry_complete; * тогда Datent уже не способна обнаружить изменение
MEOS она свою работу закончивает, установив Tphase=3 (а не Tphase=1, чтобы
отработать еще один цикл и учесть изменения); * тем временем, параллельно
работающая Hand устанавливает коллиматор в положение, соответствующее
младшим байтам MEOS (их установила ранее Datent), которые могли находиться
в противоречии со старшими байтами этой разделяемой переменной (как раз и
подвергшимся редактированию!).
Специальных проверок для обнаружения такой несовместимости
предусмотрено не было.

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