Toyota意外加速与大碗‘意大利面条’代码 (2013)
Source: Hacker News
背景
上个月,丰田在俄克拉荷马州陪审团认定该公司“鲁莽蔑视”并将原告的 300 万美元判决撤回仅数小时后,就一起意外加速(UA)诉讼达成和解。陪审团尚未对惩罚性赔偿作出裁决。
陪审团的决定受到两位原告软件设计专家证词的强烈影响,他们审查了丰田的工程流程以及 2005 年丰田凯美瑞的源代码。两位专家均得出结论:该系统存在缺陷、危险,并且充斥着错误和安全防护的漏洞。
Bookout 诉丰田案
此案源于 2007 年 9 月一次导致致命事故的 UA 事件。Jean Bookout 与乘客 Barbara Schwarz 正在俄克拉荷马州的 69 号州际公路出口处下车时,2005 年的凯美瑞失去了油门控制。
- 服务刹车未能阻止这辆失控的轿车。
- Bookout 拉起手刹,右后轮留下约 150 英尺的刹痕,左轮留下约 25 英尺的刹痕。
- 车辆继续沿坡道前行,横穿道路,撞上路堤。
Schwarz 当场死亡;Bookout 经过五个月的康复才从头部和背部受伤中恢复。
Beasley Allen 律师事务所的 Graham Esdale 律师指出,黑色刹痕是关键证据:
“丰田根本无法解释这些刹痕。刹痕表明她在刹车。”
在得知和解后,陪审员向法官 Patricia Parrish 询问是否可以留下来讨论审判。大约十二名陪审员、法官以及原告律师会面,交谈中显露出陪审团准备因丰田的行为和所谓的掩盖而对其进行惩罚的意向。
专家证词
两位软件专家——Phillip Koopman 与 Michael Barr——提供了关于丰田软件开发流程和源代码的详细见解。
- Michael Barr,嵌入式软件专家,在受控的安全环境中审查丰田代码超过 20 个月,撰写了 800 页报告,并就具体代码缺陷作证。
- Phillip Koopman,卡内基·梅隆大学计算机工程教授、《Better Embedded System Software》作者,作证丰田的工程安全流程。
两位专家均将代码形容为 “spaghetti code”——写得糟糕、结构混乱。
Barr 的观察
“有大量函数过于复杂。按行业标准的度量,这些函数是不可测试的……有些函数不可维护,意味着修复一个 bug 很可能会产生新的 bug……安全架构像纸牌屋。很可能在失去油门控制的同时,大比例的安全防护被同时禁用。”
Barr 还引用了丰田内部文件,其中一名程序员将发动机控制应用称为 “spaghetti‑like”。
Koopman 的批评
Koopman 强调丰田未遵循 MISRA(Motor Industry Software Reliability Association)编码标准,该标准首次发布于 1995 年。他解释说,每违反一条规则在统计上会引入 bug:约每 30 条违规会产生三条小 bug 和一条大 bug。
- NASA 工程师在 2010 年为 NHTSA 审查丰田代码的部分时,发现 7,134 条 MISRA‑C 违规。
- Barr 自己对 2004 年版 MISRA 的检查发现 81,514 条违规。
丰田使用了自有流程,与行业标准几乎没有重叠,并且经常在缺乏充分文档记录的情况下违反自身规则。
“如果安全性没有在产品创建过程的配方中烘焙进去,后期就无法再加入。” – Koopman
发现的主要软件缺陷
| 缺陷 | 描述 |
|---|---|
| 复杂、不可测试的函数 | 函数过于错综复杂,以致可靠的测试套件不可能实现;修复 bug 可能导致新 bug。 |
| 单点故障 | 关键硬件/软件组件一旦失效,整个安全系统将失效。 |
| 过多全局变量 | 超过 10,000 个全局变量(行业最佳实践:零)。 |
| 缺乏同行代码审查 | 没有系统化的源代码审查流程。 |
| 未检查的第二 CPU 代码 | 丰田未审查由 Denso 提供的第二 CPU 代码,尽管向国会和 NHTSA 保证发动机软件不可能是原因。 |
| 任务死亡 | CPU 内部任务意外终止,导致安全防护失效(例如控制油门和巡航的 “Task X” 或 “kitchen‑sink” 任务)。 |
| 安全防护设计不足 | 防护机制本身存在缺陷和漏洞,整体安全架构脆弱。 |
单点故障示例
“如果存在单点故障,按照我所见过的每一项安全标准,它的定义就是不安全的,任何对策、任何防护都无法弥补。” – Koopman
全局变量超载
“实际操作中,五个、十个、好吧、行。10,000 个,就不行了。我们完蛋了。这不安全,我甚至不需要看到全部 10,000 个全局变量就知道这是个问题。” – Koopman
结论
Koopman 与 Barr 的证词揭示了丰田 2005 年凯美瑞软件工程的一连串失败:未遵守既定编码标准、过度复杂、单点故障以及缺乏严格的安全流程。这些缺陷很可能导致了导致致命事故的意外加速事件,并最终导致 300 万美元的陪审团判决。此案凸显了遵循行业标准软件实践的重要性——尤其是在安全关键的汽车系统中。