前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件bug致命的经典案例: Therac-25医疗事故

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

作者头像
Linux阅码场
发布2019-10-08 17:41:39
2.2K0
发布2019-10-08 17:41:39
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

事件背景

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/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档