A Case Study of Toyota Unintended Acceleration and Software Safety
betterembsw.blogspot.com
betterembsw.blogspot.com
1. The Throttle Angle function in the Toyota code had a McCabe Cyclomatic Complexity of 146 (over 50 is considered untestable according to slides) [slide 38]
2. The main throttle function was 1300 lines long, and had no directed tests. [slide 38]
3. I find the static analysis results quite alarming. [slide 37]
4. 80+% of variables were declared as global. [slide 40]
I find this to be a stunning lapse of quality, especially for a safety-critical system.
Edit: or peer review, or even a bug tracker. My coworkers working on web apps have a better SDLC than these jokers.
And curious about the lack of a bug tracking software. Many companies including the one I work for "technically" don't use them. I wouldn't call Rally or Trello a bug tracker but that do work just fine for that purpose.
I also did find it amusing that they called out lack of formal specifications as an issue given that Agile encourages you not to create them.
This is not common at all in safety-critical applications.
> I also did find it amusing that they called out lack of formal specifications as an issue given that Agile encourages you not to create them.
This shouldn't be amusing if you understand Agile. Agile is for systems where you don't yet fully know the scope or the desired end behavior. The guts of a production car are as waterfall as it possibly can get.
I've done a lot of both hardware and software, and I've seen a lot more bad software done by hardware engineers than I've seen bad hardware done by software engineers. The software guys usually know that they're out of their bailiwick when it comes to hardware design.
E.g. one of the worst in my experience was a 30,000 line shell script, few if any functions, used as part of our production flow. A simple refactoring could have cut it down at least 90%. Even worse, it was totally unsupported because the guy who wrote it was reassigned.
Not really, not if you have a realistic view of software. When I was an EE student, about half of my classmates loved software, the other half didn't like it and weren't good at it. And in silicon valley, a lot of EEs ended up doing software at all levels. I've always been jealous of how creative software could be, and didn't have the same limitations as hardware. Lots of hardware is usually programmed at low levels by EEs, which essentially ends up being drivers, and other board support software. They also realize that their training and education is not at the same level as software engineers in software.
BTW, it used to be that if you couldn't cut it in engineering, EE/ME/ChemE, and you wanted to pursue a technical degree, most people would go into computer science. I realize it's not like that today, but that's how it was back in the day.
The theory says that bad software is written when you don't have 100% test coverage, static analysis on checkins, peer review, pair programming, the usual guidelines around encapsulation, inheritance etc. The reality is that bad software mainly comes about through poorly thought out requirements, bad initial architecture decisions and ridiculous time constraints.
It's always a shame when you see stories like this that those aspects never really get investigated or analysed.
This is also broken down on slide 40 - local static and file static variables.
This is actually important for safety-critical programming. It lessens the likelihood of running out of stack space, and it's useful for eliminating dynamic allocation.
Some safety-critical software has 100% global variables, without even using a stack.
The abstraction of functional programming does not alleviate all of these issues, and can introduce other ones.
I've done enough embedded programming (and repairs on embedded programming projects) to know just how bad the spaghetti can get and it really wouldn't hurt to borrow a few leaves from the functional world in those cases.
This is not even counting all the variables declared with the wrong type or more than once, uninitialized variables, etc.
I very much question the experience of anyone who can refer to a codebase as "spaghetti code" without seeing it and relying solely on static analysis. Software is not that simple or transparent.
I've always wondered what the cyclomatic complexity of TeX is. While Knuth is a bit of an "edge case", it would be fun to see what static analysers think of his code... complete with copious use of global variables, goto, and very, very long functions. Give someone who has never had any experience with TeX the results and ask them what they think the defect rate would be, then show them the fact that it's one of the most bug-free pieces of software ever written.
Not doubting you, but do you have a source to demonstrate that claim? If I make the claim to someone else, it'd be easier to provide evidence than for me to handwave.
TeX version is 3.14159265, so some of those are probably bugfixes.
EDIT: Um. Look, I rarely complain about downvotes, but what's up with the downvoting on HN lately? Is it me, or what? This is a simple request for more information about something I don't know about. It's not an easy thing to Google. It's up to the parent to provide evidence.
https://www.google.com/search?q=tex+bug+free shows a lot of evidence that TeX is absent of bugs, but that's not the question. The question is the total bugs that have been fixed since it was first written relative to every other major software project. That's not so easy to answer. https://www.google.com/search?q=low+total+bug+count brings up nothing relevant. In fact, it could turn out to be entirely false that TeX had a low total bugcount over its history relative to its size, especially during its very days. We don't know, because no one has provided evidence one way or another.
All of this is exceedingly obvious, and it's getting tedious to type out huge edits like this whenever something straightforward is downvoted.
I'm seriously tempted to create my own community at this point out of desperation, one that focuses on technical merit and being nice rather than posturing. I wonder if one already exists? I've heard some pretty good things about newsgroups, but haven't really looked into any.
Knuth has kept a very detailed log of all the bugs he has corrected and changes he has made in the program since 1982; as of 2008, the list contains 427 entries, not including the version modification that should be done after his death as the final change in TeX.
The file is called "tex82.bug": http://mirrors.rit.edu/CTAN/systems/knuth/dist/errata/tex82....
Wikipedia is (slightly) out of date since there's 428 currently in the above file, but note that not all of these are actual (functionality-breaking) bugs, just changes; for example, #2 is just a renaming of variables and #425 is an optimisation.
That would be 428 total changes, in a span of a little over 32 years, with the majority of them extremely early in TeX's history - #214 was in 1983, #321 in 1985, #400 in 1991, #420 (a "missing goto") in 2007.
So it's not like people aren't looking for bugs.
I'll skip the sarcasm and say that yes I realize 3.14159265 is Pi.
I've noticed a rash of downvotes on posts coming all at once lately. As if somebody gets a bug somewhere unpleasant and goes to go downvote all of that person's posts that they can.
(Which AFAICT doesn't impact karma score, but does downvote all those posts.)
> I'm seriously tempted to create my own community at this point out of desperation, one that focuses on technical merit and being nice rather than posturing.
I'm down. Email's in my profile if you want to chat about the idea.
Ok, so I'll bite. The fact that not all bad code scores poorly on cyclomatic complexity scores does not imply that code that scores poorly in cyclomatic complexity isn't bad code.
So you wrote a function with cyclomatic complexity greater than some accepted value (50?) and you claim that it's well tested. I'm skeptical. How many of those code paths did you follow in your tests? What was the ratio of lines of logic code to lines of test code for that function? Can you really say that your tests provided adequate coverage of this function?
I've fixed a lot of cowboy-code with horrible cyclomatic complexity and no state separation, and this report about the 1500-line throttle control function dipping into system-global pool of universally-accessible variables sent shivers down my spine.
Which is why the top translation firms now offer... security!
In Japan, some journalists know, but media organizations won't publish the story.
I am the translator.
Also, Dr. Antony Anderson, who closely follows this technical issue on his blog, recently published a paper in IEEE Access about how software can be fooled by mechanical glitches such as intermittent connections:
http://ieeexplore.ieee.org/ielx7/6287639/6705689/06777269.pd...
(patience--this link is very slow)
Separately, speaking to your point about shifting to neutral, Dr. Anderson has noted that it is unreasonably risky to design a safety-critical system with the expectation that operator responses such as shifting to neutral can provide an effective failsafe. Would any of you here actually design such a system?
It seems the legal argument against Toyota is that they were not following industry standards - but if no one else was, could you really call it an industry standard?
In the talk, he did mention that the government agency that certifies vehicles does only basic checks and does not enforce any standards on software. One could easily argue that they are partially to blame, as they're leaving it up to the manufacturers.
http://www.safetyresearch.net/blog/articles/toyota-unintende...
And the slides (PDF):
http://www.safetyresearch.net/Library/BarrSlides_FINAL_SCRUB...
It appears as if neither theory has ever been proven. The slides argue that the standard of evidence in civil proceedings is simply "more likely than not" and not "beyond reasonable doubt".
Reading between the lines, I think this expert witness is arguing that anybody who writes code this terrible for a safety-critical application deserves to pay through the nose, irregardless of the actual chain of events.
Having said that, I would like an emergency stop button in cars (preferably one that works indepenently of the onboard computer).
I mean...geez.
Maybe just go with one of these http://thetimedok.files.wordpress.com/2013/02/big-red-button...
Which could account for some of the alleged age discrepancies, beyond the incident involving the police officer, which cannot be blamed on age/confusion.
The "old-fashioned" key ignition would have provided a much clearer interface to killing the engine. As would shifting into neutral, which is the obvious other option; dunno if there was a reason that wouldn't work.
The software development process seems so staggeringly, jaw-droppingly incompetent and negligent, and it now seems clear that software flaws really did kill people despite the heavy layer of spin that it was driver error, floor mats, etc.
I almost certainly couldn't buy a Toyota ever again knowing this. But it also really makes me wonder: how bad is the QA and testing for the software components of other carmakers' vehicles?
What makes you think any other car company is different/better?
Maybe we only got to know how horribly flawed the software situation is at Toyota because they had finally had enough people killed that they just couldn't keep it hidden any longer, and Audi and Honda are just as bad and just haven't yet had this kind of exposure event.
I would prefer to doubt that, but it does all kind of make me want to buy a restored 1978 Datsun with carburetors and mechanical everything.
It also is striking that the analysis could not provide an example of a single error condition that would cause the crash scenario. It's only a high level analysis.
But it is important to note that the post we are all commenting on here isn't "the" analysis. This is just an academic case study of this now-infamous and interesting case, based on public information.
The closest thing that we have to "the" analysis on this (since we will never see Toyota's internal analyses) is, as tokenrove linked to elsewhere in this thread, the one Michael Barr did that was the main analysis[1][2][3] used in the court case against Toyota.
But there have been a lot of other interesting articles and posts on this case, other than just this one.
[1] testimony part 1: http://www.safetyresearch.net/Library/Koopman%2010-11-13%20a...
[2] testimony part 2: http://www.safetyresearch.net/Library/Koopman%2010-11-13%20p...
[3] slides: http://www.safetyresearch.net/Library/BarrSlides_FINAL_SCRUB...
The hardest part I figure would be getting around the inevitable read protection but there are some folks that have done very interesting things in this arena (for instance, reading out pic chips that had their read fuses blown).
In the end the software is either correct or it is not.
For example, http://www.edn.com/design/automotive/4423428/Toyota-s-killer... quotes Barr's claims: "Toyota’s electronic throttle control system (ETCS) source code is of unreasonable quality." "Toyota’s source code is defective and contains bugs, including bugs that can cause unintended acceleration (UA)."
I am a little appalled at the number of apologist comments on this story. There is mounting evidence that this wasn't a "it could happen to anyone" bug, but rather a serious violation of software engineering ethics. Code must not kill.
Some of us do not believe that such a thing exists in any meaningful form. In the past every approach to creating reliable software has failed to deliver. That makes it hard to believe that any particular approach is finally the answer.
I agree that the Toyota software is poorly written. That in no way means that conforming to a particular standard or method would of automatically produced software that was more reliable.
I heard to a less reliable degree that the tools had been used, and results ignored.
I really hope they improved since then, for the sake of anybody driving a Toyota.
In work like this, you certainly wouldn't want to accidentally cause a negligent company to get off the hook because of an unimportant public statement.
The engine management on your parents' Honda cannot adjust the throttle percentage or gearing, only ignition and valve timing along with air/fuel ratios and gear hold-out timings. This could result in a surge of power, or a stalled car, but nothing like the experience of wide open throttle.
The Toyota UA is thought to have been rooted mostly in the fact that they adopted fly-by-wire throttle schemes while failing to compensate for the much more major software/hardware/management risks that come with such systems.