软件史上最严重的十个Bug

 

原文地址:http://www.cxybase.com/daypic/bug-117.html

 

2005年10月在通报其汽车预警灯毫无理由的点亮和汽油发动机出现不可预 见的延迟之后,丰田制造商宣布召回他的160,000辆Prius hybrid混合动力汽车。但和去年大规模的召回汽车不同,Prius hybrid的根本问题不是硬件问题——而是智能型汽车的软件出了故障。Prius hybrid汽车中的嵌入式软件中存在着bug。

伴随 着这次召回,Prius hybrid也加入到Buggy Computer的行列中—这是一个在1947年成立的组织,这一年工程师在Harvard Mark 1系统中的F, Relay #70中发现了一个bug。当工程师发现故障时,该计算机正在运行它的乘法器和加法器。该错误被捕获,删除并且以下面的语句的方式录制到计算机的日志 中:“first actual case of a bug being found.”

60过去了,计算机bug仍然存在着,同时并没 有任何灭绝的迹象。随着软件和硬件的界限越来越难以区分,代码错误越来越对我们的日常生活造成不良影响。Bug并不仅仅是寄生在我们的操作系统和应用程序 中—今天他们存在于我们的电话、起搏器、我们的电力设备和医疗设备中,还有我们的车上。

但是哪一个是最严重的呢?

我们很容易列出造成较大破坏的bug,然而我们却很难去评估他们的严重程度。哪一个破坏性更大?—是一个被计算机蠕虫所利用,连续几天关闭你的上网服务的安全漏洞,还是一个引发国家电话系统整个白天瘫痪的排字工?答案也许取决于你是需要打电话还是查收你的电子邮件。

很 多人认为最严重的bug是能够致命的bug。固然,这类的bug不是很多,但是像Therac-25的案例被普遍认为是一种会在重要的安全应用程序的软件 广泛传播的警告。尽管研究这些系统的专家警告该软件可能会对一些人造成伤害,阻止该技术引入到那些非常需要智能处理技术的领域,那些人需要承受可能会有的 风险。然而,最终他们却认为该软件的缺乏可能会比那些不可避免的bug给更多的人造成伤害。

Mariner I发射

按照时间顺序,著名网络媒体Wired News列出了到目前为止10个最严重的软件bug。

1962年7月28日, Mariner I空间探测器事件。

Mariner 1航空软件的bug导致火箭在发射时偏离了其的预期轨道。任务控制器在大西洋上空将整个火箭摧毁。在对这起事故进行调查中发现,使用铅笔撰写下的一个公式被不正确的录入到计算机代码中,直接导致计算机错误的计算了火箭的运行轨道。

1982年—苏联的石油管道事件。

根 据CIA(美国中央情报局)的陈述,为其工作的间谍们在苏联购买的用来控制跨西伯利亚石油管道的加拿大计算机系统中种下了一个bug。当时是苏联通过秘密 购买或者偷窃美国的敏感技术来获取到了该系统。据说CIA发现了这个存在bug的程序,决定对可以通过苏联人检查的设备做一个让苏联人事与愿违的破坏,使 得该设备一旦运行起来将会失败。该事件的结果据说在历史上造成了最大的非原子破坏。

1985-1987年间 -- Therac-25医疗加速器事件。

一 个放射疗法的设备故障造成了在几个医疗设备中发出了致命的射线。Therac-25是一个在以前设计的基础上改进的治疗设备,该设备可能会发出两种射线: 或者是一个低功耗的电子束或者是X射线。Therac-25'的X射线是通过猛烈的高能电子束撞击到一块位于电子枪和患者之间的金属目标而产生的。第二项 改进是对于更旧的Therac-20'电动保险联动装置采取软件控制的方式代替,做这项改进是因为软件被认为更加可靠。

然而工程师所不知道 的是20和25型号都是建立在有一个没有经过正规培训的程序员所开发的操作系统上的。由于这个不易察觉的叫做"race condition,"的bug,一个快速的打字员很可能会很偶然的配置Therac-25从而导致电子束将会在高能模式下启动。但是强烈的X射线偏移了 目标。最后直接导致了五名患者死亡;其余患者受到了严重伤害。

1988年--伯克莱UNIX操作系统finger守护进程缓冲器溢出事件。

