因为致命,所以关键
近日读了《致命Bug——软件缺陷的灾难与启示》这本书。这是一部用人类鲜血和泪水书写的软件Bug简史,一本业内资深人士写给同行和大众的案例分析书。纵观历史上出现过的重大系统事故,可以说不外乎都是嵌入式软件错误导致的,嵌入式软件漏洞引发的财产或什么安全方面的损失要比桌面软件漏洞大得多。人们对于那些优秀的、完美的软件抱有期待,但本书讲述的确是错误、失败,涵盖了汽车、金融、国防、航空、医疗、核电等领域,展示了软件错误是如何引发这些危险事故的,同时又带来了怎样的影响。
有些缺陷之前听说过,但是没有深入的去了解产生的原因和机理,例如爱国者导弹的软件缺陷。爱国者导弹防御系统时间的衡量计算是基于系统时钟时间乘以1/10所得到的秒数来进行表示的,且这个自动乘以1/10的运算是使用一个24位的定点寄存器来进行的。24位的寄存器只能存放24位的有效位,其余小数精度部分(0.000000095)会被砍掉。当时该爱国者导弹系统的电池已经启动了100个小时,这样下面一个很简单的计算公式就能计算出该砍掉的精度所导致的时间偏差会达到0.34秒之多(0.000000095×100×60×60×10=0.34)。飞毛腿导弹飞行的速度大概是1676米/秒,所以在0.34秒的误差时间内飞毛腿导弹就会产生超过近600米的误差。这个距离已经足够让正在飞来的飞毛腿导弹跨出爱国者导弹系统进行导弹跟踪的有效阈值。
丰田汽车踏板门事件则展示了有的软件缺陷实在是难于发现。从2002 年起,丰田对凯美瑞车型进行重新设计时,采用了新的油门踏板,使用电子节流阀向发动机发送信号,这个技术后来又用在雷克萨斯等其他车型。2004年初开始,NHTSA(National Highway Traffic Safety Administration,美国国家公路交通安全管理局)陆续接到一些用户反映,丰田汽车的凯美瑞和雷克萨斯会出现未踩油门的情况下突然加速的现象。NHTSA开展了调查,但并未发现问题,调查不了了之。后来,投诉依然不断,直到发生了十来起司乘人员丧生的事故后,丰田公司召回了380万辆汽车。2010年,NHTSA委托NASA调查电子节流阀是否是汽车突然加速的原因。经过十个月的调查,NASA的工程师们对电子控制设备的28万行源代码和各种电子设备进行了检测,没有发现问题。嵌入式软件专家Michael Barr不信邪,他组织自己公司的7名专家又进行了18个月的检测,发现凯美瑞的操作系统管理着24个任务,任务的堆栈余量很小。由于操作系统的缺陷,会导致某些任务发生堆栈溢出,更改数据结构,造成其他任务中断或挂起,从而失去节流阀的控制。结果是,当监控加速踏板的任务终止后,刹车处于踩下状态,驾驶者反而要完全松开刹车,汽车才会停止加速。2014年,丰田公司被美国司法部罚款12亿美元。
这本书的材料取之于公开的事故调查报告,作者对于有些缺陷的细节描述不深入,有些逻辑也有点混乱,也算是本书的不足之处。不过,作为安全关键软件的从业者,常看看这些事故和归零报告,对于开发和测试工作都会常怀敬畏之心。