软件史上最著名的 10 大 Bug

本文最初发表在 Medium 博客,经原作者 Kesk -*- 授权,InfoQ 中文站翻译并分享。

1947 年 9 月 9 日下午 3:45,美国计算机科学家兼美国海军少将 Grace Murray Hopper 在 Harvard Mark II 计算机日志中记录了第一个计算机 Bug。她写道:“发现 Bug 的第一个实际案例。”

在这个领域不犯任何错误可能会很难,但幸运的是,并不是所有的错误都如此昂贵。在这份总结列表中,我收集了一些一直引起我注意的错误。

1. 亚利安 5 号运载火箭爆炸事件

图0:软件史上最著名的 10 大 Bug

1996 年 6 月 4 日,欧洲空间局(European Space Agency,ESA)发射的亚利安 5 号(Ariane 5)运载火箭在法属圭亚那的库鲁发射场发射后仅 40 秒就爆炸了。这枚火箭经过长达十年的研发,耗资 80 亿美元后进行首飞,但这一 Bug 的结果导致了 3.7 亿美元的损失。

首飞失败的原因是整数溢出,这是计算机编程中一个普遍存在的错误。在本例中,有人试图在 16 位空间中设置 64 位数字。

2. PayPal 意外向某人支付 92 千万亿美元

图1:软件史上最著名的 10 大 Bug

当 Chris Reynolds 打开他的 PayPal 电子邮件对账单时,这位宾夕法尼亚州公关主管的账户余额显示为 92,233,720,368,547,800 美元。

在 64 位数字的世界里,这个数字太过庞大,意味着存在编程错误。所幸这一错误很快就被发现,当他再次登录时,他的账户已经归零。

PayPal 表示愿意为 Reynolds 选择的事业捐赠一笔数额不详的资金。

3. Windows 计算器 Bug

图2:软件史上最著名的 10 大 Bug

这个 Bug 存在于大多数 Windows 版本中(Windows 10 除外),包括 Windows XP、Windows 7、Windows Vista 和 Windows 8。如果你有这些版本中的一个,那么你可以在你的操作系统中找到这个 Bug。

步骤:打开 Windows 计算器。输入 4,取平方根,你会得到 2。然后再减去 2。这时,你将在不同版本的 Windows 看到不同的结果,而不是 0。

这个 Bug 的原因是计算器管理 sqrt 操作的方式。结果将保存为浮点数而不是整数,当涉及到浮点计算时出现精度错误,这就是你可以看到的结果。

Microsoft 承认在计算器应用程序中存在这个 Bug,并在 Windows 10 Build 17639 中修复了这一 Bug。

4. 公制与 NASA 火星气候探测者号

图3:软件史上最著名的 10 大 Bug

火星气候探测者号(The Mars Climate Orbiter),耗资 1.25 亿美元,是一个重达 338 公斤的空间机器人,于 1998 年 12 月 11 日发射升空,用于研究火星大气层和气候,并在火星探测 98 计划(Mars Surveyor ’98 program)中充当火星极地着陆者号(Mars Polar Lander)的通信中继器。

当火星气候探测者号即将进入火星轨道时,通讯发生中断,结果以错误的角度进入火星大气层,而不是进入火星轨道。原因是喷气推进实验室(Jet Propulsion Laboratory,JPL)的导航团队在计算中使用了公制,但因为丹佛的洛克希德·马丁(Lockheed Martin)公司提供的关键加速度数据使用的是英制,而不同的度量单位产生了冲突。

5. 造成 4.75 亿美元损失的奔腾浮点除错误

图4:软件史上最著名的 10 大 Bug

这个 Bug 是数学教授 Thomas Nicely 在 1994 年发现的。这个 Bug 是影响第一代 Intel Pentium 处理器浮点运算器的硬件错误。由于这个 Bug,处理器在做浮点除时可能会返回不正确的二进制浮点结果。Intel 将这一失败归因于浮点除法电路使用的查找表中存在条目缺失。

