丰田意外加速与大碗‘Spaghetti’代码 (2013)
Source: Hacker News
2013 年 11 月 7 日
背景
上个月,丰田在俄克拉荷马州陪审团认定该公司“鲁莽漠视”并将 300 万美元的判决金返还给原告后,数小时内就与一桩意外加速(UA)诉讼达成和解。陪审团尚未对惩罚性赔偿作出裁决。
此案源于 2007 年 9 月一起 UA 事件,涉及一辆 2005 年款丰田凯美瑞。Jean Bookout 与乘客 Barbara Schwarz 正在俄克拉荷马州的 69 号州际公路出口处驶离时,油门失控。服务刹车未能停住车辆;Bookout 拉起手刹,右后轮留下约 150 英尺的刹车痕,左轮留下约 25 英尺的痕迹。凯美瑞继续沿坡道行驶,撞上堤岸,Schwarz 当场死亡。Bookout 在五个月的恢复期后存活下来,但留下头部和背部伤害。
Beasley Allen 律师事务所的 Graham Esdale 律师指出,黑色刹车痕是判决的关键要素:
“丰田根本无法解释这些痕迹。刹车痕表明她在刹车。”
审判与陪审团反应
尽管证词技术性很强,陪审团仍保持高度参与。得知和解后,陪审员们询问法官 Patricia Parrish 是否可以留下来讨论审判。约十二名陪审员、法官以及原告律师聚在一起,Esdale 观察到这场对话清楚表明陪审团已准备好因丰田的行为和所谓的掩盖而惩罚它。
专家证词
两位软件专家——Phillip Koopman 与 Michael Barr——对丰田的软件开发流程和源代码进行了详细分析。他们的发现突显了诸多缺陷,包括可能的位翻转、任务死亡导致的安全保护失效、内存损坏、单点故障、对栈和缓冲区溢出的防护不足,以及使用成千上万的全局变量。
Michael Barr
Barr 是嵌入式软件专家,在受保护的安全环境中审阅丰田源代码超过 20 个月,撰写了 800 页报告并就具体代码问题作证。以下是他证词的关键摘录:
“有大量函数过于复杂。按照行业标准指标,其中一些是不可测试的,意味着它们的配方如此复杂,以至于无法制定可靠的测试套件或测试方法来覆盖所有可能的情况。有些甚至复杂到被称为不可维护的程度,这意味着如果你去修复一个 bug 或进行更改,极有可能在此过程中产生新的 bug。
…
他们的安全保护本身就存在缺陷或漏洞。但总体来看,安全架构像一座纸牌屋。很可能在油门控制失效的同时,大比例的安全保护被同时禁用。”
Barr 还指出,丰田的一名程序员在 2007 年 10 月的文档中将发动机控制应用描述为“spaghetti‑like”(意为“意大利面条式”)的代码。
Phillip Koopman
Koopman 是卡内基·梅隆大学教授、关键安全系统专家,他批评丰田的工程流程。他解释说,1995 年由汽车行业软件可靠性协会(MISRA)制定的行业编码标准将规则违规与软件缺陷关联:每 30 条违规大约对应三处轻微 bug 和一处严重 bug。
- NASA 工程师在 2010 年为 NHTSA 审查丰田代码的部分时,发现 7,134 条 MISRA‑C 违规。
- Barr 自己对 2004 年版 MISRA 进行检查时,发现 81,514 条违规。
丰田拒绝采用 MISRA 标准,转而使用自己的流程,而该流程与行业惯例几乎没有交集。即便在自有指南中,程序员也经常违规且未记录偏离——这违背了标准的安全工程实践。
Koopman 强调,安全必须从一开始就嵌入开发“配方”中,不能事后再补:
“在编写安全关键软件时必须格外小心,不能随意应付。丰田确实做了一些工作,但他们没有达到业界公认的安全关键系统设计实践水平。”
具体软件缺陷
单点故障
Koopman 强调,丰田允许出现单点故障——即某一组件失效即可使整个系统不安全。他作证说:
“如果存在单点故障,根据我见过的所有安全标准,它在定义上就是不安全的,任何数量的对策或安全保护都无法根本解决。它们只能降低故障发生的频率,但无法彻底消除。因为我们有数百万辆车在路上,它总会以我们未预料的方式失效。”
过多的全局变量
安全关键代码的学术标准是零全局变量。丰田的代码中包含 超过 10,000 个全局变量。Koopman 评价道:
“在实践中,五个、十个、好吧,行。10,000 个,不行,我们完蛋了。这不安全,我甚至不需要看到全部 10,000 个全局变量就能知道这是个问题。”
缺乏同行评审与源码检查
两位专家都指出缺少代码同行评审,且丰田未检查其第二颗 CPU(由 Denso 提供)的源代码——尽管高层向国会和 NHTSA 保证发动机软件不可能是 UA 的原因。
任务死亡与“厨房水槽”任务
Barr 作证称,关键任务(审判中称为 Task X)的死亡很可能导致了 Bookout 的 UA 事件。他将 Task X 描述为“厨房水槽”任务,因为它控制了众多车辆功能,包括油门和巡航控制。
结论
Phillip Koopman 与 Michael Barr 的证词描绘了一幅软件开发过程充斥已知安全标准违规、复杂度过高以及防护不足的图景。他们的发现表明,2005 年凯美瑞意外加速的根本原因深植于车辆的软件架构,而非孤立的硬件故障。