在现今数位年代,电脑 bug 不但困扰著每个程序员,更会无可避免影响我们的生活,小到每个人的衣食住行,大到国家经济、世界局势。随着我们的生活方式渐渐的数字化、网络化,数位世界的找虫和杀虫就变得越来越重要。
软件史上有哪些著名的 bug 呢?让我们一起来回顾一下:
1. 万“虫”之母,史上留名
▲ 软件史上第一虫。
1947 年 9 月 9 日下午 3 点 45 分,Grace Murray Hopper 在她的笔记本上记下了史上第一个电脑 bug ——在 Harvard Mark II 电脑里找到的一只飞蛾,她把飞蛾贴在日记本上,并写道“First actual case of bug being found”。这个发现奠定了 Bug 这个词在电脑世界的地位,变成无数苦逼程序员的噩梦。 从那以后,bug 这个词在电脑世界表示计算机程序中的错误或者疏漏,它们会使程式计算出莫名其妙的结果,甚至引起程式的崩溃。Grace Murray Hopper 是历史上最早一批程序员,而且还是个女程序员,服役于美国海军,官至准将。
这是流传最广的关于电脑 bug 的故事,可是历史的真相是,bug 这个词早在发明家汤玛斯·爱迪生的年代就被广泛用于指机器的故障,这在爱迪生本人的 1870 年左右的笔记里面也能看得到。而电气电子工程师学会 IEEE 也将 bug 这一词的引入归功于爱迪生。
2. 千禧虫,炒作的狂欢
▲ 1999 年给了哗众取宠的杂志小报极好的题材。
在上个世纪,软件业者从来没想过他们的代码和产品会跨入新千年。因此,很多软件业者为了节省内存省略掉代表年份的前两位元数字“19”,或者预设前两位为“19”。
而当日历越来越接近 1999 年 12 月 31 日时,人们越来越担心在千禧年的新年夜,大家的电脑系统都会崩溃,因为系统日期会更新为 1900 年 1 月 1 日而不是 2000 年 1 月 1 日,这样可能意味着无数的灾难事件,甚至是世界末日。
到今天,我们可以调侃这个滑稽的故事,因为核导弹并没有自动发射,飞机也没有失控从天上掉下来,银行也没有把国家和使用者的大笔存款弄丢。
千禧虫 bug 是真实的,全球花了上亿的美元用来升级系统。而且,也发生了一些小事故:
在西班牙,停车场计费表坏了;法国气象局公布了 19100 年 1 月 1 日的天气预报;在澳洲,公共汽车验票系统崩溃。就这样而已。最后盘点的结果是软件公司赚了大钱、八卦小报销量大增、很多程序员的千禧跨年夜 party 泡汤了、几个中国文盲老太太被人骗了养老金,不可谓不严重。
3. 达兰导弹事件,毫秒的误差
在 1991 年 2 月的第一次海湾战争中,一枚伊拉克发射的飞毛腿导弹准确击中美国在沙特阿拉伯的达兰基地(Dhahran),当场炸死 28 个美国士兵,炸伤 100 多人,造成美军波斯湾战争中唯一一次伤亡超过百人的损失。
在后来的调查中发现,由于一个简单的电脑 bug,使基地的爱国者反导弹系统失效,未能在空中拦截飞毛腿导弹。当时,负责防卫该基地的爱国者反导弹系统已经连续工作了 100 个小时,每工作一个小时,系统内的时钟会有一个微小的毫秒级延迟,这就是这个失效悲剧的根源。爱国者反导弹系统的时钟暂存器设计为 24 位元,因而时间的精度也只限于 24 位元的精度。在长时间的工作后,这个微小的精度误差被渐渐放大。在工作了 100 小时后,系统时间的延迟是三分之一秒。
对一般人人来说,0.33 秒是微不足道的。但是对一个需要跟踪并摧毁一枚空中导弹的雷达系统来说,这是灾难性的——侯赛因飞毛腿导弹空速达 4.2 马赫(每秒 1.5 公里),这个“微不足道”的 0.33 秒相当于大约 600 米的误差。在达兰导弹事件中,雷达在空中发现了导弹,但是由于时钟误差没有能够准确地跟踪它,因此基地的反导弹并没有发射。
▲ 达兰导弹事件图解。
4. 米还是英尺?火星气候探测者号的星际迷航
火星气候探测者号在 1997 年发射,目的为研究火星气候,但是它没有能够达成这项花费 3 亿多美元的使命。
探测者号在太空中飞行几个月以后,由于导航错误,最终在火星大气层解体。探测器的控制团队使用英制单位来发送导航指令,而探测器的软件系统使用公制来读取指令。这一错误大大改变了导航控制的路径。最后探测器进入过低的火星轨道(大约 100 公里误差),在过大的火星大气压力和摩擦下解体。
▲ 米还是英尺?偏离 100 公里!
亚利安 5 号运载火箭,昂贵的简单复制
程序员在程式设计时必须定义程式用到的变数,以及这些变数所需的电脑内存,这些内存用比特位元定义。
一个 16 位元的变数可以代表 -32,768 到 32,767 中间的值。而一个 64 位元的变数可以代表 −9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 中间的值。
1996 年 6 月 4 日,亚利安 5 号(Ariane 5)运载火箭的首次发射点火后,火箭开始偏离路线,最终被逼引爆自毁,整个过程只有短短 30 秒。亚利安 5 号运载火箭基于前一代 4 型火箭开发。在 4 号火箭系统中,对一个水准速率的测量值使用了 16 位元的变数及内存,因为在 4 型火箭系统中反复验证过,这一值不会超过 16 位元的变数,而 5 号火箭的开发人员简单复制了这部分程式,却没有对新火箭进行数值的验证,结果发生了致命的数值溢出。发射后这个 64 位元带小数点的变数,被转换成 16 位元不带小数点的变数,引发了一系列的错误,从而影响了火箭上所有的电脑和硬件,瘫痪了整个系统,不得不选择自毁,4 亿美元因而变成一个巨大的烟花。
▲ 花费 4 亿美元的亚利安 5 号烟花,软件 bug 出品。
(本文由 雷锋网 授权转载;首图来源:Flickr/Surian Soosay CC BY 2.0)