トヨタの急加速事故は欠陥だらけのファームウェアが原因?――原告側調査の詳細:ビジネスニュース 企業動向(2/3 ページ)
2007年に米国オクラホマ州で、トヨタ自動車の乗用車「カムリ」が急加速したことによる死亡事故が発生した。事故をめぐる訴訟において、原告側証人として事故原因の調査を行った組み込みソフトウェアの専門家は、裁判で「カムリのエンジン制御モジュール(ECM)のファームウェアに重大な欠陥が見つかった」と報告した。
ハードウェア
今回の調査は主にECMのソフトウェアを中心として行われたが、ハードウェアに関連する要因も1つ上げられる。トヨタは、2005年モデルの「カムリ」のメインCPUにはRAMのエラー検出・修正機構(EDAC)を搭載していると主張しているが、実際には搭載されていない、あるいは、低コストのパリティのみに頼っている可能性があるという。
この他にも、スロットルに異常が生じる要因として、アクセルペダル位置センサーの内部にSn(スズ)ウィスカが発生するという問題がある。
ソフトウェア
今回の技術調査は、ECMソフトウェアに焦点を絞って行われた。
まず、ミラーリングが常時実行されていなかったことが明らかになった。ミラーリングでは通常、重要なデータが冗長変数に書き込まれる。スタックオーバーフローが発生する可能性を考えると、非常に重大な問題だといえる。
トヨタは、割り当てられたスタック領域のうち41%しか使用していないと主張していたが、Barr氏の調査の結果、実際に使われているのは94%だったことが分かった。さらに、コードの内部において、MISRA-Cに違反する再帰が発見された。これは、スタックにとっては致命的な問題だ。またCPUには、スタックオーバーフローを防ぐためのメモリ保護機能も搭載されていないという。
さらに、RTOSのクリティカルな内部データ構造と、スロットル角度関数という2つの重要なアイテムに対して、ミラーリングが不完全だったことが明らかになった。
トヨタはこれまでにスタック分析を実施しているが、それについてBarr氏は、「完全な失敗だ」と結論付けている。同氏はその原因として、ポインターを介して実行された一部のコールや、ライブラリ/アセンブリ関数(合計で約350)を用いたスタック使用量などに関する分析を行っていない点や、タスクの切り替え時にRTOSを使用していなかった点などを指摘する。さらに、ランタイムスタックモニタリングを実行していないという点も挙げている。
トヨタのETCSは、自動車業界の標準規格であるRTOS APIのOSEKバージョンを採用している。しかし何らかの理由で、CPUベンダーから供給されたOSEKバージョンが、認証規格に適合していなかったことが分かった。
RTOSタスクが意図せずにシャットダウンしてしまうという現象に関しては、UAが発生する原因の1つである可能性が高いことから、重点的に調査が行われている。メモリの中のシングルビットによって各タスクが制御されるため、ハードウェアまたはソフトウェアの欠陥によってデータが破損された場合、必要なタスクが一時停止したり、不要なタスクが実行されてしまう可能性があるという。車両テストを行った結果、特定の1つのデッドタスクによってスロットルの制御機能が失われることから、UAが発生した場合には、ブレーキから完全に足を外さなければ加速を止められないことが明らかになった。
この他にもコードに関する欠陥としては、バッファオーバーフローや、キャスティングの安全性が不十分であること、タスク間で競合状態にあることなど、さまざまな欠陥が見つかっている。
数々の問題点が明らかに
カムリのETCSには、グローバル変数が1万1000もあることが判明した。Barr氏は、“スパゲティコード”と評している。ソフトウェアの評価法である「循環的複雑度(Cyclomatic complexity)」で複雑度を計測したところ、67個の関数が“テスト不能”だった(スコアが50を超えるとテスト不能と評価される)。スロットル角度関数にいたっては、スコアが100以上で“メンテナンス不能”と評価された。
Barr氏は、「トヨタのプログラムは、自動車業界で広く採用されている『MISRA-C』への対応が不十分だ。準拠していない箇所が8万個も見つかった。トヨタの内部規格には、MISRA-C規格のうち11個のルールしか適用されていなかった。しかも、ETCSのコードは、そのうち5個に準拠していなかった」と述べている。MISRA-Cとは、欧州の自動車業界団体であるMISRA(Motor Industry Software Reliability Association)が策定したC言語のためのソフトウェア設計標準規格である。1998年に発行されたMISRA-Cの初版「MISRA-C:1998」には、93個の必要要件と34個の勧告要件があるが、トヨタはこのうちの6個にしか準拠していなかったのだ。
同氏は、「トヨタは、コードのピアレビューが不十分であるか、まったく行っていなかった可能性がある。バグ管理システムも存在しない」と指摘した。
NASA(米航空宇宙局)は、Barr Groupよりも前にトヨタ車の調査を行い、ETCSに実装された5つのフェイルセーフモードについて報告している。トヨタのフェイルセーフモードは、3つの「リンプホームモード(非常時の動作モード)」と、RPM(1分間当たりの回転数)制限、エンジンの停止で構成されている。だが、これらのフェイルセーフモードはすべて、同一タスクで処理されている。そのタスクが停止したり、故障したりした場合はどうなるのだろうか?
Copyright © ITmedia, Inc. All Rights Reserved.