【扣丁学堂】 程序员的眼中钉,肉中刺- BUG!

扣丁学堂

今天,我决定谈一谈世界上最著名的虫子:BUG!

BUG困扰了一代又代的程序员,不论是杰出的计算机科学家,还是像Linus Torvalds(Linux内核创始人)、Bill Joy(传说三天写出BSD的前身,vi和csh的作者)等神一样的传说,抑或你我芸芸程序猿,都是BUG骚扰的对象。BUG是绝对狂热的好战分子,具有永不停歇的战斗欲望,它潜伏在程序员的周围,一双小眼贼亮贼亮,在你百密一疏时出其不意一击奏效。而无论你是钢筋铁骨,还是羊脂玉体,只要被这只虫子袭击 (看过《木乃伊》的话,对圣甲虫一定印象深刻),就得褪上三层皮,更有甚者,很可能锒铛入狱、命丧黄泉或者烟消玉损。

盘点史上最具毁灭性的的Bug》 供参考。

大多数——当然不是全部——软件bug源于我们自己犯的错误。虽然有些是因为软件编码工具和编译器发生了意外,但是大部分的错误得归咎于我们自己。

无论我们受到的SDL培训和安全工具有多么强大,只要我们还是人,我们就会犯错。如果你想问为什么电脑软件会有这么多的漏洞,归根到底是因为,人的天性就是容易犯错。

下面是我列举的几个典型的bug的例子,讲述一下bug的不可避免性。

软件界致命的BUG事件

其实,BUG造成的悲剧天天都在上演,这里我们先举几个比较著名的例子。

许霆案

“2006 年4月21日晚10时,许霆来到天河区黄埔大道某银行的ATM取款机取款。结果取出1000元后,他惊讶地发现银行卡账户里只被扣了1元,狂喜之下,许霆连续取款5.4万元。当晚,许霆回到住处,将此事告诉了同伴郭安山。两人随即再次前往提款,之后反复操作多次。后经警方查实,许霆先后取款171笔,合计 17.5万元;郭安山则取款1.8万元。事后,二人各携赃款潜逃。

从软件的角度来讲,其实是ATM提款机出现了一个BUG,许霆作为测试人员发现了这个BUG,然后找来朋友做了多次复现操作。

这是一个软件BUG引发的悲剧,最终上升到了犯罪的高度。

2007年底,经过一审,广州市中级人民法院判处许霆“无期徒刑,剥夺政治权利终身,并处没收全部个人财产”。

2008年1月,广东省高院裁定许霆案发回重审。经过再审开庭,法院做出了有期徒刑五年的判决。

……

作为程序员,我认为开发ATM机的公司应当负有责任,他们应当赔偿客户(即银行)的损失,是他们的软件BUG导致了这个案件。但在银行这种强力机构面前,个 人的声音微不足道,很难把两者放在同一个天平上来考量。这中间到底有着怎样的曲折,时过境迁,我们已无法考量。但是,作为程序猿,我们还是得引起警惕啊, 很多时候,BUG会带来直接的经济损失和严重的法律后果。虽然你可以辩称技术无罪,但子不杀伯仁,伯仁因你而死。

 

苹果iOS 8.0.1更新撤销

苹果,神坛上的苹果,以极致用户体验而载誉江湖的苹果,并不是万事都顺风顺水,也不是成功者就不会出错,他们也曾因为BUG而被钉在了耻辱柱上:

“(2014年)9月25日消息:苹果在今天早些时候发布了iOS8.0.1更新,目的是决解当前版本中的多处Bug,但是没想到的是更新补丁带来了更多的Bug,最终苹果撤回了该次升级。

据了解,本次受到影响的主要是iPhone 6、iPhone 6 Plus这两款最新的设备,后果是只能接受移动网络无信号,而且TouchID也不能用了。因此建议还没有升级的用户还是不要升级了,而已经悲剧了的用户目前只能等待苹果推出修复补丁。

……”

有人说这是乔布斯不在的后遗症……真不知道这帮人为什么总是把乔布斯拿出来说事儿!其实,这就是一次软件BUG,从程序猿的角度来看,这再正常不过了,和乔布斯有一毛钱关系吗!

再说了,这事儿又不是单单苹果一家才有,你看人家微软,根本都不当一回事儿,补丁一个一个一个一个又一个的发,堵的就是漏洞,改的就是BUG,这都是那帮程序猿惹的祸,与天上的月亮没有关系。

