繁体
首页

第83章 错误、故障和风险(4)(3 / 3)

Therac-25的制造商是加拿大原子能有限公司(AECL),一个隶属于加拿大政府的公司。研究这些事件的调查人员发现,AECL在程序开发过程中,所产生的关于软件说明或测试计划的文档非常少。虽然AECL声称,他们对该机器进行了广泛测试,但似乎其测试计划是不够的。

软件错误

调查人员能够把一些过量的情形追溯到两个特定的软件错误上。因为本书的许多读者是计算机科学专业的学生,我会介绍一下这些错误。这些描述说明使用良好的编程技巧是非常重要的。因为有些读者可能没有或只有很少的编程知识,这里的描述会尽量简单。

在操作者从控制台输入治疗参数之后,被称为“设置测试(Set-Up Test)”的一个软件过程会负责进行各种检查,以确定机器是否位于正确的位置,以及其他事项。如果有什么事情还没有准备好,这个过程会安排自己重新运行检查。(该系统可能只需要等待转盘移动到相应的地方。)在设定一次治疗的过程中,该“设置测试”过程可能会运行数百次。有一个标志变量被用来表示该机器上的特定设备是否在正确的位置上。如果它的值是0,意味着该设备已准备就绪;如果值非0,意味着它必须要接受检查。为了确保该设备会被检查,每次运行“设置测试”过程时,都会对该变量加一,使之变为非0值。问题是,该标志变量被存储为一个字节。在对该过程调用了256次之后,标志变量会产生溢出,它的值会变成0。(如果你对编程不熟悉的话,可以把它当作是一个汽车上的里程表在到达它可以显示的最大值之后,又滚动到零的情形。)如果在这一刻,所有其他事情都是准备好的,那么该程序就不会去检查设备的位置,治疗可以继续进行。调查人员认为,在一些事故中,这个错误会允许当转盘被定位为利用光束时,可以使用电子束,这种情况下并没有任何保护装置就位,对电子束进行衰减。

这个案例中的悲剧部分原因是,该错误是如此的简单,改正也是如此的容易。任何一个好的学生程序员都不应该犯这样的错误。该解决方案是将标志变量设置为一个固定的值,例如1,而不是每次递增它,用1来指示该设备需要接受检查。

还有其他错误导致了该机器会忽略由操作员在控制台上所进行的改动或更正。当操作员输入了关于一次治疗的所有必要信息之后,程序就开始将各种设备到位。这个过程可能需要几秒钟。在此期间,软件会检测操作者是否会对输入进行编辑,如果它检测到有编辑的情况,就会重新启动设置过程。然而,由于在这段程序中的错误,该程序的某些部分会收到被编辑的信息,而另一些部分则没有收到。这导致机器的设置是不正确的,并且与安全治疗不一致。根据美国食品和药物管理局(FDA)后来的调查,在该程序中似乎没有进行一致性检查。对于有经验的操作者,由于在编辑输入时速度很快,这个错误也最有可能发生。

在一个控制物理设备的实时多任务处理系统中,在操作员输入信息,并有可能会对输入进行修改时,有很多复杂的因素可能会促成微妙的、间歇性的,并且难以被检测到的错误。开发这样系统的程序员,必须学会如何才能意识到潜在的问题,并使用良好的编程习惯来避免它们。

8.2.3 为什么会有这么多事故?

已知的Therac-25过量事故至少有6起。你可能想知道,在第一次过量事故发生后,为什么医院和诊所还在继续使用该机器?

Therac-25在一些诊所已经使用了超过两年。医疗机构并不会因为最初的几个意外,就立即把它停止使用,因为他们并无法立刻知道这些伤害是该机器造成的。医务工作人员会考虑各种其他的解释。第一次事故发生地点的工作人员说,他们不能肯定病人的伤害来源的其中一个原因,是他们以前从未见过如此大规模的辐射过量。他们向制造商提出了可能辐射过量的质疑,但该公司(在第一次、第三和第四次事故发生后)回应说,该机器不可能会造成对病人的这种伤害。按照勒夫森和特纳的调查报告,他们甚至还告诉医疗机构,没有出现过类似的受伤案件。