软件史上最著名的10大Bug

2020 年 8 月 10 日

软件史上最著名的10大Bug

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


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


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


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



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


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


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



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


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


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


3. Windows 计算器 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 火星气候探测者号



火星气候探测者号(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 亿美元损失的奔腾浮点除错误



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


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


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


6. 千年虫(1999 年)



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


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


7. 2038 年问题



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


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


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


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



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


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


9.《江南 Style》MV 爆表 YouTube



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


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


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


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



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


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


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


结论


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


作者介绍:


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


原文链接:


https://medium.com/swlh/some-of-the-most-famous-bugs-in-software-history-bb16a2ee3f8e


2020 年 8 月 10 日 15:574057
用户头像

发布了 256 篇内容, 共 85.8 次阅读, 收获喜欢 929 次。

关注

评论

发布
暂无评论
发现更多内容

不支持原子性的 Redis 事务也叫事务吗?

海星

Java redis 事务

有奖征文重磅来袭,来!一起玩把大的!

小红豆

透彻理解AQS源码分析系列之AQS基础二

InfoQ_d2212957090d

拥抱K8S系列-05-基于docker部署面临的问题

张无忌

Docker 运维

阿里巴巴发布国内首个公益区块链标准 用技术让公益公开透明

CECBC区块链专委会

区块链 公益

翻转链表,机器学习视觉训练,对数据的人工标注,使信息丢失,John 易筋 ARTS 打卡 Week 16

John(易筋)

学习 ARTS 打卡计划 翻转链表 Google论文评判人工预处理 大数据架构Spark

oeasy教您玩转linux010206 蒸汽机车 sl

o

2020-09-03-第十三周学习总结

路易斯李李李

ARTS Week15

时之虫

ARTS 打卡计划

LeetCode题解:239. 滑动窗口最大值,单调队列,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

程序的机器级表示-数组的分配和访问

引花眠

计算机基础

用函数式写法精简Java代码的一个例子

Sean

Java 函数式编程

Go: gops如何与Go运行时交互?

陈思敏捷

go golang gops

架构师训练营第十三周总结

张明森

给DevOps加点料——融入安全性的DevSecOps

DevOps 运维 测试 开发 安全性

Golang Package sync 透析

卓丁

golang sync

给大家介绍下,这是我的流程图软件 —— draw.io

程序员小航

工具 流程图 draw.io drawio-desktop 画图软件

如何将VSCode变成绿色版本

lmymirror

vscode 教程

深入理解JVM垃圾回收机制 - GC Roots枚举

NORTH

GC Roots枚举 安全点 安全区域 OopMap

一点思考|工作十几年了,竟从未用过do-while!

王磊

Java

从湖南“软硬兼施”,管窥三湘水畔的智能浪潮

脑极体

Spring 5 中文解析测试篇-Spring测试

青年IT男

Spring5 JUnit

云原生 go-zero 微服务框架

Kevin Wan

go golang microservice go-zero 微服务框架

甲方日常 8

句子

工作 随笔杂谈 日常

学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?

沉默王二

Java 学习 程序员 书单

usdt跨境入金支付系统搭建|区块链跑分系统开发

WX13823153201

商业通识 : 商业为什么能进步?

Walker

学习 得到 个人成长 商业

读后感之《任正非:以客户为中心》

王新涵

ARTS打卡 第15周

引花眠

微服务 ARTS 打卡计划

握草,你竟然在代码里下毒!

小傅哥

Java 程序员 小傅哥 bug 有毒代码

usdt支付系统开发|承兑商支付跑分系统搭建

WX13823153201

usdt支付系统开发

软件史上最著名的10大Bug-InfoQ