事件背景
Therac-25事件是在软件工程界被大量引用的案例。Therac-25是Atomic Energy of Canada Limited所生产的一种辐射治疗的机器。由于其软件设计时的瑕疵,致命地超过剂量设定导致在1985年6月到1987年1月之间,六件已知的医疗事故中,患者死亡或严重辐射灼伤。
Therac-25的软件是用汇编语言编写的,该机器还使用了自己的操作系统。它的结构如下:
严重事故
在1985年6月3日,有一位妇女在接受乳腺癌的治疗,她的治疗方案是接受200辐射吸收剂量的照射。但当机器供电之后,病人感到了巨大的热量,在她不知情的情况下,病人已经接受了10000到20000剂量的照射。最后病人还活着,但由于辐射的关系,她失去了左乳房和她的左手臂。
7月26日,加拿大州安大略市安大略癌症基金会的一名患者被烧伤。这个病人死于那年的11月。验尸报告认为,死因是由于宫颈癌晚期。但如果她还活着,她需要进行一个髋关节置换术用来纠正由于Therac-25造成的损害。
1985的12月,第三个女人是由一个安装在华盛顿医院的Therac-25被烧伤。伤口在她的臀部,靠近Therac-25的放射部位。这名病人还生活,但最终需要皮肤移植来修复由于辐射造成的烧伤。
1986年3月21日,一个病人在泰勒,德克萨斯接受他的第九轮Therac-25治疗。医生开了180放射剂量针对背上的小肿瘤。当机器打开时,他感到热和疼痛,这是意想不到的,因为放射治疗通常是一个无痛的过程。Therac-25本身也开始以一种不寻常的方式嗡嗡作响。当他被一秒脉冲辐射的时候,病人开始从治疗台上坐了起来。这一次,他起床,开始到门口寻求帮助。他获得了大量的过量辐射。因此而住院,最终在5个月后死亡。
1986年4月11日,一次事故发生在泰勒,德克萨斯。这个时候,病人正在接受治疗在他的耳朵的皮肤癌。在三月二十一日的事故中,同一个操作员正在运行这台机器。治疗开始时,患者看到了一个明亮的光,并听到煎鸡蛋的声音。他说,感觉自己的脸上着火了。患者三周后死亡,由于辐射烧伤他的大脑和脑干的右侧颞叶。
最后的事故很晚才出现,这一次在一月雅基马谷医院,1987年。这个病人后来因受伤而死亡。
原因分析
Therac-25的软件包含一些严重的bug。此事件发生时,所发射的是高能量的电子束,而不是预期的低能量电子束,而且设备对应的零件没有让电子束进入X射线腔中。以前的机种有硬件互锁机制以避免这种情形发生,而Therac-25取消了硬件互锁机制,为了安全起见改用软件的互锁机制。软件互锁机制在有竞争危害时会失效。其缺陷如下:有一个测试程序中一字节的计数器常常会溢位,若操作员恰好在计数器溢位时输入命令,软件互锁机制会失效。
高能量的电子束给予的能量是理想辐射剂量的100倍,是可能会造成β辐射的致命剂量。患者Ray Cox描述其感觉像“强烈的电击”,他因此尖叫跑出诊疗室。几天后病人开始出现辐射灼伤,病人也开始出现辐射过量的症状,其中有三个病患后来因为辐射过量而死亡。
软件中包含一些致命的bug,譬如:
互斥问题:设备的控制行程没有和操作员界面的行程建立互斥锁,因此若操作员设定的太快,就有可能有race condition。这部分在测试时没有测到,因为操作员需要一段时间熟悉相关操作,才能输入的够快,触发此一失效模式。
运算溢出:软件中有设定旗标变数,但是有变化时会让变量加1,而不是将其设定为固定的非零值,因此偶尔会出现算术溢位,让旗标变量变为0,软件就会跳过安全相关的检查。
....
事件进展
针对与Therac-25相关的事件,创建了IEC 62304标准,该标准引入了医疗设备软件的开发生命周期标准。
这些事情对于我们工程师的启示是:写代码一定要严谨,做防御性编程!另外,必须代码经过严格的测试。写出可以工作、可以demo的代码简单,写出稳定、高性能的产品,则是难上加难。
本文根据百度百科,维基百科及其他互联网资料整理编译而成。进一步阅读:
https://hownot2code.com/2016/10/22/killer-bug-therac-25-quick-and-dirty/
(完)
"Linux阅码场"是专业的Linux及系统软件技术交流社区,Linux系统人才培养基地,企业和Linux人才的连接枢纽。
查看我们精华技术文章请移步:
Linux阅码场精华文章汇总
求职招聘请移步:
Linux阅码场: 连接企业和Linux人才的platform总线
扫描二维码关注我们
如果觉得好,请
转发
转发
转发