f****t 发帖数: 15913 | 1 发信人: andrews (旱鸭子), 信区: Auto_Fans
标 题: 丰田工程师真的该枪毙啊
发信站: BBS 未名空间站 (Sun Nov 3 00:14:23 2013, 美东)
看下面的这文章,我是无语了……
以前不知道什么是"在看不到的地方偷工减料", 这回见识了。 以后不敢买丰田车了
转贴自:http://club.tgfcer.com/thread-6817371-1-1.html 网友Kuzuryuusen的文章
----------------------------
【第一部分】背景简介
前几年闹得沸沸扬扬的丰田刹不住事件最近又有新进展。十月底俄克拉荷马的一次庭审
,2007年一辆2005年凯美瑞暴冲(Unintended Acceleration,UA)致一死一伤事件中
丰田被判有责。引起广泛关注的是庭审中主要证人Michael Barr的证词让陪审团同意丰
田的动力系统软件存在巨大漏洞可能导致此类事件。这是丰田在同类事件中第一次被判
有责。庭审过后丰田马上同意支付300万美元进入调解程序。
出于好奇,我漫不经心地下载了Barr的286页证词,却一下子被吸引住了。几天内读完
,算是对这次事件进行了一次深入了解。下面就从外行角度总结一下这份证词并尝试以
更简单的语言解释里面提到的暴冲原因以及丰田犯下的错误。
Barr的证词下载自他的个人博客Barr Code,但现在该文已经被删除。稍后找地方上传。
Michael Barr是谁?他是一位拥有20年以上行业经验的嵌入式系统工程师。在十八个月
中,有12位嵌入式系统专家,包Barr,受原告诉讼团所托,被关在马里兰州一间高度保
安的房间内对丰田动力控制系统软件(主要是2005年的凯美瑞)源代码进行深度审查。
这房间没有英特网,没有手机信号,他们进出不能携带任何纸张、记录甚至皮带。最后
的调查结果被写入一份800页,13章的详细报告。而鉴于保密协议,调查内容一直没有
公布,直至俄克拉荷马这次庭审才首度部分公开(报告本身似乎还没公开)。
回到正题。丰田的软件有没有缺陷?根据Barr的调查,答案是有。这其实是废话,任何
软件都会有缺陷,关键在于是什么样的缺陷。丰田的软件缺陷分为三类:
非常业余的结构设计。
软件设计的基本要求是模块尽量简单化,因为这样可以一来更易于阅读二来更易于维护
。但丰田的工程师显然没有遵循这原则。Barr使用一种工具自动根据代码的可能分支数
量评估函数的复杂度,结果是丰田的软件中至少有67条函数复杂度超过50,意味着运行
这个函数可能出现超过50种不同的执行结果,属于“非可测”级别。因为为了测试这50
个不同的结果,必须准备至少50条不同的测试用例以及相应的文档,在生产环境中一般
是不现实的。作为比较,Barr表示他自己的公司严格执行的其中一条规定就是任何代码
复杂度不能超过30,否则不合格。而在这67条函数中还有12条复杂度超过100,达到“
非可维护”级别,意味着一旦发现缺陷(Bug)也无法修复,因为实在太复杂,修复缺
陷的过程中会产生新的缺陷。其中最复杂的一条函数有超过1300行代码,146个可能执
行路径——正好用于根据各传感器数值计算节气门开关角度。
如果你不知道什么是节气门,那么这里我稍微解释一下。为了让内燃机运行,有三大要
素:燃油、空气和点火时机。空气和燃油的混合物进入气缸,被火花塞在正确的时间点
燃推动活塞并最终推动曲轴和车轮前进。在电喷技术发明以后直到2002年以前,三大要
素的燃油和点火时间是由电子设备控制,节气门机械连接加速踏板,由司机直接控制。
节气门大致是一个连接加速踏板的“空气龙头”——踩下去越多,“龙头”打开得越大
,允许越多的空气进入发动机输出更大的动力。2002年以后,丰田引入的“电子油门”
让电子系统掌管了最后一个要素:空气。加速踏板不再机械连接节气门,而是连接一些
传感器,由行车电脑将这些传感器数值计算成节气门开启角度再由马达控制节气门。我
们稍后会再讨论节气门开合。
极复杂的代码带来的是极复杂的功能。下面说一下被称为“厨房洗涤盆”的Task X。这
里先解释一下,丰田的软件系统和很多别的软件系统一样,都是由一个统领程序(称之
为“操作系统”)和若干小程序(称之为Task)组成。就好比电脑上跑的Windows是统
领全局的操作系统,网络浏览器和记事本是跑在操作系统上的小程序。丰田的系统里每
个Task都有自己的名字,但这些名字非常敏感,敏感到每次被提及的时候律师都要求法
庭内的没有阅读代码权限的人全部清场。为了减少清场次数,Barr将这个最重要的小程
序称为Task X。这个Task X有多重要呢?跟厨房里的洗涤盆一样重要。它负责非常多的
事情,包括计算节气门开启角度、速度监测和保持、定速巡航监测等等。Task X的不正
常运行被认为是暴冲事件的元凶。稍后会再继续讨论Task X。
还有一些别的匪夷所思的发现。比如丰田的软件包含了超过一万一千个全局变量。如果
你不知道什么是全局变量,那么只需要知道软件设计的一般原则是要尽量少使用全局变
量,因为有可能带来无法预测的结果。这里的“少”的意思是“尽量接近零”,绝对不
会是一万一千个。
不符合软件开发规范。
如同很多行业一样,汽车行业也有自己的规范。更具体一点,由于汽车的危险性质,汽
车控制系统被划分为“安全关键性系统(Safety Critical System)”——说白了就是
安全性非常重要,弄不好会死人的。为了达到这一特殊要求,汽车相关软件开发人员定
期举行会议讨论并发布编程规范,称为MISRA C。该规范的2004年版的感谢列表里还能
看到丰田员工的名字,至少让外界认为丰田确实也在遵循这些规范。
真的吗?根据源代码来看,答案是否定的。对此之前的NASA报告也有所提及,丰田辩称
他们遵循的不是行业规范,而是丰田内部编程规范。这一规范与行业规范的吻合程度达
到50%。但是Barr认为根据他的调查,两个规范之间吻合度小于10%,甚至有若干规范条
目相互冲突。后来发现丰田的代码甚至没有遵循丰田内部规范,当然比起别的问题这个
已经无关紧要了。
MISRA C拥有超过100条规范,NASA的调查只使用了到其中35条进行校对,发现超过7000
处违规代码。Barr使用全部条目,对照结果是丰田的程序拥有超过80000处违规代码。
这些数字说明了什么?根据统计,违规数量可以用于预测代码中暗藏的缺陷(Bug)数
量。在之前提到的汽车相关软件开发人员会议中,有人就这一主题发表过专题演讲,提
出每30处违规代码可能包含一个重大缺陷和十个轻微缺陷。讽刺的是这人是丰田员工。
特别需要指出MISRA C其中一个规则的内容是不得使用递归。
如果你不知道什么是递归,那么这里我稍微解释一下。递归是一种计算方法。但一般计
算方法要么是自己算,要么询问别的计算模块索要结果。而递归则是通过问一层层问自
己的方法完成计算。好处是代码简单,坏处是计算层数不固定。可能会2层就出结果了
,也可能会是10000层,在设计程序的时候无从得知。
软件计算需要消耗存储器。越繁琐、越长的计算自然需要占用越多的存储器。递归的问
题在于其嵌套层数无法预测,从而导致可能消耗的存储器容量无法控制。稍后会再讨论
存储器。
对关键变量缺乏保护。
什么是变量?变量就是存在一段存储器的0和1的集合。这些变量既可以是一些函数的处
理结果,也可以是另一些函数的处理原材料。比方说前面提到有一条程序专门计算节气
门开合角度,比如说是20度,这个20就是一个变量,存在存储器的一个指定位置。另一
个程序专门负责开合节气门,它知道去那个指定位置读取这个20,然后把节气门开启20
度。
什么是保护?嵌入式系统,或者任何系统,都会在一定条件下发生硬件或者软件错误。
客观上这是无法避免的。而且汽车作为一个时常在震动、发热、位移的系统,它的内部
环境不能说不恶劣,发生硬件错误的可能性甚至更高。什么样的硬件错误呢?别忘了变
量都是0和1的组合,这些0和1由存储器上的高低电平代表。由于某些不可抗原因,一个
电平从高变成低,或者反过来,那么这个变量就被更改了。这被称为“位反转(Bit
Flip)”。为了对抗这样的事情发生,需要对变量进行保护。保护的方法一般是镜像法
。简单来说就是在两个不同的地方写入同一个变量,读取的时候两边都读,比较是不是
一致。如果不一致,那么可以得知这个变量已经不可靠,需要进行容错处理。
丰田的程序总体上对其上万个变量进行了有效保护,但问题出在操作系统上。前面提到
丰田的软件本质上分为操作系统和Task。Task是由丰田自己开发,但是操作系统则是由
芯片供应商提供,固化在芯片里的。丰田在这里的过失是没有对供应商提供的代码进行
深度审核,拿到什么用什么。
另一个保护措施是错误校验码(Error Detective and Correction Codes,EDAC)。这
是一个硬件层面的数据保护措施。简而言之就是给内存中每一个字节(8比特)后面物
理地增加几比特校验码。这样万一变量出错了,可以通过校验码得知,甚至可以通过校
验码修复一些轻微错误。这个措施十分简单有效,但是在2005年款凯美瑞的系统中完全
没有使用,丰田却告诉NASA他们用了。而在2008年款凯美瑞中使用了3比特长的EDAC。
Barr认为是为了节省成本,否则应该使用5比特长。
还有值得一提的是,汽车相关的软件行业有那么几家操作系统供应商,早已形成了一套
成熟标准称为OSEK。各供应商开发的符合OSEK认证的操作系统至少都能达到一定的质量
。但丰田选用的操作系统却没有通过认证,让人不解。
现在我们知道丰田在编写软件的时候至少有三种缺陷。那么重点问题:丰田的这些软件
缺陷是否会导致车辆暴冲?根据Barr的调查,答案是有可能。暴冲的起因需要结合上述
三种缺陷来说明。
汽车正常运行需要倚靠若干程序(这里叫Task)的同时运作。Task有很多,CPU只有一
块,在任何时刻只能处理一个Task,怎么办呢?这需要操作系统的统筹规划,合理分配
CPU的任务,让每个Task都能按时执行。如果出现某种意外,让某个Task突然不执行了
,那么就称为这个Task“死亡”。Task死了,自然不能执行它的任务。根据Barr的测试
,在某些特定情况下,Task X的死亡可以导致节气门敞开——因为Task X的其中一个任
务就是根据司机的操作计算节气门开合角度,它死了也就没法重新计算这个角度,即使
司机把脚挪开加速踏板,节气门也无法关闭。此为暴冲的直接原因。更糟糕的是,节气
门的开合角度这个数值,被Task X算出来以后保存在一个变量中。这个特定的变量正好
没有被保护(缺陷3)。意味着万一Task X死亡并且停止计算,这个数值有可能因为不
可抗原因被改变,而程序无从得知。
那么Task X为何会死亡呢?一般是因为内存出错。这个出错可能是一个小小的位反转,
也可能是内存里的数值被别的程序错误覆盖。同一系统内同时运行了若干程序,这些程
序需要共享一块内存,内存内部必然要被划分成若干块。比如第一块给程序1,第二块
给程序2,等等。如果程序1因为某些原因(比如Bug)写到第二块内存上去,就会导致
程序2读取了错误的信息。这就是所谓的内存出错。丰田的系统里,正好有这么两块相
邻的内存块。第一块被称为“堆栈(Stack)”,这是所有Task存储它们运行状态的地
方,大小为4KB。与之相邻的地方储存了操作系统进行任务分配的记录。那么可以想象
,如果很多Task给堆栈里写入太多东西,超过4KB,那么就会错误地写入与之相邻的任
务分配表。这种错误被称为“堆栈溢出”。操作系统拿到了错误的任务分配表,就会错
误地分配任务,造成某些Task多执行几次,某些Task少执行几次,某些Task甚至就再也
不执行——死了!必须指出的是,程序死亡并不罕见,甚至可以认为是正常现象。稍后
解释处理方法。
那么堆栈为什么会溢出呢?显然是因为要写入的数据超过了堆栈的容量。在设计程序的
时候要计算最坏的情况并且允许冗余。即使作出了正确的设计,这种错误也相对常见,
所以NASA在他们的调查中重点排查堆栈溢出的可能性。于是NASA问丰田,丰田的回复是
最坏的情况下4KB堆栈只写入了41%的数据,换句话说发生溢出的可能性非常低。NASA直
接取信了这个数字并没有再深入调查。但Barr他们发现丰田的回答有严重低估,实际上
最坏的情况会达到94%,而且还不算递归。丰田在代码中使用了递归(缺陷2)。因而实
际数字有可能超过94%而且无法预计上限,因为递归计算的嵌套层数是无法预测的。所
以实际情况下堆栈溢出的可能性相当可观。一旦溢出,相邻的任务分配表不可避免就会
遭到破坏。此为暴冲的根本原因其中之一。之所以说“其中之一”,是因为堆栈溢出仅
仅是损坏任务分配表的其中一个原因,别的还有许多可能性并没有被Barr在法庭上深入
解释。而且任务分配表的损坏也仅仅是导致Task死亡的原因之一。
顺便提一句,2005年的凯美瑞的这部分供应商是电装,没有搭载堆栈实时监测功能——
溢出了也不知道。同年的卡罗拉却搭载了,因为供应商是通用。
到这里我小结一下,串链子。左边是原因,右边是后果。
堆栈溢出→(可能导致)→任务分配表被改写→(可能导致)→Task X死亡→(可能导
致)→节气门敞开→(导致)→汽车暴冲
必须指出的是,这条链子从最左边一直到Task X死亡,都还算是嵌入式系统的常见故障
。虽然程序代码写得不好也许导致更容易出错,客观上丰田并没有特别大的过错。只要
处理得当,这些故障都不会导致暴冲。
到此为止还只是前奏而已,接下来我们来看看丰田到底做错了什么。
【第二部分】丰田之罪
上面反复提到,嵌入式系统中内存出错或者程序死亡其实是一种正常现象——至少从
Barr的证词可以得出这个结论——现在连我们都知道了,嵌入式工程师肯定比我们更清
楚才对。确实,为了使系统正常运行不被错误干扰,一般的做法是设置若干层防护措施
(Failsafe),让运行中出现的错误无法轻易突破,得到妥善处理。丰田的工程师自然
也懂得这一点。很可惜,他们搞砸了。
上面那条链子应该修改成这样:
(防护措施0)→堆栈溢出→(防护措施1)→(可能导致)→任务分配表被改写→(防
护措施2)→(可能导致)→Task X死亡→(防护措施3)→(可能导致)→节气门敞开
→(防护措施4)→(导致)→汽车暴冲
可以看到,防护措施不可谓不多。只要处理得当,这链条应该是走不通的。现在让我们
从左到右看一个小小的内存错误是如何一层层突破防护最终导致汽车暴冲的。
首先防护措施0。这个其实上面提到了,因为设计缺陷低估了最大占用的存储容量,并
且不符合规范地使用了递归,最终可能导致堆栈溢出。
然后到防护措施1。上面也提到了,任务分配表紧邻堆栈。作为外行我都觉得这是个十
分危险的设计——既然堆栈这么容易溢出,好歹应该将任务分配表放远一点啊。当然我
是外行,可能实际上比想象中复杂很多。这段Barr的证词中并未特别提到,属于我的个
人理解。
防护措施2。从这里开始丰田的错误越发严重。任务表被改写导致某些Task运行异常,
在软件层应该有若干检测措施,比方说用特殊的监视Task来监视别的Task是否正常。但
丰田是怎么做的呢?还记得上面的“厨房洗涤盆”Task X吗?它是如此复杂(缺陷1)
,除了控制汽车运行的任务之外竟然还兼任大部分的监视任务,比如生成DTC。
DTC(diagnostic trouble codes),是汽车电脑系统会根据情况生成的错误代码。有
的车主可能会遇到汽车某报警灯常亮,修车师傅拿个仪器插在行车电脑上得出一个代码
,再查表就知道哪个元件坏了——这就是DTC。除了用于修车,DTC还被用于检测行车电
脑和各传感器的异常状态。
可以想象,这个既是运动员又是裁判的Task X一旦死亡,软件层的检测措施大部分就失
效了。
防护措施3。在这里丰田的错误开始到达顶峰。即使设置正确无误,上面提到的监视
Task也只不过是另一个Task而已,与它的监视对象算是平级——监视Task自己同样有可
能出现故障。嵌入式系统的一般做法是在所有程序之上再设置一道屏障,被称为“看门
狗(Watchdog)”。所谓看门狗,是一个优先级很高的倒计时程序。别的程序需要在运
行的时候特意去重置一下这个计时器让它重新开始倒计时,这个动作被称为“喂狗”。
如果因为程序出问题太长时间不喂狗,倒计时完成,看门狗知道什么地方卡住了,马上
采取措施,比如重启整个系统。重启系统听起来似乎很严重,实际上却是一件相当普通
的事情。嵌入式系统的重启非常快,时速100公里的汽车中动力系统可以在半米之内完
成重启——车上的人根本觉察不到。
通过阅读代码和拟真实验,Barr惊讶地发现上述嵌入式系统的常识性做法竟然在丰田软
件系统内不存在!丰田的软件确实有一只看门狗,但它竟然不是用于监视Task异常,而
是用于防止CPU过载。首先这个做法不能说后无来者至少算是前无古人。还记得上面提
到的800页13章的报告吗?目瞪口呆的Barr将丰田看门狗的分析结果写入了报告的第一
章,因为他实在太震惊。其次,丰田看门狗的防止CPU过载功能也相当蹩脚,在拟真测
试发现即使它正常工作,还是会允许CPU过载时间长达1.5秒——时速100公里的车能跑
40米以上。CPU一旦过载,就会导致所有的Task进入一种“假死”状态,无法处理信息
,这时司机无法控制汽车动力,十分危险
另外,丰田的工程师还犯了一个嵌入式课堂上被反复提到的经典错误:使用硬件时钟中
断喂狗。硬件中断拥有非常高的优先级,即使Task卡住(比如出现死循环)也不能阻止
硬件中断——可想而知这样一来看门狗就等于完全白瞎了。
这里也提一句,同年的普锐斯却令人意外地搭载了一只运作正常的看门狗,反而让人摸
不着头脑。
还没完。这一层防护是嵌入式系统的关键阵地。前面都是电子系统,后面马上进入机械
运作,足以造成灾难了。所以仅仅拥有软件级别的防护还不足够,丰田的做法是在主
CPU之外单独设置了一块监视芯片,从硬件级别对系统的运作进行监视。监视芯片有两
个任务。第一,它运行一种叫做系统卫士(System Guard)的程序,原理上来说是专门
用于防止暴冲。主CPU和监视芯片上都会运行系统卫士,可是研究发现Task X一旦死亡
,这些系统卫士统统都不起作用了。第二,它运行一个被称为“刹车回声检查(Brake
Echo Check)”的程序。这个程序从代码上来看似乎可以检测出Task X的死亡,并且采
取相应措施:关闭节气门。听起来像是好消息,但是同样有问题:首先这个程序不太可
靠,即使正常运行,理论上也有失效的可能。最关键的是该程序不会自动运行,需要司
机先对刹车踏板有“动作”才会触发。注意这里我特意没用“踩刹车”这个词,因为根
据分析“触发动作”十分令人困惑。它分两种情况:如果Task X死亡的那一刻司机的脚
不在刹车踏板上,那么触发动作是踩刹车。还算可以理解。另一种情况,如果Task X死
亡那一刻司机的脚踩在刹车踏板上,那么触发动作是完全释放刹车踏板。没错,察觉车
子在不正常加速的司机需要停止踩刹车才能让控制系统关闭节气门!这种违背人类认知
的行为应该不是丰田工程师特意设计的。如果是,他们到底在想什么啊?
到此为止,上面提到的都算是“战术层面”的错误,都是“小错”。在讲解这块监视芯
片的时候,可以发现丰田犯下最严重的“战略层面”错误——基础设计。Barr认为,如
果基础设计正确,上述那些小错都完全不会导致汽车暴冲——不管代码写得多业余,不
管内存错误多严重,不管Task死得多频繁,统统不会致命。让我们回到2002年以前,没
有电子油门的时候。那时候的拉线油门是由油门踏板机械连接的。当驾驶员的右脚踩下
刹车,他的右脚必然不在油门踏板上,节气门自然而然地被关闭。这个动作如此自然,
甚至算不上安全措施,仅仅因为每人只有一只右脚,不可能同时踩油门和刹车。当丰田
设计电子油门的时候,只要稍微有点常识,都应该从设计阶段就将这一“自然而然”发
生的动作考虑进去。但是很显然,他们没这么做。监视芯片上运行的代码是用汇编语言
(一种更加接近机器执行代码,远离人类语言,更加难懂的编程语言)编写的,运行层
次比主CPU的C语言更低。Barr认为如果设计得当,现有的监视芯片完全有能力胜任上述
功能,需要的仅仅是几百行代码,别的什么都不用更改——不会提高任何生产成本。很
遗憾,他们没有做到。
防护措施4。现在已经脱离电子系统,节气门已经敞开,发动机全速运转,需要使用机
械运作来组织机械运作了。如何让向前冲的车子停下来?不开车的人都知道,刹车!现
代汽车都装备了刹车助力,助力来自于发动机运转的时候产生的负压。我们知道发动机
需要吸入空气,吸入体积等于排气量乘以转速。节气门又是用来阻挡空气的,那么节气
门关闭而发动机转速相对高的时候(比如高速丢油门),发动机的实际空气吸入量比它
能吸入的体积要少,那么从节气门到气缸进气口之间会形成明显低气压(所谓负压,比
大气压力小)。刹车助力就是利用了这个负压推动气鼓产生更大的推力带动刹车片抓紧
刹车盘。但是如果节气门敞开让空气随便进来,低气压就不存在了,这时刹车助力大大
减弱,刹车效率也大大降低。这就是为什么暴冲事件当事人都说全油门的时候根本刹不
住的重要原因。这个现象称为“真空损失(Vacuum Loss)”,存在于所有自然吸气的
汽油发动机汽车(柴油和增压发动机没影响),不算丰田的错。但丰田迟迟不搭载刹车
优先系统(Brake Override System)允许刹车的同时敞开节气门,毫无疑问是这个现
象的帮凶。
所谓刹车优先系统,指的是保证同时踩下刹车油门两个踏板的时候无条件关闭节气门的
功能。这么做很显然主要是为了降低发动机输出,同时也保证刹车助力。丰田在2010年
的凯美瑞上终于搭载了刹车优先系统,但是别高兴得太早。根据Barr的调查,丰田竟然
将如此重要的修改“理所当然”地写入了他们的“厨房洗涤盆”——Task X。我只能“
哑然失笑,扼腕叹息”。
好了,到此为止都还是Barr的一面之词,而且大部分都是在那间守卫森严的房间内进行
拟真测试得出的“理论结果”。那么实车测试情况如何呢?丰田对Barr的证词如何反驳
呢?
先说说实车测试。为了证明理论,他们把2008年和2005年的凯美瑞放在马力机上,固定
车身架起前轮模拟车辆运行情况。他们的做法是首先让车子运行在时速68英里(110公
里),启动巡航,脚离开油门踏板。然后暂停巡航,速度开始下降。下降到一定程度恢
复巡航,速度开始上升。在到达68英里的设定时速以前,他们用一台连接行车电脑的笔
记本“注入”错误。所谓注入错误,就是人为地翻转一个特定字节——将0改成1,或者
反过来——模拟内存损坏。结果完全符合理论,时速超过68英里也不停止加速,直至时
速90英里(145公里),测试人员踩下刹车。大约1秒以后节气门被关闭,Barr认为这是
上述“刹车回声检查”的功劳。
实车测试证明了Barr的理论,却并不是全无破绽。丰田辩护律师就两点提出质疑:
实车测试使用人工注入错误的方法,并不能证明现实中这种错误就一定会发生。
对此Barr的回答是测试的局限性。因为测试时间、样本有限,而待测试的样本空间无穷
大。如果要等待那个特定的错误自然出现,可能需要成百万上亿小时的不间断测试,显
然是不现实的。更何况从科学上而言,没有办法对这个错误证伪——就好比无法证明宇
宙里没有外星人,最多只能证明火星上找不到而已。但是这个测试足以证明一个小小的
位翻转确实可以突破重重障碍最终导致暴冲,足以证明丰田的软件存在不能容忍的隐患。
Bookout女士(本案原告)声称,在她驾驶汽车离开高速的时候发现不受控加速,她拼
命反复踩下刹车并且拉起手刹,现场留下了刹车痕迹。但并没有迹象表明发动机动力中
断——换言之“刹车回声检测”没起作用。暗指Barr的理论站不住。
对此Barr的回答是首先尽管在实车测试中每次都生效,但代码分析表明“刹车回声检查
”这一功能在理论上靠不住。其次这一功能的另外一个触发动作是要让脚完完全全离开
刹车踏板。试想车子正在不受控地往前冲,任何人都会不由自主地踩刹车,让人完全不
踩刹车踏板根本就是违背认知的。Bookout女士即使如同她所称反复踩刹车,很可能只
是一直将脚放在踏板上往复运动,从未完全挪开。Barr还引用一位丰田自己的软件专家
的证词。该专家承认,如果发生暴冲的时刻脚正好接触到刹车踏板,并且之后一直没挪
开,那么汽车的暴冲距离“取决于还剩多少汽油”。
最后顺带说一下那份800页,13章的详细报告完成后,Barr将其提交给了丰田的软件部
门,等待他们的反驳。最终结果是“非常少(Very little)”,13章中的11章,包括
堆栈溢出的部分、代码混乱的部分、违反开发规范的部分、Task X过于臃肿甚至兼任节
气门控制和防护措施的部分、看门狗形同虚设的部分、无EDAC的部分、重要变量缺乏保
护的部分、使用了非标准化操作系统的部分,全部没受到任何形式的反驳。
【第三部分】后记
写到这里,谈谈人们比较关心的几点。当然还是外行眼光。
NASA / NHTSA怎么没发现这些问题?
NHTSA本身不具备检验电子系统的能力,于是委托NASA。NASA检验的是整个电控系统,
包括电控传动部分,范围比较宽,只有很少一部分资源被用于检验软件系统,也没有投
入足够的人力进行逐行代码审阅。更何况在很多关键问题,比如之前提到的EDAC的使用
、堆栈的设计,NASA都直接采信丰田的回复,最终被证明不正确。甚至NASA从来都没拿
到过监视芯片的源代码,丰田的说法是“他们没说要啊”。NASA报告虽然没能找到软件
系统导致暴冲的确切原因,但没有否定其可能性。与之相比Barr的团队全部都是嵌入式
系统专家,投入上千小时,深入程度甚至超过丰田自身对这个系统的理解(比如丰田没
看过供应商的OS代码,Barr看了)。
能否100%确定本案就是由软件错误造成的?
不能。并没有直接证据。诉讼团认为,软件错误造成该事故的可能性比软件错误没造成
该事故的可能性大(原文:more likely than not)。
这里再提一句,2005年款的凯美瑞没有搭载行车数据记录器(俗称“黑盒子”),后来
的车款渐渐开始搭载。但是Barr发现这个记录功能并不可靠,完全有可能记录错误信息
。比如司机踩刹车了可能会被记录成没踩。
本案的意义
之前虽然丰田赔了不少钱,但是从未在涉及人身伤害的案件上承责。所以本案意义在于
开先例。美国的法律又特别注重先例,今后丰田的法务部门要头疼了。
本案提到的有缺陷软件涉及了哪些车型?
全部是美国的车型。Barr的调查重点是2005年款凯美瑞,另外审阅过的包括雷克萨斯ES
、Tacoma、卡罗拉和普锐斯等等,生产年份大致在2002年(电子油门元年)与2010年之
间。其中凯美瑞、雷克萨斯ES和Tacoma使用的软件系统大致接近(原文:
Substantially similar)。另外根据统计,汽车暴冲投诉中与2004年款以后的凯美瑞
有关的案件数量激增400%。
最后的最后,放上本案关键证人Michael Barr的独家访谈:
我:这么看来似乎手动档汽车更安全,你怎么认为?
Barr:很多专家都这么认为,离合器至少可以物理断开动力系统。但是我翻阅卷宗,发
现其中有个案例是受害者开手动档凯美瑞载着家人,突然巡航系统失灵,无法取消。他
踩下离合,同时试图躲避前方慢速车辆结果失控冲出路面造成单车事故。幸运的是没死
人。
我:现在我们都知道丰田的软件很糟糕。可是你对整个汽车行业的软件水平有什么看法
?丰田的软件在同行内属于什么水平?
Barr:我没有接触过丰田以外的软件代码。但是请注意,这次发现的最严重问题是丰田
在设计源头上没有考虑安全,软件质量反倒没有那么重要。只要一个安全为先的设计,
比如刹车和关闭节气门的可靠互动、防止节气门开启降低刹车效率的机制等等,不管软
件有多差劲也不会造成致命结果。只是我真不知道软件还能怎么差。
我:终极问题,你开什么车?
Barr:我不开丰田。接触该案以来我没买过新车。老实说我现在非常害怕买新车。我倒
是问过一个与车企斗争了三十多年的职业状棍同样的问题,他开宝马。
【全文完】
【版权没有,转贴注明出处】 |
t**x 发帖数: 20965 | 2 你的脑子该枪毙才是。
这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。 |
n***s 发帖数: 10056 | 3 Good read.
One of reasons not touch Toyota cars. |
k*********s 发帖数: 4474 | 4 这破逼程序代码review 怎么过的。
Sonar report都没用吧 |
l*******g 发帖数: 27064 | 5 左叉真是脑残
难怪张嘴就是fake news 社论
这结论明显是丰田水军造谣
美帝要是想敲诈丰田,非要等丰田隐瞒各种车祸,被调查4、5次以后,在奥黑旧车换新
车计划里赚走一半多的钱以后才进行?
【在 t**x 的大作中提到】 : 你的脑子该枪毙才是。 : 这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。
|
f****t 发帖数: 15913 | 6
你不光基因烂了,连良心都烂了。
【在 t**x 的大作中提到】 : 你的脑子该枪毙才是。 : 这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。
|
m*****p 发帖数: 39 | 7 日本人軟件確實差,這個是事實,但怎奈豐田汽車二手有市場,出手快,美國車德國車
沒人買啊。 |
l*******g 发帖数: 27064 | 8 你买新车的时候比同级别日车便宜3k,最后便宜3k 卖没人买才见鬼了
【在 m*****p 的大作中提到】 : 日本人軟件確實差,這個是事實,但怎奈豐田汽車二手有市場,出手快,美國車德國車 : 沒人買啊。
|
T*********s 发帖数: 20444 | 9 还真卖不出去
买过美国破产货的都知道
【在 l*******g 的大作中提到】 : 你买新车的时候比同级别日车便宜3k,最后便宜3k 卖没人买才见鬼了
|
K*****3 发帖数: 977 | 10 顶起来。
开过佳美和Sienna,悬挂肉乎乎不喜欢,配置低档,再也不会买。
凌志也不会买了。 |
|
|
f****t 发帖数: 15913 | |
f****t 发帖数: 15913 | 12 发信人: andrews (旱鸭子), 信区: Auto_Fans
标 题: 丰田工程师真的该枪毙啊
发信站: BBS 未名空间站 (Sun Nov 3 00:14:23 2013, 美东)
看下面的这文章,我是无语了……
以前不知道什么是"在看不到的地方偷工减料", 这回见识了。 以后不敢买丰田车了
转贴自:http://club.tgfcer.com/thread-6817371-1-1.html 网友Kuzuryuusen的文章
----------------------------
【第一部分】背景简介
前几年闹得沸沸扬扬的丰田刹不住事件最近又有新进展。十月底俄克拉荷马的一次庭审
,2007年一辆2005年凯美瑞暴冲(Unintended Acceleration,UA)致一死一伤事件中
丰田被判有责。引起广泛关注的是庭审中主要证人Michael Barr的证词让陪审团同意丰
田的动力系统软件存在巨大漏洞可能导致此类事件。这是丰田在同类事件中第一次被判
有责。庭审过后丰田马上同意支付300万美元进入调解程序。
出于好奇,我漫不经心地下载了Barr的286页证词,却一下子被吸引住了。几天内读完
,算是对这次事件进行了一次深入了解。下面就从外行角度总结一下这份证词并尝试以
更简单的语言解释里面提到的暴冲原因以及丰田犯下的错误。
Barr的证词下载自他的个人博客Barr Code,但现在该文已经被删除。稍后找地方上传。
Michael Barr是谁?他是一位拥有20年以上行业经验的嵌入式系统工程师。在十八个月
中,有12位嵌入式系统专家,包Barr,受原告诉讼团所托,被关在马里兰州一间高度保
安的房间内对丰田动力控制系统软件(主要是2005年的凯美瑞)源代码进行深度审查。
这房间没有英特网,没有手机信号,他们进出不能携带任何纸张、记录甚至皮带。最后
的调查结果被写入一份800页,13章的详细报告。而鉴于保密协议,调查内容一直没有
公布,直至俄克拉荷马这次庭审才首度部分公开(报告本身似乎还没公开)。
回到正题。丰田的软件有没有缺陷?根据Barr的调查,答案是有。这其实是废话,任何
软件都会有缺陷,关键在于是什么样的缺陷。丰田的软件缺陷分为三类:
非常业余的结构设计。
软件设计的基本要求是模块尽量简单化,因为这样可以一来更易于阅读二来更易于维护
。但丰田的工程师显然没有遵循这原则。Barr使用一种工具自动根据代码的可能分支数
量评估函数的复杂度,结果是丰田的软件中至少有67条函数复杂度超过50,意味着运行
这个函数可能出现超过50种不同的执行结果,属于“非可测”级别。因为为了测试这50
个不同的结果,必须准备至少50条不同的测试用例以及相应的文档,在生产环境中一般
是不现实的。作为比较,Barr表示他自己的公司严格执行的其中一条规定就是任何代码
复杂度不能超过30,否则不合格。而在这67条函数中还有12条复杂度超过100,达到“
非可维护”级别,意味着一旦发现缺陷(Bug)也无法修复,因为实在太复杂,修复缺
陷的过程中会产生新的缺陷。其中最复杂的一条函数有超过1300行代码,146个可能执
行路径——正好用于根据各传感器数值计算节气门开关角度。
如果你不知道什么是节气门,那么这里我稍微解释一下。为了让内燃机运行,有三大要
素:燃油、空气和点火时机。空气和燃油的混合物进入气缸,被火花塞在正确的时间点
燃推动活塞并最终推动曲轴和车轮前进。在电喷技术发明以后直到2002年以前,三大要
素的燃油和点火时间是由电子设备控制,节气门机械连接加速踏板,由司机直接控制。
节气门大致是一个连接加速踏板的“空气龙头”——踩下去越多,“龙头”打开得越大
,允许越多的空气进入发动机输出更大的动力。2002年以后,丰田引入的“电子油门”
让电子系统掌管了最后一个要素:空气。加速踏板不再机械连接节气门,而是连接一些
传感器,由行车电脑将这些传感器数值计算成节气门开启角度再由马达控制节气门。我
们稍后会再讨论节气门开合。
极复杂的代码带来的是极复杂的功能。下面说一下被称为“厨房洗涤盆”的Task X。这
里先解释一下,丰田的软件系统和很多别的软件系统一样,都是由一个统领程序(称之
为“操作系统”)和若干小程序(称之为Task)组成。就好比电脑上跑的Windows是统
领全局的操作系统,网络浏览器和记事本是跑在操作系统上的小程序。丰田的系统里每
个Task都有自己的名字,但这些名字非常敏感,敏感到每次被提及的时候律师都要求法
庭内的没有阅读代码权限的人全部清场。为了减少清场次数,Barr将这个最重要的小程
序称为Task X。这个Task X有多重要呢?跟厨房里的洗涤盆一样重要。它负责非常多的
事情,包括计算节气门开启角度、速度监测和保持、定速巡航监测等等。Task X的不正
常运行被认为是暴冲事件的元凶。稍后会再继续讨论Task X。
还有一些别的匪夷所思的发现。比如丰田的软件包含了超过一万一千个全局变量。如果
你不知道什么是全局变量,那么只需要知道软件设计的一般原则是要尽量少使用全局变
量,因为有可能带来无法预测的结果。这里的“少”的意思是“尽量接近零”,绝对不
会是一万一千个。
不符合软件开发规范。
如同很多行业一样,汽车行业也有自己的规范。更具体一点,由于汽车的危险性质,汽
车控制系统被划分为“安全关键性系统(Safety Critical System)”——说白了就是
安全性非常重要,弄不好会死人的。为了达到这一特殊要求,汽车相关软件开发人员定
期举行会议讨论并发布编程规范,称为MISRA C。该规范的2004年版的感谢列表里还能
看到丰田员工的名字,至少让外界认为丰田确实也在遵循这些规范。
真的吗?根据源代码来看,答案是否定的。对此之前的NASA报告也有所提及,丰田辩称
他们遵循的不是行业规范,而是丰田内部编程规范。这一规范与行业规范的吻合程度达
到50%。但是Barr认为根据他的调查,两个规范之间吻合度小于10%,甚至有若干规范条
目相互冲突。后来发现丰田的代码甚至没有遵循丰田内部规范,当然比起别的问题这个
已经无关紧要了。
MISRA C拥有超过100条规范,NASA的调查只使用了到其中35条进行校对,发现超过7000
处违规代码。Barr使用全部条目,对照结果是丰田的程序拥有超过80000处违规代码。
这些数字说明了什么?根据统计,违规数量可以用于预测代码中暗藏的缺陷(Bug)数
量。在之前提到的汽车相关软件开发人员会议中,有人就这一主题发表过专题演讲,提
出每30处违规代码可能包含一个重大缺陷和十个轻微缺陷。讽刺的是这人是丰田员工。
特别需要指出MISRA C其中一个规则的内容是不得使用递归。
如果你不知道什么是递归,那么这里我稍微解释一下。递归是一种计算方法。但一般计
算方法要么是自己算,要么询问别的计算模块索要结果。而递归则是通过问一层层问自
己的方法完成计算。好处是代码简单,坏处是计算层数不固定。可能会2层就出结果了
,也可能会是10000层,在设计程序的时候无从得知。
软件计算需要消耗存储器。越繁琐、越长的计算自然需要占用越多的存储器。递归的问
题在于其嵌套层数无法预测,从而导致可能消耗的存储器容量无法控制。稍后会再讨论
存储器。
对关键变量缺乏保护。
什么是变量?变量就是存在一段存储器的0和1的集合。这些变量既可以是一些函数的处
理结果,也可以是另一些函数的处理原材料。比方说前面提到有一条程序专门计算节气
门开合角度,比如说是20度,这个20就是一个变量,存在存储器的一个指定位置。另一
个程序专门负责开合节气门,它知道去那个指定位置读取这个20,然后把节气门开启20
度。
什么是保护?嵌入式系统,或者任何系统,都会在一定条件下发生硬件或者软件错误。
客观上这是无法避免的。而且汽车作为一个时常在震动、发热、位移的系统,它的内部
环境不能说不恶劣,发生硬件错误的可能性甚至更高。什么样的硬件错误呢?别忘了变
量都是0和1的组合,这些0和1由存储器上的高低电平代表。由于某些不可抗原因,一个
电平从高变成低,或者反过来,那么这个变量就被更改了。这被称为“位反转(Bit
Flip)”。为了对抗这样的事情发生,需要对变量进行保护。保护的方法一般是镜像法
。简单来说就是在两个不同的地方写入同一个变量,读取的时候两边都读,比较是不是
一致。如果不一致,那么可以得知这个变量已经不可靠,需要进行容错处理。
丰田的程序总体上对其上万个变量进行了有效保护,但问题出在操作系统上。前面提到
丰田的软件本质上分为操作系统和Task。Task是由丰田自己开发,但是操作系统则是由
芯片供应商提供,固化在芯片里的。丰田在这里的过失是没有对供应商提供的代码进行
深度审核,拿到什么用什么。
另一个保护措施是错误校验码(Error Detective and Correction Codes,EDAC)。这
是一个硬件层面的数据保护措施。简而言之就是给内存中每一个字节(8比特)后面物
理地增加几比特校验码。这样万一变量出错了,可以通过校验码得知,甚至可以通过校
验码修复一些轻微错误。这个措施十分简单有效,但是在2005年款凯美瑞的系统中完全
没有使用,丰田却告诉NASA他们用了。而在2008年款凯美瑞中使用了3比特长的EDAC。
Barr认为是为了节省成本,否则应该使用5比特长。
还有值得一提的是,汽车相关的软件行业有那么几家操作系统供应商,早已形成了一套
成熟标准称为OSEK。各供应商开发的符合OSEK认证的操作系统至少都能达到一定的质量
。但丰田选用的操作系统却没有通过认证,让人不解。
现在我们知道丰田在编写软件的时候至少有三种缺陷。那么重点问题:丰田的这些软件
缺陷是否会导致车辆暴冲?根据Barr的调查,答案是有可能。暴冲的起因需要结合上述
三种缺陷来说明。
汽车正常运行需要倚靠若干程序(这里叫Task)的同时运作。Task有很多,CPU只有一
块,在任何时刻只能处理一个Task,怎么办呢?这需要操作系统的统筹规划,合理分配
CPU的任务,让每个Task都能按时执行。如果出现某种意外,让某个Task突然不执行了
,那么就称为这个Task“死亡”。Task死了,自然不能执行它的任务。根据Barr的测试
,在某些特定情况下,Task X的死亡可以导致节气门敞开——因为Task X的其中一个任
务就是根据司机的操作计算节气门开合角度,它死了也就没法重新计算这个角度,即使
司机把脚挪开加速踏板,节气门也无法关闭。此为暴冲的直接原因。更糟糕的是,节气
门的开合角度这个数值,被Task X算出来以后保存在一个变量中。这个特定的变量正好
没有被保护(缺陷3)。意味着万一Task X死亡并且停止计算,这个数值有可能因为不
可抗原因被改变,而程序无从得知。
那么Task X为何会死亡呢?一般是因为内存出错。这个出错可能是一个小小的位反转,
也可能是内存里的数值被别的程序错误覆盖。同一系统内同时运行了若干程序,这些程
序需要共享一块内存,内存内部必然要被划分成若干块。比如第一块给程序1,第二块
给程序2,等等。如果程序1因为某些原因(比如Bug)写到第二块内存上去,就会导致
程序2读取了错误的信息。这就是所谓的内存出错。丰田的系统里,正好有这么两块相
邻的内存块。第一块被称为“堆栈(Stack)”,这是所有Task存储它们运行状态的地
方,大小为4KB。与之相邻的地方储存了操作系统进行任务分配的记录。那么可以想象
,如果很多Task给堆栈里写入太多东西,超过4KB,那么就会错误地写入与之相邻的任
务分配表。这种错误被称为“堆栈溢出”。操作系统拿到了错误的任务分配表,就会错
误地分配任务,造成某些Task多执行几次,某些Task少执行几次,某些Task甚至就再也
不执行——死了!必须指出的是,程序死亡并不罕见,甚至可以认为是正常现象。稍后
解释处理方法。
那么堆栈为什么会溢出呢?显然是因为要写入的数据超过了堆栈的容量。在设计程序的
时候要计算最坏的情况并且允许冗余。即使作出了正确的设计,这种错误也相对常见,
所以NASA在他们的调查中重点排查堆栈溢出的可能性。于是NASA问丰田,丰田的回复是
最坏的情况下4KB堆栈只写入了41%的数据,换句话说发生溢出的可能性非常低。NASA直
接取信了这个数字并没有再深入调查。但Barr他们发现丰田的回答有严重低估,实际上
最坏的情况会达到94%,而且还不算递归。丰田在代码中使用了递归(缺陷2)。因而实
际数字有可能超过94%而且无法预计上限,因为递归计算的嵌套层数是无法预测的。所
以实际情况下堆栈溢出的可能性相当可观。一旦溢出,相邻的任务分配表不可避免就会
遭到破坏。此为暴冲的根本原因其中之一。之所以说“其中之一”,是因为堆栈溢出仅
仅是损坏任务分配表的其中一个原因,别的还有许多可能性并没有被Barr在法庭上深入
解释。而且任务分配表的损坏也仅仅是导致Task死亡的原因之一。
顺便提一句,2005年的凯美瑞的这部分供应商是电装,没有搭载堆栈实时监测功能——
溢出了也不知道。同年的卡罗拉却搭载了,因为供应商是通用。
到这里我小结一下,串链子。左边是原因,右边是后果。
堆栈溢出→(可能导致)→任务分配表被改写→(可能导致)→Task X死亡→(可能导
致)→节气门敞开→(导致)→汽车暴冲
必须指出的是,这条链子从最左边一直到Task X死亡,都还算是嵌入式系统的常见故障
。虽然程序代码写得不好也许导致更容易出错,客观上丰田并没有特别大的过错。只要
处理得当,这些故障都不会导致暴冲。
到此为止还只是前奏而已,接下来我们来看看丰田到底做错了什么。
【第二部分】丰田之罪
上面反复提到,嵌入式系统中内存出错或者程序死亡其实是一种正常现象——至少从
Barr的证词可以得出这个结论——现在连我们都知道了,嵌入式工程师肯定比我们更清
楚才对。确实,为了使系统正常运行不被错误干扰,一般的做法是设置若干层防护措施
(Failsafe),让运行中出现的错误无法轻易突破,得到妥善处理。丰田的工程师自然
也懂得这一点。很可惜,他们搞砸了。
上面那条链子应该修改成这样:
(防护措施0)→堆栈溢出→(防护措施1)→(可能导致)→任务分配表被改写→(防
护措施2)→(可能导致)→Task X死亡→(防护措施3)→(可能导致)→节气门敞开
→(防护措施4)→(导致)→汽车暴冲
可以看到,防护措施不可谓不多。只要处理得当,这链条应该是走不通的。现在让我们
从左到右看一个小小的内存错误是如何一层层突破防护最终导致汽车暴冲的。
首先防护措施0。这个其实上面提到了,因为设计缺陷低估了最大占用的存储容量,并
且不符合规范地使用了递归,最终可能导致堆栈溢出。
然后到防护措施1。上面也提到了,任务分配表紧邻堆栈。作为外行我都觉得这是个十
分危险的设计——既然堆栈这么容易溢出,好歹应该将任务分配表放远一点啊。当然我
是外行,可能实际上比想象中复杂很多。这段Barr的证词中并未特别提到,属于我的个
人理解。
防护措施2。从这里开始丰田的错误越发严重。任务表被改写导致某些Task运行异常,
在软件层应该有若干检测措施,比方说用特殊的监视Task来监视别的Task是否正常。但
丰田是怎么做的呢?还记得上面的“厨房洗涤盆”Task X吗?它是如此复杂(缺陷1)
,除了控制汽车运行的任务之外竟然还兼任大部分的监视任务,比如生成DTC。
DTC(diagnostic trouble codes),是汽车电脑系统会根据情况生成的错误代码。有
的车主可能会遇到汽车某报警灯常亮,修车师傅拿个仪器插在行车电脑上得出一个代码
,再查表就知道哪个元件坏了——这就是DTC。除了用于修车,DTC还被用于检测行车电
脑和各传感器的异常状态。
可以想象,这个既是运动员又是裁判的Task X一旦死亡,软件层的检测措施大部分就失
效了。
防护措施3。在这里丰田的错误开始到达顶峰。即使设置正确无误,上面提到的监视
Task也只不过是另一个Task而已,与它的监视对象算是平级——监视Task自己同样有可
能出现故障。嵌入式系统的一般做法是在所有程序之上再设置一道屏障,被称为“看门
狗(Watchdog)”。所谓看门狗,是一个优先级很高的倒计时程序。别的程序需要在运
行的时候特意去重置一下这个计时器让它重新开始倒计时,这个动作被称为“喂狗”。
如果因为程序出问题太长时间不喂狗,倒计时完成,看门狗知道什么地方卡住了,马上
采取措施,比如重启整个系统。重启系统听起来似乎很严重,实际上却是一件相当普通
的事情。嵌入式系统的重启非常快,时速100公里的汽车中动力系统可以在半米之内完
成重启——车上的人根本觉察不到。
通过阅读代码和拟真实验,Barr惊讶地发现上述嵌入式系统的常识性做法竟然在丰田软
件系统内不存在!丰田的软件确实有一只看门狗,但它竟然不是用于监视Task异常,而
是用于防止CPU过载。首先这个做法不能说后无来者至少算是前无古人。还记得上面提
到的800页13章的报告吗?目瞪口呆的Barr将丰田看门狗的分析结果写入了报告的第一
章,因为他实在太震惊。其次,丰田看门狗的防止CPU过载功能也相当蹩脚,在拟真测
试发现即使它正常工作,还是会允许CPU过载时间长达1.5秒——时速100公里的车能跑
40米以上。CPU一旦过载,就会导致所有的Task进入一种“假死”状态,无法处理信息
,这时司机无法控制汽车动力,十分危险
另外,丰田的工程师还犯了一个嵌入式课堂上被反复提到的经典错误:使用硬件时钟中
断喂狗。硬件中断拥有非常高的优先级,即使Task卡住(比如出现死循环)也不能阻止
硬件中断——可想而知这样一来看门狗就等于完全白瞎了。
这里也提一句,同年的普锐斯却令人意外地搭载了一只运作正常的看门狗,反而让人摸
不着头脑。
还没完。这一层防护是嵌入式系统的关键阵地。前面都是电子系统,后面马上进入机械
运作,足以造成灾难了。所以仅仅拥有软件级别的防护还不足够,丰田的做法是在主
CPU之外单独设置了一块监视芯片,从硬件级别对系统的运作进行监视。监视芯片有两
个任务。第一,它运行一种叫做系统卫士(System Guard)的程序,原理上来说是专门
用于防止暴冲。主CPU和监视芯片上都会运行系统卫士,可是研究发现Task X一旦死亡
,这些系统卫士统统都不起作用了。第二,它运行一个被称为“刹车回声检查(Brake
Echo Check)”的程序。这个程序从代码上来看似乎可以检测出Task X的死亡,并且采
取相应措施:关闭节气门。听起来像是好消息,但是同样有问题:首先这个程序不太可
靠,即使正常运行,理论上也有失效的可能。最关键的是该程序不会自动运行,需要司
机先对刹车踏板有“动作”才会触发。注意这里我特意没用“踩刹车”这个词,因为根
据分析“触发动作”十分令人困惑。它分两种情况:如果Task X死亡的那一刻司机的脚
不在刹车踏板上,那么触发动作是踩刹车。还算可以理解。另一种情况,如果Task X死
亡那一刻司机的脚踩在刹车踏板上,那么触发动作是完全释放刹车踏板。没错,察觉车
子在不正常加速的司机需要停止踩刹车才能让控制系统关闭节气门!这种违背人类认知
的行为应该不是丰田工程师特意设计的。如果是,他们到底在想什么啊?
到此为止,上面提到的都算是“战术层面”的错误,都是“小错”。在讲解这块监视芯
片的时候,可以发现丰田犯下最严重的“战略层面”错误——基础设计。Barr认为,如
果基础设计正确,上述那些小错都完全不会导致汽车暴冲——不管代码写得多业余,不
管内存错误多严重,不管Task死得多频繁,统统不会致命。让我们回到2002年以前,没
有电子油门的时候。那时候的拉线油门是由油门踏板机械连接的。当驾驶员的右脚踩下
刹车,他的右脚必然不在油门踏板上,节气门自然而然地被关闭。这个动作如此自然,
甚至算不上安全措施,仅仅因为每人只有一只右脚,不可能同时踩油门和刹车。当丰田
设计电子油门的时候,只要稍微有点常识,都应该从设计阶段就将这一“自然而然”发
生的动作考虑进去。但是很显然,他们没这么做。监视芯片上运行的代码是用汇编语言
(一种更加接近机器执行代码,远离人类语言,更加难懂的编程语言)编写的,运行层
次比主CPU的C语言更低。Barr认为如果设计得当,现有的监视芯片完全有能力胜任上述
功能,需要的仅仅是几百行代码,别的什么都不用更改——不会提高任何生产成本。很
遗憾,他们没有做到。
防护措施4。现在已经脱离电子系统,节气门已经敞开,发动机全速运转,需要使用机
械运作来组织机械运作了。如何让向前冲的车子停下来?不开车的人都知道,刹车!现
代汽车都装备了刹车助力,助力来自于发动机运转的时候产生的负压。我们知道发动机
需要吸入空气,吸入体积等于排气量乘以转速。节气门又是用来阻挡空气的,那么节气
门关闭而发动机转速相对高的时候(比如高速丢油门),发动机的实际空气吸入量比它
能吸入的体积要少,那么从节气门到气缸进气口之间会形成明显低气压(所谓负压,比
大气压力小)。刹车助力就是利用了这个负压推动气鼓产生更大的推力带动刹车片抓紧
刹车盘。但是如果节气门敞开让空气随便进来,低气压就不存在了,这时刹车助力大大
减弱,刹车效率也大大降低。这就是为什么暴冲事件当事人都说全油门的时候根本刹不
住的重要原因。这个现象称为“真空损失(Vacuum Loss)”,存在于所有自然吸气的
汽油发动机汽车(柴油和增压发动机没影响),不算丰田的错。但丰田迟迟不搭载刹车
优先系统(Brake Override System)允许刹车的同时敞开节气门,毫无疑问是这个现
象的帮凶。
所谓刹车优先系统,指的是保证同时踩下刹车油门两个踏板的时候无条件关闭节气门的
功能。这么做很显然主要是为了降低发动机输出,同时也保证刹车助力。丰田在2010年
的凯美瑞上终于搭载了刹车优先系统,但是别高兴得太早。根据Barr的调查,丰田竟然
将如此重要的修改“理所当然”地写入了他们的“厨房洗涤盆”——Task X。我只能“
哑然失笑,扼腕叹息”。
好了,到此为止都还是Barr的一面之词,而且大部分都是在那间守卫森严的房间内进行
拟真测试得出的“理论结果”。那么实车测试情况如何呢?丰田对Barr的证词如何反驳
呢?
先说说实车测试。为了证明理论,他们把2008年和2005年的凯美瑞放在马力机上,固定
车身架起前轮模拟车辆运行情况。他们的做法是首先让车子运行在时速68英里(110公
里),启动巡航,脚离开油门踏板。然后暂停巡航,速度开始下降。下降到一定程度恢
复巡航,速度开始上升。在到达68英里的设定时速以前,他们用一台连接行车电脑的笔
记本“注入”错误。所谓注入错误,就是人为地翻转一个特定字节——将0改成1,或者
反过来——模拟内存损坏。结果完全符合理论,时速超过68英里也不停止加速,直至时
速90英里(145公里),测试人员踩下刹车。大约1秒以后节气门被关闭,Barr认为这是
上述“刹车回声检查”的功劳。
实车测试证明了Barr的理论,却并不是全无破绽。丰田辩护律师就两点提出质疑:
实车测试使用人工注入错误的方法,并不能证明现实中这种错误就一定会发生。
对此Barr的回答是测试的局限性。因为测试时间、样本有限,而待测试的样本空间无穷
大。如果要等待那个特定的错误自然出现,可能需要成百万上亿小时的不间断测试,显
然是不现实的。更何况从科学上而言,没有办法对这个错误证伪——就好比无法证明宇
宙里没有外星人,最多只能证明火星上找不到而已。但是这个测试足以证明一个小小的
位翻转确实可以突破重重障碍最终导致暴冲,足以证明丰田的软件存在不能容忍的隐患。
Bookout女士(本案原告)声称,在她驾驶汽车离开高速的时候发现不受控加速,她拼
命反复踩下刹车并且拉起手刹,现场留下了刹车痕迹。但并没有迹象表明发动机动力中
断——换言之“刹车回声检测”没起作用。暗指Barr的理论站不住。
对此Barr的回答是首先尽管在实车测试中每次都生效,但代码分析表明“刹车回声检查
”这一功能在理论上靠不住。其次这一功能的另外一个触发动作是要让脚完完全全离开
刹车踏板。试想车子正在不受控地往前冲,任何人都会不由自主地踩刹车,让人完全不
踩刹车踏板根本就是违背认知的。Bookout女士即使如同她所称反复踩刹车,很可能只
是一直将脚放在踏板上往复运动,从未完全挪开。Barr还引用一位丰田自己的软件专家
的证词。该专家承认,如果发生暴冲的时刻脚正好接触到刹车踏板,并且之后一直没挪
开,那么汽车的暴冲距离“取决于还剩多少汽油”。
最后顺带说一下那份800页,13章的详细报告完成后,Barr将其提交给了丰田的软件部
门,等待他们的反驳。最终结果是“非常少(Very little)”,13章中的11章,包括
堆栈溢出的部分、代码混乱的部分、违反开发规范的部分、Task X过于臃肿甚至兼任节
气门控制和防护措施的部分、看门狗形同虚设的部分、无EDAC的部分、重要变量缺乏保
护的部分、使用了非标准化操作系统的部分,全部没受到任何形式的反驳。
【第三部分】后记
写到这里,谈谈人们比较关心的几点。当然还是外行眼光。
NASA / NHTSA怎么没发现这些问题?
NHTSA本身不具备检验电子系统的能力,于是委托NASA。NASA检验的是整个电控系统,
包括电控传动部分,范围比较宽,只有很少一部分资源被用于检验软件系统,也没有投
入足够的人力进行逐行代码审阅。更何况在很多关键问题,比如之前提到的EDAC的使用
、堆栈的设计,NASA都直接采信丰田的回复,最终被证明不正确。甚至NASA从来都没拿
到过监视芯片的源代码,丰田的说法是“他们没说要啊”。NASA报告虽然没能找到软件
系统导致暴冲的确切原因,但没有否定其可能性。与之相比Barr的团队全部都是嵌入式
系统专家,投入上千小时,深入程度甚至超过丰田自身对这个系统的理解(比如丰田没
看过供应商的OS代码,Barr看了)。
能否100%确定本案就是由软件错误造成的?
不能。并没有直接证据。诉讼团认为,软件错误造成该事故的可能性比软件错误没造成
该事故的可能性大(原文:more likely than not)。
这里再提一句,2005年款的凯美瑞没有搭载行车数据记录器(俗称“黑盒子”),后来
的车款渐渐开始搭载。但是Barr发现这个记录功能并不可靠,完全有可能记录错误信息
。比如司机踩刹车了可能会被记录成没踩。
本案的意义
之前虽然丰田赔了不少钱,但是从未在涉及人身伤害的案件上承责。所以本案意义在于
开先例。美国的法律又特别注重先例,今后丰田的法务部门要头疼了。
本案提到的有缺陷软件涉及了哪些车型?
全部是美国的车型。Barr的调查重点是2005年款凯美瑞,另外审阅过的包括雷克萨斯ES
、Tacoma、卡罗拉和普锐斯等等,生产年份大致在2002年(电子油门元年)与2010年之
间。其中凯美瑞、雷克萨斯ES和Tacoma使用的软件系统大致接近(原文:
Substantially similar)。另外根据统计,汽车暴冲投诉中与2004年款以后的凯美瑞
有关的案件数量激增400%。
最后的最后,放上本案关键证人Michael Barr的独家访谈:
我:这么看来似乎手动档汽车更安全,你怎么认为?
Barr:很多专家都这么认为,离合器至少可以物理断开动力系统。但是我翻阅卷宗,发
现其中有个案例是受害者开手动档凯美瑞载着家人,突然巡航系统失灵,无法取消。他
踩下离合,同时试图躲避前方慢速车辆结果失控冲出路面造成单车事故。幸运的是没死
人。
我:现在我们都知道丰田的软件很糟糕。可是你对整个汽车行业的软件水平有什么看法
?丰田的软件在同行内属于什么水平?
Barr:我没有接触过丰田以外的软件代码。但是请注意,这次发现的最严重问题是丰田
在设计源头上没有考虑安全,软件质量反倒没有那么重要。只要一个安全为先的设计,
比如刹车和关闭节气门的可靠互动、防止节气门开启降低刹车效率的机制等等,不管软
件有多差劲也不会造成致命结果。只是我真不知道软件还能怎么差。
我:终极问题,你开什么车?
Barr:我不开丰田。接触该案以来我没买过新车。老实说我现在非常害怕买新车。我倒
是问过一个与车企斗争了三十多年的职业状棍同样的问题,他开宝马。
【全文完】
【版权没有,转贴注明出处】 |
t**x 发帖数: 20965 | 13 你的脑子该枪毙才是。
这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。 |
n***s 发帖数: 10056 | 14 Good read.
One of reasons not touch Toyota cars. |
k*********s 发帖数: 4474 | 15 这破逼程序代码review 怎么过的。
Sonar report都没用吧 |
l*******g 发帖数: 27064 | 16 左叉真是脑残
难怪张嘴就是fake news 社论
这结论明显是丰田水军造谣
美帝要是想敲诈丰田,非要等丰田隐瞒各种车祸,被调查4、5次以后,在奥黑旧车换新
车计划里赚走一半多的钱以后才进行?
【在 t**x 的大作中提到】 : 你的脑子该枪毙才是。 : 这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。
|
f****t 发帖数: 15913 | 17
你不光基因烂了,连良心都烂了。
【在 t**x 的大作中提到】 : 你的脑子该枪毙才是。 : 这种东西, 米帝要黑日本讹诈钱财, 救 GM而已。
|
m*****p 发帖数: 39 | 18 日本人軟件確實差,這個是事實,但怎奈豐田汽車二手有市場,出手快,美國車德國車
沒人買啊。 |
l*******g 发帖数: 27064 | 19 你买新车的时候比同级别日车便宜3k,最后便宜3k 卖没人买才见鬼了
【在 m*****p 的大作中提到】 : 日本人軟件確實差,這個是事實,但怎奈豐田汽車二手有市場,出手快,美國車德國車 : 沒人買啊。
|
T*********s 发帖数: 20444 | 20 还真卖不出去
买过美国破产货的都知道
【在 l*******g 的大作中提到】 : 你买新车的时候比同级别日车便宜3k,最后便宜3k 卖没人买才见鬼了
|
|
|
K*****3 发帖数: 977 | 21 顶起来。
开过佳美和Sienna,悬挂肉乎乎不喜欢,配置低档,再也不会买。
凌志也不会买了。 |
f****t 发帖数: 15913 | |
g*******l 发帖数: 138 | 23 说了这么多,最关键的是brake override有用吗?丰田几千万台车在马路上每年行驶几
千亿英里,按这个结论自动加速得到什么程度? |
E****a 发帖数: 3088 | |
a********6 发帖数: 389 | 25 美国车为啥便宜那么多也没人买啊?老百姓是SB不识货?
【在 l*******g 的大作中提到】 : 你买新车的时候比同级别日车便宜3k,最后便宜3k 卖没人买才见鬼了
|
E**********d 发帖数: 253 | 26 很显然在这家公司的软件部门工作的人都是混吃混喝的.
如果这可以代表日本软件的总体水平的话那日本只会越来越落后 |
r**m 发帖数: 1825 | 27 基本上硬件公司的软件都很烂,全局变量成百上千。
其他车厂也好不到哪里去。而且这种bug不容易查,tesla那样可以随时更新的也
还是要死人。
日本人的就更烂,当年决策失误的结果,
不过这个软件有可能是丰田的美国工程师写的。
链接:https://www.zhihu.com/question/23901564/answer/366532330
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
有些工程上的东西是没法提前预测的,只有等时间慢慢暴露问题。。。没别的意思,这
是客观规律。
比方说老飞机波音737 1967年4月9日首飞,到了1990年,全球有3000架飞机服役。相
当多的数量,不错的安全性,20年的考验,应该没有bug了吧?
但是。。。1991年3月3日,联合航空585号班机从丹佛国际机场前往科罗拉多泉机场途
中,飞机垂直尾翼的方向舵突然转向右面,然后翻滚,之后直接坠毁,机上乘客和机员
全部遇难。型号波音737-2911992年12月8日公布第一份调查报告:“NTSB经过彻底的研
究,都无法找出决定性证据去证明联合航空585号班机失事的原因”。
第二起全美航空427号班机于1994年9月8日在匹兹堡附近神秘坠毁。当飞机通过了一架
达美航空波音727客机飞过时留下的尾波乱流(wake turbulence),就在1,830米,距
离跑道10公里处突然向左转,然后随即失控俯冲。型号波音737-3B7调查人员取出方向
舵的液压装置化验,可是都找不出该装置曾被卡住的迹象。由于当天天气明朗且没有强
风,调查人员将注意力转移至机员身上。根据黑盒记录显示,副机长在飞机出事时直至
坠毁,一直紧踏着控制方向舵的踏板,因此一度怀疑副机长蓄意坠毁客机。可是调查人
员在聆听通话记录,都没有证据显示副机长有何异样——他显然是想挽救飞机,然而飞
机却原因不明地失控。因此,调查再度陷入僵局。
第三起1996年6月9日,东风航空517号班机突然亳无预警地向右倾侧,而方向舵像是被
卡死了般完全失控。于是机长调节引擎不均匀输出功率以求让飞机恢复水平飞行。过了
不久,飞机突然自行回复水平飞行。机长及副机长立即检查出了什么问题,但不久飞机
再一次向右倾侧,并且偏离了航道及失速坠下。不过,飞机不久后又再一次自行回复了
水平。由于担心会再发生第三次失控,机长立即宣告进入紧急状态,并要求副驾驶对塔
台说出他们遇到了什么问题,里奇蒙国际机场亦作出紧急戒备。最后,飞机安全着陆。
虽然这次事故没有人命伤亡,可是该737客机的失控情况与之前发生的三起空难事故,
即于1991年发生的联合航空585号班机,1992年发生的中国南方航空3943号班机及1994
年发生的全美航空427号班机原因非常相似:四宗事故都是于进场前发生;四者都是方
向舵突然失控令飞机倾侧(其中南航3943还包括了机组失误的原因)。
最重要的是:四宗事故的机型都是波音737,可是最后只有东风航空的飞机逃过一劫,
之前三宗事故,却造成共298人死亡,无人生还。因此,这次事故受到调查人员高度重
视,事故发生后第二天,调查人员立即抵达里奇蒙展开调查。由于飞机没有受损,加上
机长的证供,对于调查585号班机及427号班机两宗空难的工作有了突破进展。
调查人员根据东风航空事故的资料,对方向舵内的液压器做了一连串实验。结果证实,
这一装置在经过极端的温差,即3万呎高空的-50度至地面的30度(假设)时,就会被卡
住。全美航空427号班机和联合航空585号班机事发时都减速到了190节,此时方向舵突
然满舵转向导致了飞机坠毁;而这次航班进近时速度有250节,因此没有坠毁。调查结
果公布后,波音亦修改了所有737的尾舵设计,并全球性地为服役中的737客机更改有关
零件。
30年后才找到这个bug..
【在 f****t 的大作中提到】 : 发信人: andrews (旱鸭子), 信区: Auto_Fans : 标 题: 丰田工程师真的该枪毙啊 : 发信站: BBS 未名空间站 (Sun Nov 3 00:14:23 2013, 美东) : 看下面的这文章,我是无语了…… : 以前不知道什么是"在看不到的地方偷工减料", 这回见识了。 以后不敢买丰田车了 : 转贴自:http://club.tgfcer.com/thread-6817371-1-1.html 网友Kuzuryuusen的文章 : ---------------------------- : 【第一部分】背景简介 : 前几年闹得沸沸扬扬的丰田刹不住事件最近又有新进展。十月底俄克拉荷马的一次庭审 : ,2007年一辆2005年凯美瑞暴冲(Unintended Acceleration,UA)致一死一伤事件中
|
A****i 发帖数: 46 | 28 又是个打脸贴!
这么多打脸贴一起顶,某人是不是又要精神分裂去修养一阵子。 |
O*******d 发帖数: 20343 | 29 飞机的软件,有几个等级的认证,最高等级的用于发动机控制软件和姿态控制软件。每
个软件的所有path都要试验。 就是软件的if-else的所有组合都要测试。 不知道汽车
软件是否有认证系统。 |
O*******d 发帖数: 20343 | |
|
|
E****a 发帖数: 3088 | 31 考,全部通讯系统失灵,又是在色老师胡老师指导下设计的。为啥这回发动机操纵杆没
锁死?机载电脑太落后了,居然没搞个windows蓝屏一万个全局变量。
:即使飞机软件有严格的认证系统,也不能保证软件完全工作正常。
: |
s***p 发帖数: 355 | 32 re
【在 f****t 的大作中提到】 : 发信人: andrews (旱鸭子), 信区: Auto_Fans : 标 题: 丰田工程师真的该枪毙啊 : 发信站: BBS 未名空间站 (Sun Nov 3 00:14:23 2013, 美东) : 看下面的这文章,我是无语了…… : 以前不知道什么是"在看不到的地方偷工减料", 这回见识了。 以后不敢买丰田车了 : 转贴自:http://club.tgfcer.com/thread-6817371-1-1.html 网友Kuzuryuusen的文章 : ---------------------------- : 【第一部分】背景简介 : 前几年闹得沸沸扬扬的丰田刹不住事件最近又有新进展。十月底俄克拉荷马的一次庭审 : ,2007年一辆2005年凯美瑞暴冲(Unintended Acceleration,UA)致一死一伤事件中
|
d**********6 发帖数: 170 | 33 我参与过三菱的软件项目。日本人的软件能力真的很差。很差很差。而且特别官僚,论
资排辈,外行领导内行。没看过丰田的程序,可以猜的出好不了哪去。 |
D***I 发帖数: 1957 | 34 上次有个哥们进过丰田,看了一段时间,赶紧走人了
【在 d**********6 的大作中提到】 : 我参与过三菱的软件项目。日本人的软件能力真的很差。很差很差。而且特别官僚,论 : 资排辈,外行领导内行。没看过丰田的程序,可以猜的出好不了哪去。
|
f*********n 发帖数: 701 | |
s****a 发帖数: 6521 | 36 昨天在路上,前面一辆prius. 以前没留意过,这次定睛一看,玛雅,那轮子,比摩托
车轮子宽不了多少吧?开始还以为是备胎,可是看看另一个轮子,一模一样。 |
r***i 发帖数: 9780 | 37 丰田垃圾的轮胎标号大部分比对手都低至少1个标号,多的甚至有2、3个标号
好比6万多的es用的还标配215的17寸轮胎
人家不到2万的ford fusion上都标配225了,同价位的lincoln基本都是245起步
【在 s****a 的大作中提到】 : 昨天在路上,前面一辆prius. 以前没留意过,这次定睛一看,玛雅,那轮子,比摩托 : 车轮子宽不了多少吧?开始还以为是备胎,可是看看另一个轮子,一模一样。
|
w*******g 发帖数: 9932 | 38 靠。这样的工匠精神要人命啊。Drive by wire 的设计真是要命 |
f*********n 发帖数: 701 | 39
都这样了,还有人为丰田车新加的电子功能高潮,車道維持+全速域+自動起步+自動煞
停, 这些东西加上后,丰田车里会有两万个全局变量了,叔已经闻到BBQ的香味了,哈哈
×××××××××××××××××××××××××
发信人: trailblazer (开路者), 信区: Automobile
标 题: 2022 Rav4 逆天了
发信站: BBS 未名空间站 (Tue Apr 26 13:44:53 2022, 美东)
2022 Rav4 車道維持+全速域+自動起步+自動煞停
×××××××××××××××××××××××××
【在 w*******g 的大作中提到】 : 靠。这样的工匠精神要人命啊。Drive by wire 的设计真是要命
|
r***i 发帖数: 9780 | 40 丰田那套垃圾系统现在基本是最垫底的存在
形同虚设
https://www.mitbbs.com/article_t/Automobile/35759501.html
哈哈
【在 f*********n 的大作中提到】 : : 都这样了,还有人为丰田车新加的电子功能高潮,車道維持+全速域+自動起步+自動煞 : 停, 这些东西加上后,丰田车里会有两万个全局变量了,叔已经闻到BBQ的香味了,哈哈 : ××××××××××××××××××××××××× : 发信人: trailblazer (开路者), 信区: Automobile : 标 题: 2022 Rav4 逆天了 : 发信站: BBS 未名空间站 (Tue Apr 26 13:44:53 2022, 美东) : 2022 Rav4 車道維持+全速域+自動起步+自動煞停 : ×××××××××××××××××××××××××
|