心脏滴血漏洞

“2014年4月9日,Heartbleed(意为“心脏出血”)的重大安全漏洞被曝光,一位安全行业人士在知乎上透露,他在某著名电商网站上用这个漏洞尝试读取数据,在读取200次后,获得了40多个用户名、7个密码,用这些密码,他成功地登录了该网站。

……

Heartbleed 漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64KB的速度进行泄露。”

OpenSSL,著名吧,开源吧,安全吧,它支撑的互联网站点就像天上的星星一样,数都数不过来。就这么一个知名、开源、强大的密码库,一样有Bug。

BUG无处不在!

BUG对程序猿的追逐,对软件的痴迷,比现在的死忠粉还要厉害,那简直是上穷碧落下黄泉,不论你在哪里,上天入地,我都会与你在一起,不离、亦不弃。

无BUG不生活

计算机先驱Maurice Wikes回忆起1949年他在英国剑桥工作的情形,在拖着打孔纸带上楼给雏形计算机EDASC装载程序时,他看到了自己的未来:

我强烈的意识到,生命中剩下的好日子,都将耗费在给自己的程序找错误上头。

Bug究竟是什么呢?其实用粗暴点儿的说法:BUG就是错误

Bug是怎么来的?为什么会出现bug?

《圣经》中有“义人”这个说法,我们有“人无完人,金无足赤”的说法……

人是妈妈生出来的(女娲造人时除外)——你看我总是加各种说明以便堵住漏洞,这样写文章真是很累……这实在是和我的开发习惯有关:我总是习惯防御性编程,预先考虑各种错误,在编码期间就努力消除它们发生的条件……

就其本质而言,软件越复杂,就意味着代码行数越多。只要你在编程,那么即使你有多擅长写代码,也一定会有错误和bug出现。有人曾说,如果你能做到每50行代码中只出现一个错误,那你就已经做得相当好了。大多数程序员差不多每隔5至15行就会犯错。想象一下,这么说吧,一般性的Linux内核拥有超过1500万行的代码,有多少bug你自己算吧!

即使没有编码错误,互联网时代应用程序的整体互动性也是漏洞被攻击的途径。大多数程序员不得不和其他API协作,保存和检索文件,在多种设备上正常工作。所有这些过程都会增加被成功击破的概率。

而要防守的话,则需要写更多的代码,因为得抵御各种不同的攻击渠道。这么说吧,如果有一个只有30条汇编语言指令的恶意程序,那么针对相应的防守,你可能至少得写50000条汇编语言指令!

我们说,人是人他妈生的,妖是妖他妈生的,而软件是程序员生的。

爸爸妈妈在备孕时,很多爸爸会戒烟戒酒戒加班,所谓封山育林也。妈妈会补叶酸测排卵期计算最佳受孕时间……总之一句话,优生优育。可是,孩子出生后依然会有毛病,随着孩子长大,各种毛病都会显现出来。有的孩子有先天缺陷,比如原发性高血压、先天性心脏病、兔唇、痴呆、智障……有的孩子长着长着有毛病了,近视、斜视、小儿麻痹、跛脚、自闭症……作为父母,这都是我们很难接受的事实,可是必须面对和接受。

软件是程序员的孩子,在生它之前,你是否做好了准备?是否认真对待每一个细节?开发软件其实也要经历这些过程,更重要的是,我们一定要意识到:程序员在生产软件,也在生产BUG

再牛逼的程序员,写出来的软件也有BUG。BUG就是软件与生俱来、不可脱逃的好基友,就在那场说走就走的旅行的一开始,它们就情根深种难分难舍了……

So,Bug是程序员写出来的……

不管你愿不愿意承认,事实就是这么令人沮丧。连Maurice Wikes都承认了这一点,你就别倔犟了吧亲。

程序员对Bug的态度都是不同的……

bug并不是一件坏事,这说明你的程序有待提高,而bug会让你鼓起一股韧劲,不找出bug誓不罢休。这样既磨练了你的意志,又提高了你的专业水平。所以,bug应该是你忠实的朋友,而不是敌人。扣丁学堂和你一起笑对bug!


猜你喜欢

转载自blog.csdn.net/codingker/article/details/49363267
今日推荐