专栏名称: 算法与数据结构
算法与数据结构知识、资源分享
目录
相关文章推荐
51好读  ›  专栏  ›  算法与数据结构

一行代码,“葬送”了 5 亿欧元:史上最贵 Bug 之一!

算法与数据结构  · 公众号  · 算法  · 2024-08-07 11:57

主要观点总结

本文讲述了在编程世界中,即便是微小的细节也可能决定成败,通过三个案例说明软件问题在高风险环境中的重要性,并给出了从中学到的教训和改进建议。

关键观点总结

关键观点1: 案例 1:阿丽亚娜 5 号火箭爆炸,因软件缺陷导致价值近 5 亿欧元的火箭发射失败。

分析火箭制导系统中的软件缺陷,包括死代码导致的整数溢出问题,以及由此引发的对地球磁层科学研究的影响。得到的启示包括理解代码含义、异常处理、用户需求变化的理解和适当的软件测试等。

关键观点2: 案例 2:未捕获的 SQLException 导致航空公司停飞。

描述工程师在进行数据库同步工作时删除文件导致的航班停飞事件。分析核心系统的问题,包括未处理的 SQLException 导致的资源池耗尽。讨论工程师如何更好地避免此类问题,强调避免系统中的 Bug 影响其他系统的重要性。

关键观点3: 案例 3:波音 737 MAX 的灾难,部分原因是一个旨在提高飞行安全的软件系统中的 Bug。

介绍 MCAS 系统的设计和初衷,分析系统中的关键 Bug 以及其对飞行员和乘客的影响。讨论从中学到的教训,包括消除单点故障、保持软件和系统简单、领域专业知识和糟糕的测试方法等。


正文

请到「今天看啥」查看全文


问题到底在哪里?事故源于上一代阿丽亚娜 4 号中的一段死代码(即程序中不会被执行到的代码),这段代码始于近十年前,其中包含了一个简单且可修复的编程错误。具体来说,火箭使用了一种称为“水平偏差”(也称为 BH 值)的方法来确定其指向是朝上还是朝下。该值由一个 64 位浮点变量来表示,然后由制导系统将其转换为 16 位带符号整数进行传输。

有一点需要注意:64 位浮点变量可以表示数十亿个数值,而 16 位只能表示 65,535 个数值。如果把首位用来存储符号(正/负),那么 16 位带符号整数的范围就是 -32,768 到 32,767。然而,浮点数用相同位数可以覆盖更大的数字范围,从 -1.8e+308 到 -2.2e-308。

也就是说,如果你把一个浮点数转换为 16 位带符号整数,那它将大幅超出其范围——于是在阿丽亚娜 5 号的代码中,便出现了一个常见的整数溢出问题。

如果按照阿丽亚娜 4 号的设定不变,这段代码也不会出现问题,但阿丽亚娜 5 号采用了比之前更陡的轨迹,从而导致了极高的垂直速度——于是代码出现了问题,制导系统持续向主计算机发送错误消息,主计算机误认为火箭已严重偏航,便触发了自毁机制。

从这次事件中得到了哪些启示?

(1)复制代码却不理解其含义是一个重要问题。

(2)缺乏适当的异常处理。

(3)忽略了用户需求的变化。

(4)缺乏适当的测试。

基于以上,当时调查委员会官方给出了一些相关建议:

(1)避免使用不需要的程序或系统。在飞行过程中,除非必要,否则软件不应运行。

(2)测试至关重要。用尽可能多的真实设备建立一个测试设施,添加真实输入数据,进行彻底的闭环系统测试。所有任务必须在完全实现模拟和高测试覆盖率下进行。







请到「今天看啥」查看全文