事后诸葛亮:如何写出没有bug的软件

标签: 批评评论 bug 代码审查 安全漏洞 测试 | 发表时间:2014-03-03 00:47 | 作者:Aqee
出处:http://www.vaikan.com

网上对苹果iOS7操作系统中 最新暴露出的一个严重安全漏洞的讨论读起来十分有趣。如果你还没有读过 Alex Langley对此的分析,那现应该读一下,写的非常好。

附带说一下,是一个TLS v1.2 SSL连接问题上的bug,签名认证没有被检查,使伪造签名成为可能。原因是代码永久的直接跳到了方法的结尾处,没有实际检查哈希结果是否正确。

问题程序

是什么导致了这样一个弱者的bug?我四处看了一下,下面是网友们总结出的几个原因:

  • 用C语言很难写出正确无误的程序
  • 苹果公司的程序员不用心
  • 编码风格中允许忽略大括号
  • 苹果公司里没有正规的代码审查
  • 使用了goto语句
  • 使用了自动代码合并
  • 没有开启编译器对死代码的警告
  • 没有使用静态分析工具
  • 没有好好测试

所有的这些原因看起来都像是在这个bug的产生中扮演了一定的角色。但有一个主导原因吗?

对代码的差异对比给不了多少有用的信息,在631行上的这个bug看起来怎么产生的都有可能。也许是一次代码合并错误,也许是愚蠢的拷贝/粘贴造成。

事实上,你很难,或许不可能找到一个单一的为此bug负责的原因,那我们能有什么良方?很多人说是指代码上没有用花括号包围的原因。例如Zed说:

很显然写这段Apple SSL C 代码的家伙没有读过我的C语言书:永远使用花括号!

— zedshaw (@zedshaw) February 23, 2014

这就是 帕金森瑣碎定理的一个很好的例子:花费大量时间讨论无关紧要的琐事。引起这个bug的根源不是缺少花括号。有没有花括号不会成为这个多余的goto的产生的原因。

为什么我们,程序员们,总是抱怨编码风格问题,但却不重视代码审查对程序正确性的决定作用呢?虽然不好的编码风格会隐藏程序bug,但并不是编码风格产生的问题。我们太重视代码布局视觉上的问题,却故意逃避正确性问题。如果更注重正确性,绝对不可能让这种关键代码中未经测试的情况下发布。

好的编码风格并不能防止大部分的bug的产生——尽管有点作用。简单的编程语言能够减少bug的产生。代码审查的作用更大。静态分析能让你避免大量的bug。

认真的测试可以捕捉并防止很多bug的产生。这就是为什么对于关键的软件,比如 cryptography
library
,有100%的测试覆盖率。这种一眼就能看出来的bug绝对不会在这种软件里出现。

未经测试的加密代码是用来解密的代码。

所以说,抱怨花括号是愚蠢的做法。相反,在这种情况下花括号会让问题更难发现,花括号不是问题的根源,也不是问题的解决方案。大家找错了方向。

本文由 外刊IT评论网( www.vaikan.com)原创发表,文章地址: 事后诸葛亮:如何写出没有bug的软件,[英文原文: Wrong Solutions ]

你也许会喜欢这些文章:

  1. IBM黑衣小组
  2. 安全专家说:现在到了该彻底重写Java的时候了
  3. 谷歌如何测试软件 —— 第二部分
  4. 漫画:程序员的工作
  5. 软件测试不是一个功能




相关 [事后诸葛 没有 bug] 推荐:

事后诸葛亮:如何写出没有bug的软件

- - 外刊IT评论网
网上对苹果iOS7操作系统中 最新暴露出的一个严重安全漏洞的讨论读起来十分有趣. 如果你还没有读过 Alex Langley对此的分析,那现应该读一下,写的非常好. 附带说一下,是一个TLS v1.2 SSL连接问题上的bug,签名认证没有被检查,使伪造签名成为可能. 原因是代码永久的直接跳到了方法的结尾处,没有实际检查哈希结果是否正确.

Google为何至今没有修正Chrome的高耗电“bug”

- - Solidot
在Windows笔记本电脑上,Chrome的平均耗电量高于其它浏览器,原因是它使用了更短的唤醒计时器. Windows使用计时器安排任务,在空闲情况下,计时器设为15ms,如果没有任务要做,它会继续休眠,每隔15ms检查一次. 应用程序可以修改这个计时器, Chrome将其设为1ms,也就是在空闲时它每秒会唤醒系统1000次,相比之下Firefox在空闲时每秒唤醒系统64次.

找bug记(1)

- BTK 4eVeR - BlogJava-庄周梦蝶
    转载请注明出处 http://www.blogjava.net/killme2008/archive/2011/07/10/354062.html.     上周在线上系统发现了两个bug,值得记录下查找的过程和原因. 以后如果还有查找bug比较有价值的经历,我也会继续分享.     第一个bug的起始,是在线上日志发现一个频繁打印的异常——java.lang.ArrayIndexOutOfBoundsException.

找bug记(2)

- gengmao - BlogJava-庄周梦蝶
    这篇blog迟到了很久,本来是想写另一个跟网络相关bug的查找过程,偷偷懒,写下最近印象比较深刻的bug. 这个bug是我的同事水寒最终定位到的.     前几个月同事报告称有一个线上MQ集群会同一时间抛出ArrayIndexOutOfBoundsException这个异常,也就是数组越界.

Scrum中管理bug

- - CSDN博客研发管理推荐文章
如果bug来自于正在开发的sprint. 会在task阶段就被QA/Scrum Master/Product Owner标记为有bug,并且Story不能被置为done状态,这个很容易解决. 如果bug来自于已经结束的sprint,那么怎么办呢. 理想状态下是将bug放到backlogs中,然后由product owner调整其优先级,并决定放在后面的哪一个sprint中修复.

Fix Bug的五个阶段

- Sirius - 酷壳 - CoolShell.cn
下面的文章和《各种流行的编程方式》有异曲同工,请你不要理解错了. 一个非常严重和困难的bug,能够成就一个饱经沧桑深受压力的有经验的专业程序员的职业生涯. 经受这种考验的创伤程度,相当你受到了一次严重的身体伤害,离婚,或是家庭成为的离世. 研究人员在研究了计算机编程心理学后,得出了一个程序员们在解决一个困难的bug时的心路里程.

mysql order by和limit共用bug

- - 数据库 - ITeye博客
 在mysql下执行没有问题,可以得到预期结果. 但是用jdbc执行的时候就得不到预期结果了. 官网地址:http://bugs.mysql.com/bug.php?id=32933. 以下转载:http://bbs.chinaunix.net/thread-1276235-1-1.html. 我想从一个表中检索所有标题含有“中国”的数据,将它们按id排序,取前5条,所以我写了以下语句.

Java 7被发现含有严重bug

- Jingzhi - Solidot
甲骨文在Java 7中作出某些改变时,可能没很好的进行测试;但在发现严重bug后,它仍按时间表推出了Java 7. Java 7和Java 6都存在相同的bug,不同之处是前者默认启用,而后者没有. HotSpot Loop优化中的bug可能会导致JVM崩溃,或者是执行错误. Bug影响了多个Apache项目,包括Apache Lucene Core和Apache Solr.