软件bug致命的经典案例: Therac-25医疗事故

640?wx_fmt=jpeg

事件背景

Therac-25事件是在软件工程界被大量引用的案例。Therac-25是Atomic Energy of Canada Limited所生产的一种辐射治疗的机器。由于其软件设计时的瑕疵,致命地超过剂量设定导致在1985年6月到1987年1月之间,六件已知的医疗事故中,患者死亡或严重辐射灼伤。

640?wx_fmt=png

Therac-25的软件是用汇编语言编写的,该机器还使用了自己的操作系统。它的结构如下:

640?wx_fmt=png

 

640?wx_fmt=jpeg

严重事故

在1985年6月3日,有一位妇女在接受乳腺癌的治疗,她的治疗方案是接受200辐射吸收剂量的照射。但当机器供电之后,病人感到了巨大的热量,在她不知情的情况下,病人已经接受了10000到20000剂量的照射。最后病人还活着,但由于辐射的关系,她失去了左乳房和她的左手臂。

640?wx_fmt=png

7月26日,加拿大州安大略市安大略癌症基金会的一名患者被烧伤。这个病人死于那年的11月。验尸报告认为,死因是由于宫颈癌晚期。但如果她还活着,她需要进行一个髋关节置换术用来纠正由于Therac-25造成的损害。

 

1985的12月,第三个女人是由一个安装在华盛顿医院的Therac-25被烧伤。伤口在她的臀部,靠近Therac-25的放射部位。这名病人还生活,但最终需要皮肤移植来修复由于辐射造成的烧伤。

 

1986年3月21日,一个病人在泰勒,德克萨斯接受他的第九轮Therac-25治疗。医生开了180放射剂量针对背上的小肿瘤。当机器打开时,他感到热和疼痛,这是意想不到的,因为放射治疗通常是一个无痛的过程。Therac-25本身也开始以一种不寻常的方式嗡嗡作响。当他被一秒脉冲辐射的时候,病人开始从治疗台上坐了起来。这一次,他起床,开始到门口寻求帮助。他获得了大量的过量辐射。因此而住院,最终在5个月后死亡。

 

1986年4月11日,一次事故发生在泰勒,德克萨斯。这个时候,病人正在接受治疗在他的耳朵的皮肤癌。在三月二十一日的事故中,同一个操作员正在运行这台机器。治疗开始时,患者看到了一个明亮的光,并听到煎鸡蛋的声音。他说,感觉自己的脸上着火了。患者三周后死亡,由于辐射烧伤他的大脑和脑干的右侧颞叶。

 

最后的事故很晚才出现,这一次在一月雅基马谷医院,1987年。这个病人后来因受伤而死亡。

640?wx_fmt=jpeg

原因分析

Therac-25的软件包含一些严重的bug。此事件发生时,所发射的是高能量的电子束,而不是预期的低能量电子束,而且设备对应的零件没有让电子束进入X射线腔中。以前的机种有硬件互锁机制以避免这种情形发生,而Therac-25取消了硬件互锁机制,为了安全起见改用软件的互锁机制。软件互锁机制在有竞争危害时会失效。其缺陷如下:有一个测试程序中一字节的计数器常常会溢位,若操作员恰好在计数器溢位时输入命令,软件互锁机制会失效。

 

高能量的电子束给予的能量是理想辐射剂量的100倍,是可能会造成β辐射的致命剂量。患者Ray Cox描述其感觉像“强烈的电击”,他因此尖叫跑出诊疗室。几天后病人开始出现辐射灼伤,病人也开始出现辐射过量的症状,其中有三个病患后来因为辐射过量而死亡。

 

软件中包含一些致命的bug,譬如:

互斥问题:设备的控制行程没有和操作员界面的行程建立互斥锁,因此若操作员设定的太快,就有可能有race condition。这部分在测试时没有测到,因为操作员需要一段时间熟悉相关操作,才能输入的够快,触发此一失效模式。

 

运算溢出:软件中有设定旗标变数,但是有变化时会让变量加1,而不是将其设定为固定的非零值,因此偶尔会出现算术溢位,让旗标变量变为0,软件就会跳过安全相关的检查。

....

640?wx_fmt=jpeg

事件进展

针对与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总线

 

扫描二维码关注我们 

640?wx_fmt=png

如果觉得好,请

转发

转发

转发

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值