学科沙龙 | 程序史上的著名BUG你知道哪些
作为未来的程序员,你为什么要首先选择软件工程?是为了侵入大楼的安全系统吗?开个玩笑,其实我只是想解决那些曾经把我折磨死的小游戏。和著名的小游戏《魔法塔》一样,无敌版本让一路冲上顶峰更加刺激!
但首先,我们得有一双敏锐的眼睛,能够发现那些隐藏的小bug——虫子。 (那就实现统治虚拟世界的邪恶目的吧~~~)
著名BUG盘点
所有“昆虫”之母,将她的名字载入史册
Grace是历史上最早的程序员之一,而且她也是一位女性程序员。她曾在美国海军服役并成为准将。
1947 年 9 月 9 日下午 3:45,格蕾丝在她的笔记本中记录了历史上第一个计算机错误——在 Mark II 计算机中发现的一只飞蛾(可怜的飞蛾不想以这样的方式被报道)记得……因为它,它只是不小心被烧焦了……),她把飞蛾粘在日记里,并写下了“发现错误的第一个案例”。这一发现奠定了Bug这个词在计算机世界的地位,成为了无数程序员的噩梦。
Y2K,炒作的狂欢
在上个世纪,软件公司从未想过他们的代码和产品能够进入新千年。因此,很多软件厂商为了节省内存,省略了代表年份的前两位“19”,或者默认为前两位“19”。随着日历越来越接近1999年12月31日,人们越来越担心大家的电脑系统会在千禧年除夕夜崩溃,因为系统日期将更新为1900年1月1日而不是2000年。1月1日可能意味着无数灾难性事件,甚至世界末日。
世界各地已花费数亿美元来升级系统。而且,还发生了一些小事故:在西班牙,停车计时器坏了;在西班牙,停车计时器坏了;在西班牙,停车计时器坏了。法国气象局公布了19100年1月1日的天气预报(我哥哥预测未来的能力真棒!);在澳大利亚,公交车票价检查系统崩溃。就是这样。最终的结果是,软件公司赚了很多钱,八卦小报的销量大增,很多程序员的千禧年聚会被搞砸了,几个不识字的中国老太太的养老金被骗走了,这并不是什么严重的事情。
达兰导弹事件,毫秒级误差
1991年2月第一次海湾战争中,伊拉克发射的一枚飞毛腿导弹准确命中美国驻沙特达兰基地,造成28名美军当场死亡,100多人受伤。海湾战争中唯一一次伤亡超过百人的损失。
当时负责保卫该基地的爱国者反导系统已经连续工作了100个小时。每工作一小时,系统中的时钟就会有微小的毫秒延迟。这就是这次失败悲剧的根源。爱国者反导系统的时钟寄存器设计为24位,因此时间精度被限制在24位。工作时间长了,这种微小的精度误差就会逐渐被放大。运行100小时后,系统延时为三分之一秒。
对于普通人来说,0.33秒微不足道。但对于需要跟踪并摧毁空导弹的雷达系统来说,这就是灾难性的——侯赛因飞毛腿导弹的空速为4.2马赫(每秒1.5公里),而这“微不足道”的0.33秒相当于大约600m的误差。在达兰导弹事件中,雷达在空中探测到了导弹,但由于时钟误差而无法准确跟踪,因此基地的反导导弹没有发射。 (还好不是我的闹钟耽误了,不然上课就迟到了。)
米还是英尺?火星气候轨道飞行器的星际迷航
火星气候探测器于1997年发射,旨在研究火星气候,但未能完成耗资3亿多美元的任务。在太空飞行了几个月后,探索者号最终因导航错误在火星大气层中解体。漫游车的控制团队使用英制单位发送导航命令,而漫游车的软件系统使用公制系统读取命令。这个错误显着改变了导航控件的路径。最终,探测器进入了过低的火星轨道(误差约100公里),在火星大气过大的压力和摩擦下解体。
(米还是英尺?相差100公里!再多的努力也无法弥补一个BUG的损失)
阿丽亚娜 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号运载火箭首次发射后,火箭开始偏离航线,最终被迫引爆并自毁。整个过程只用了30秒。原来,阿丽亚娜5号运载火箭是在上一代4型火箭的基础上开发的。在4型火箭系统中,使用16位变量和存储器来测量水平速度,因为在4型火箭系统中已经反复验证该值不会超过16位变量,而5型火箭系统中则使用16位变量和存储器来测量水平速度。火箭的开发者只是简单地复制了这部分程序,而没有对新火箭进行数值验证。结果,发生了致命的数值溢出。发射后,这个带小数点的64位变量被转换为不带小数点的16位变量,引发一系列错误,影响了火箭上的所有计算机和硬件,使整个系统瘫痪,不得不选择自毁。 4亿美元变成了巨大的烟花。
产品名称: 阿丽亚娜5烟花
售价:4亿美元
制造商: Bug Co., Ltd.
差一点就第三次世界大战了
1983年,苏联政府的警报系统错误报告美国发射了5枚弹道导弹。幸运的是,苏联守望者推断,如果美国政府真的袭击了他们,发射的导弹肯定超过五枚,所以他断定这只是一次导弹袭击。虚惊一场。 (不得不夸他的机智!所以,你的BUG不但会妨碍你完成电脑作业,还可能引发世界大战!)
UNIX 操作系统守护进程缓冲区溢出事件
第一个网络蠕虫莫里斯蠕虫利用缓冲区溢出在一天内感染了 2000 到 6000 台计算机。起因是一个标准输入输出库函数gets(),它最初是为了从网上获取一段文本而设计的,但遗憾的是,gets()函数并没有指定输入文本的长度。过长的文本允许蠕虫入侵任何连接的计算机。程序员试图用工作代码替换 gets() 函数,但他们拒绝将其从 C 语言的标准输入和输出库中删除,并且直到今天它仍然存在。真是太任性了!
虚拟瘟疫,腐败之血
疫情始于2005年9月13日。魔兽世界地下城的boss是“哈卡——盗魂者”,也被称为“血神”。在与哈卡战斗时,玩家会受到他的负面法术——瘟疫“腐化之血”的感染,每隔几秒就会造成伤害。其他距离被感染角色太近的角色也会被感染。通常,瘟疫会在地下城中出现,并随着时间的推移或角色死亡而消失,因此其影响范围是有限的。
但出现了一个BUG——让宠物感染瘟疫,5秒内将宠物送走,最后在地牢外人口稠密的区域召回宠物。宠物在被解散时仍然感染着瘟疫,瘟疫计时器也被暂停,直到宠物再次被召唤,仍然感染着瘟疫。几天之内,腐化之血成为了魔兽世界的黑死病,整个城市变得无法居住,玩家被迫避免与其他玩家聚集的地方或完全避开大城市。瘟疫最终蔓延到了地牢之外的广阔世界。暴雪娱乐已多次尝试解决该问题,包括在某些地区实施隔离。 (你可以想象无数玩家突然死在安全区,这个游戏已经不能玩了)
美国疾病控制与预防中心正在要求游戏开发商提供有关疫情的数据,以研究对现实世界疫情的反应。 (突然发现这个BUG其实有点用处)
总而言之:
错误无处不在。它对程序员的热爱超过了程序员,它对软件的痴迷甚至超过了程序员。我们程序员在生产软件的同时,也在生产错误。无论多么优秀的程序员,都无法逃脱bug的魔爪。 Bug 是软件的影子,是软件与生俱来的。他们是绕不开的好CP。一种美好的感觉是密不可分的。
我愿在天上做一只展翅的鸟,在地上做一根嫩枝。
随着时间的推移,这份仇恨将永远持续下去。
Bug对你这么深情,你怎么能拒绝呢?
没有虫子,就没有生命。
PS:最后补充一下网上看到的一个笑话。
-测试:我发现了一个错误。
-程序员:不可能,绝对不可能,我没关系。
-测试:真的,快来看看吧。
-程序员:别看它,我没问题。
-测试:看看吧!
- 程序员(边走边说):我都测试过了,确实没问题。
过了一会儿,我看完后说:真没想到这里出了问题。你是怎么检测到的?大多数人不这样使用它。
哈哈……看完这些对话,你有没有觉得眼熟?相信所有有经验的程序员都经历过这样的场景。严谨的操作和逻辑永远属于程序员,但测试却是非常规的。
我记得计算机先驱威克斯回忆起1949年他在英国剑桥工作时的情景,当拖着打孔纸带上楼为原型计算机EDASC加载程序时,他看到了自己的未来:“我强烈地意识到我的余生都你的好日子将花在寻找自己程序中的错误上。”
东南欧
南京大学软件学院
撰稿:聂文涛
美术编辑/陈俊宇