并不是所有的处理器都有这个问题,但是大约有 500 万块有缺陷的芯片被检测出来,Intel 公司在一开始就接受更换芯片的要求,前提是客户能够证明他们受到缺陷芯片的影响。

不过,后来 Intel 公司还是为任何投诉的客户更换了芯片,最终给公司造成了 4.75 亿美元的损失。

6. 千年虫(1999 年)

图5:软件史上最著名的 10 大 Bug

千年虫或 2000 年问题是指与 2000 年开始的日历数据的存储和格式化有关的事件。由于许多程序在表示四位数年份时只用最后两位数字表示,结果,2000 年和 1900 年无法区分,因此预计会出现问题。

例如,它影响到了每天计算利率的银行、核电站、医院、交通运输等中心以及很多其他方面。为纠正这一错误,全世界耗费了数十亿美元来升级计算机系统。

7. 2038 年问题

图6:软件史上最著名的 10 大 Bug

2038 年问题是由于 32 位处理器和 32 位系统的限制造成的。

基本上,当 2038 年 3 月 19 日格林尼治时间 03:14:07 到来时,仍在使用 32 位系统管理日期和时间的计算机将会无法处理这种变化。与千年虫问题相似,届时计算机将无法区分 2038 年和 1970 年。

然而,现在几乎所有台式计算机的现代处理器都是 64 位系统,运行 64 位软件,到 2038 年,32 位系统还会不会存在,很难说。

8. 爱国者导弹失灵(1991 年)

图7:软件史上最著名的 10 大 Bug

1991 年 2 月 25 日,海湾战争期间,沙特阿拉伯的爱国者导弹发射台未能追踪和拦截一枚来袭的伊拉克飞毛腿导弹。飞毛腿导弹击中了美国陆军的一个军营,造成 28 名士兵死亡,约 100 人受伤。

这一问题是由于计算机算数错误,导致启动后时间计算不准确。准确地说,用系统内部时钟测量的十分之一秒的时间乘以 1/10,以秒为单位返回时间,结果,它算出的时间是错误的,导弹因此也就无法拦截伊拉克飞毛腿导弹的攻击。同样又是系统的四舍五入错误。

9.《江南 Style》MV 爆表 YouTube

图8:软件史上最著名的 10 大 Bug

YouTube 的计数器之前使用的是 32 位整数,这是一个在计算机架构中用来表示数据的单元。这个 32 位整数确定了它可以计数的最大可能点击率为 2,147,483,647。

《江南 Style》视频点击率超过了最大值,我们就得到了著名的《江南 Style》YouTube Bug。

现在,YouTube 的视频计数器改用 64 位整数,这意味着视频最大观看人数为 922 万万亿 。

10. Windows 98 演示中的蓝屏死机

图9:软件史上最著名的 10 大 Bug

BSOD 或蓝屏死机(Blue Screen of Death),是 Windows 系统发生致命系统错误后显示的蓝色错误屏幕。它显示了系统已崩溃,此时操作系统已经处于无法可靠地运行的状态。这是由几个不同问题引起的,例如关键进程意外终止或一般硬件故障。

在 Windows 98 或 Windows 95 中,当系统尝试访问硬盘上的文件 c:\aux\auxc:\con\con 时,就会发生蓝屏死机。

直到 2000 年 3 月 16 日,Microsoft 才发布一个安全更新来解决这个问题。

结论

我相信,你读完这篇文章后,当日后你犯了一个错误,就不会感觉特别槽糕了。我们是人,有时也会犯错误。但一定要小心!哪怕是一行简单的拼写错误的代码可能会造成数亿美元的损失。

作者介绍:

Kesk -*-,软件工程师、软件爱好者、科幻作家。

本文文字及图片出自 InfoQ

余下全文(1/3)
分享这篇文章:

请关注我们:

共有 1 条讨论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注