第 一个网络蠕虫,莫里斯蠕虫利用缓冲器溢出在一天之内感染了2000到6000台计算机,起因是一个标准输入输出库函数gets(),原来设计为从网上获取 一段文本,但遗憾的是,gets()函数没有规定输入文本的长度。过长的文本导致蠕虫入侵任何接入的计算机。程序员们试图用工作码来取代gets()函数 的功能,但是他们拒绝从C语言的标准输入输出库中删除它,直到今天还保留着。

1988-1996年间--Kerberos随机数字发生器事件。

Kerberos安全系统的作者忽略了产生真正的程序随机码时使用恰当的种子,导致长达八年依赖Kerberos验证的计算机可被轻易入侵。如果漏洞不被利用,就一直不会被发现。

1990年1月15日,AT&T网络瘫痪。

利 用一个新发布软件的bug可以控制AT&T #4ESS远程交换机,在邻近计算机之间发送信息引起大型计算机瘫痪,机器恢复时发送信息又导致邻近计算机当机。 一天纽约的一台交换机当机并且重启,引起它邻近交换机瘫痪,由此及彼,一个连着一个,很快,114台交换机每六秒当机重启一次,六万人九小时内不能打长途 电话。当时的解决方式:工程师重装了软件以前的版本。

1993年--Intel奔腾浮点指数除法事件。

一 个硅片上的错误导致Intel高性能奔腾芯片在一段范围内计算浮点指数除法时发生错误。例如4195835.0/3145727.0产生的是 1.33374而不是1.33382,产生了0.006偏差。尽管该bug仅仅影响了几个用户,然而他却成了整个公众的噩梦。估计流通中的三百万到五百万 的芯片存在着这样的缺陷,起初Intel仅仅为那些能够证明他们确实有高精度计算需求的用户提供了取代奔腾的芯片。最后,Intel公司只好妥协为任何投 诉的人提供替代芯片。该bug给Intel最终造成了4亿7千5百万损失。

1995/1996年–致命的ping命令。

由 于缺乏对IP段组装代码的完整性检查和错误的执行使得有可能通过从互联网的任意位置发送恶意的”ping”数据报而攻击多个操作系统。大部分受明显影响的 是运行Windwos的计算机,当他们接受到数据报后,他们就会死锁同时显示所谓的“蓝屏死机”。但是攻击同时也影响很多Macintosh和Unix系 统。

1996年**号—501航天飞机爆炸事件。

对于Ariane 4火箭的工作代码在Ariane 5中被重新使用,但是Ariane 5更高速的运算引擎在火箭航天计算机中的算法程序中触发了一个bug。该错误存在于将64位浮点数转换为16位带符号整数的程序中。更快的运算引擎导致了 Ariane 5中的64位数据要比Ariane 4中更长,直接诱发了溢出条件,最终导致了航天计算机的崩溃。

首先501航天飞机的备份计算机崩溃,然后0.05秒之后,主计算机也崩溃了。这些计算机崩溃直接导致了火箭的主要处理器使火箭的运算引擎过载,同时导致火箭在发射40秒后解体破碎。

2000年11月 –巴拿马市国家肿瘤中心事件。

在这一系列事故中,由一家美国公司—Multidata Systems International所开发的治疗软件错误的计算了对于正处于放射治疗中的病人所应该使用的合适剂量。

Multidata的软件允许放射治疗师利用计算机屏幕的一个叫做"blocks"的金属装置来保护健康组织以免受射线的伤害。但是该软件仅仅允许治疗师使用4个屏蔽块,但是巴拿马的医生希望用5块来保护。

医 生发现他们可以通过将所有的屏蔽块画成一个在中间有孔的大块来欺骗该软件。然而医生们没有意识到的是Multidata软件在这种配置中根据该空画法的不 同给出了不同的答案:如果该孔是在一个方向绘制的,则给出正确的计算出的剂量,如果是在另外不同的方向绘制的,软件就会推荐出要比必须需要暴露的射线的两 倍剂量。至少有8个病人在这次事故中丧生,同时接受了过多剂量放射的20个病人产生了严重的健康问题。被要求手动两次检查计算机的计算的医生被以谋杀罪起 诉。

你可能感兴趣的:(软件史上最严重的十个Bug)