著者: ダウウェイ・ビークルのCEO、ジョニー・リュー
公開日: 2026年7月21日
カテゴリ: 組み込みシステム、自動車安全、ハードウェアエンジニアリング、コンプライアンス
ダウウェイ・ビークルのCEOとして、自動車向けの安全上重要なシステムを開発・製造する当社では、信頼性が単なるチェックリスト上の項目ではないことを痛感しています。私たちの仕事では、検出されないチップの故障や一時的なソフトウェアエラーが、重大な安全上の問題を引き起こす可能性があるからです。
障害注入は、システムがエラーを適切に処理できるかどうかをテストする最も信頼性の高い方法です。このガイドでは、障害注入の主要な手法について解説し、障害を適切に処理し、IEC 61508などの規格を満たすシステムを設計するのに役立ちます。
Table of Contents
1. なぜ欠陥を注入する必要があるのか
1970年代半ば、宇宙ミッションにおいて、チップのエラーに起因する異常なシステム動作が初めて報告されました。それ以来、チップの設計者と製造者は信頼性の向上に重点を置かざるを得なくなりました。今日では、航空機、自動車、その他の重要システムにおけるデジタル回路がエラー発生時にどのように動作するかを分析する必要があります。故障注入試験は、この信頼性を評価する最良の方法の一つです。実際、IEC 61508などの機能安全規格では、開発サイクルのあらゆる段階で故障を注入することを強く推奨しています。
システムに障害が発生すると、多くの場合、深刻なクラッシュが発生し、貴重な状態データが失われます。また、エラーは目に見える問題を引き起こすまで長期間隠れたままになることもあります。そのため、稼働中のシステムで障害の根本原因を特定することは非常に困難です。大規模で複雑なシステム構成の場合、このような稀な障害状態を再現することはほぼ不可能です。
障害注入はこの問題を解決します。これにより、システムが以下の点でどれだけ優れているかをテストできます。
- 故障を検出します。
- 障害を隔離することで、障害の拡大を防ぎます。
- 安全に動作し続けるために、自己再構成を行う。
- 正常な状態に戻ります。
2. 障害注入環境内部
プロフェッショナルな障害注入環境は、構造化されたエコシステムです。ターゲットシステムを混乱させることなくテストを実行するために、9つの主要コンポーネントを使用します。
- 対象システム: テスト対象のハードウェアまたはソフトウェア。
- 故障インジェクター: エラーを引き起こすツール(ハードウェアまたはソフトウェア)。
- 障害ライブラリ: テストのパラメータ(障害の種類、場所、タイミング、ハードウェアまたはソフトウェアのルールなど)を格納する独立したデータベース。このライブラリを独立させることで、システム全体の柔軟性が高まり、他のプロジェクトへの移行も容易になります。
- ワークロードジェネレーター: 対象システムに運用コマンドを送信するツール。これらのコマンドは、実際のアプリケーション、標準化されたベンチマーク、または合成タスクのいずれかである。
- ワークロードライブラリ: あらかじめ設定されたワークロードとテストケースの集合。
- コントローラ: 実験全体を実行するプログラム。ターゲットシステム自体で実行することも、独立したホストコンピュータで実行することもできます。
- モニター: システムの実行状況をリアルタイムで追跡し、コマンドの実行時や異常発生時を特定するツール。
- データコレクター: モニターからの指示を受けて、システムデータをリアルタイムで記録するツール。
- データアナライザー: 収集したデータを処理・検証し、信頼性を測定するオフラインツール。
3. ハードウェア障害注入とソフトウェア障害注入の比較
ハードウェア方式とソフトウェア方式のどちらを選択するかは、テストしたい障害の種類と、それらをセットアップするために必要な労力によって決まります。
| 故障の種類/モデル | ハードウェア障害注入 | ソフトウェア障害注入 |
|---|---|---|
| オープンサーキット | はい | いいえ |
| 橋渡し | はい | いいえ |
| ビット反転 | はい | はい |
| 不要電流 | はい | いいえ |
| 電力サージ | はい | いいえ |
| 行き詰まった | はい(位置情報管理に最適) | 難易度が高い/コストが高い |
| 保存データの破損(メモリ、レジスタ、ディスク) | めったに | はい |
| 通信データの破損(バス、ネットワーク) | めったに | はい |
| ソフトウェア欠陥の顕在化(マシンレベルおよびそれ以上) | いいえ | はい |
スタックアット障害(物理的なラインが永久的に1または0に固定される状態)をテストしたい場合は、ハードウェアインジェクターを使用するのが最適です。ハードウェアインジェクターを使えば、物理的な位置を正確に制御できるからです。ソフトウェアで永久スタックアット障害をシミュレートするのは、非常に時間がかかるか、あるいは全く不可能です。
データ破損に焦点を当てる場合は、通常ソフトウェアツールで十分です。メモリセルのビット反転などの一部のエラーは、ハードウェアとソフトウェアのどちらでも検出できます。そのような場合は、コスト、精度、ツールがシステムに及ぼす影響、テストの再現性の容易さに基づいて選択する必要があります。
4. ハードウェア実装による障害注入
ハードウェア方式では、追加の物理的な装置を使用して、対象となるハードウェアに直接エラーを発生させます。これらの方式は、接触式と非接触式の2つの主要なグループに分類されます。
コンタクトハードウェア注入(ピンレベル)
これは最も一般的なハードウェアインジェクション手法です。対象チップのピンに直接物理的に接触する必要があります。
- アクティブプローブ: プローブはピンに直接接続して電流を注入します。これによりピンの状態が変化します。主にスタックアット故障の検出に使用されますが、2つのピンをブリッジ接続することも可能です。注意:アクティブプローブで過電流を注入すると、対象のチップが焼損する可能性があります。
- ソケット挿入: 対象チップとその回路基板の間に専用ソケットを配置します。このソケットは、ピンに特定のアナログ電圧レベルを強制的に印加することで、スタックアット、オープン回路、または複雑な論理エラーをシミュレートします。ピン信号を反転させたり、隣接するピンとのAND演算やOR演算を実行したり、同じピン上の現在の信号と以前の信号を組み合わせた演算を実行したりすることも可能です。
これらの接触方式では、障害発生のタイミングと位置を高度に制御できます。また、ターゲット上で動作するソフトウェアへの干渉もほとんどありません。ただし、これらの障害はピンレベルで発生するため、シリコン内部で発生する真のスタックアット障害やブリッジング障害とは厳密には異なります。それでも、エラー検出回路のテストには最適です。アクティブプローブを電源ラインに接続して電源電圧変動を注入することもできますが、デバイスを破損するリスクが高くなります。
非接触式ハードウェア射出成形
インジェクターはシステムに直接接触しません。代わりに、外部からの物理的な力を利用してチップ内部に問題を引き起こします。
- 重イオン放射線: イオンがチップの空乏層を貫通し、一時的な電流を発生させる。
- 電磁場: ハードウェアを強い電磁場の中またはその近くに置くことは、自然界における物理的な干渉を模倣する。
これらの非接触方式は、特に高速なハードウェア追跡(CPUがエラーに反応するまでの時間を測定するなど)が必要な場合や、物理的なプローブでは触れることができない内部箇所にアクセスする必要がある場合など、初期設計プロトタイプのテストに最適です。ハードウェアシステムは、ハードウェアタイマーを使用したり、特定のイベント(バス上にアドレスが現れるなど)を待機したりすることで、高速かつシステム干渉を最小限に抑えながら、これらのエラーを追跡およびトリガーできます。
主な欠点は、非接触方式では、重イオンが放出されるタイミングや電磁波が特定のトランジスタに当たるタイミングを完全に制御できないため、正確なタイミングや位置でトリガーするのが難しいことです。
5. ソフトウェアによる障害注入(SFI)
ソフトウェアベースの障害注入ツールは非常に人気が高い。主な理由はコストだ。高価な実験機器を購入する必要がない。また、SFIを使えばアプリケーションやオペレーティングシステムを直接テストできる。これはハードウェアでは非常に難しいことだ。
アプリケーションをテストする場合は、インジェクターをアプリケーション自体の中、またはアプリケーションとオペレーティングシステムの間に配置します。オペレーティングシステムをテストする場合は、ハードウェアとオペレーティングシステムの間に余分なレイヤーを追加するのは非常に困難なため、インジェクターをOSコード内に配置する必要があります。
SFIは柔軟性に富んでいるものの、主に3つの欠点がある。
- アクセス制限: ソフトウェアがアクセスできない領域(物理的な論理ゲートなど)には触れることができません。
- システム干渉: インジェクターコードは、対象システムの動作を遅くしたり、ソフトウェアの元の構造を変更したりする可能性があります。
- 時間分解能が低い: これはテストの精度を歪める可能性があります。SFIは、メモリの問題など、ゆっくりと進行する障害にはうまく機能します。しかし、CPUやバスのタイミングの不具合など、非常に高速な障害の場合、ソフトウェアはエラーがシステム全体にどのように広がるかを見逃してしまう可能性があります。
ハイブリッドアプローチ
こうしたタイミングの問題を解決するために、エンジニアはハイブリッド方式を用いることがあります。これは、ソフトウェア注入の柔軟性とハードウェア追跡の速度と精度を組み合わせたものです。ごくわずかなタイミング遅延を測定するのに最適です。しかし、ハードウェア追跡ツールを追加すると、コストが増加し、物理的なデータストレージの制限によりテストの柔軟性が制限されます。
6. コンパイル時ソフトウェアインジェクションと実行時ソフトウェアインジェクション
ソフトウェア障害注入は、障害がいつ導入されるかによって分類される。コンパイル時か実行時かである。
コンパイル時SFI
プログラムのロードまたは実行前に、プログラム命令を変更します。物理的なハードウェアを変更する代わりに、ソースコードまたはアセンブリコードを変更して、ハードウェア、ソフトウェア、または一時的なエラーを模倣します。これにより、変更された欠陥のあるプログラムイメージが作成されます。システムがこのイメージを実行すると、欠陥が発生します。
これは実行時に追加のソフトウェアを必要とせず、パフォーマンスの低下も一切引き起こしません。エラーはコードに永続的に書き込まれるため、永続的なハードウェア障害を模倣するのに最適です。欠点は、プログラムがアクティブに実行されている間は、動的に障害を注入できないことです。
ランタイムSFI
プログラムの実行中にエラーを発生させる方法が必要です。これには、一般的に次の3つの方法があります。
- タイムアウト: タイマー(ハードウェアまたはソフトウェア)は、設定された時間が経過すると割り込みを発生させ、障害インジェクターを呼び出します。これにはアプリケーションコードの変更は不要です。ただし、プログラムの動作ではなく時間に基づいてトリガーされるため、結果は予測不可能になる可能性があります。これは、ランダムな一時的または一時的なハードウェア障害をシミュレートするのに最適です。
- 例外と落とし穴: ハードウェア例外またはソフトウェアトラップ命令(ブレークポイントなど)によって、制御がインジェクタに渡されます。タイムアウトとは異なり、これにより、特定のイベントまたは条件が発生したとき(たとえば、プログラムが特定のメモリ領域にアクセスしようとしたとき)に正確に障害を注入できます。どちらもシステムの割り込みハンドラに直接接続する必要があります。
- コード挿入: ターゲットコードの直前に実行される新しい命令をプログラムに追加します。これはコードの変更に似ていますが、実行時に行われ、既存の命令を変更するのではなく、新しい命令を追加します。トラップとは異なり、インジェクターはシステムモードではなくユーザーモードで完全に実行できるため、高度なオペレーティングシステム権限は必要ありません。
7.相違点のまとめ
二つの主要なアプローチを比較してみましょう。
- ターゲットスポット: ハードウェアはパッケージのピンと物理的な内部コンポーネントを対象とし、ソフトウェアはアクティブなメモリ、CPUレジスタ、およびソフトウェア全体の状態を対象とします。
- 干渉: ハードウェアはほとんどタイミング遅延を引き起こしません。ソフトウェアは、追加のコードを実行する必要があるため、パフォーマンス上のオーバーヘッドを発生させます。
- 料金: ハードウェアは高価で、専用の実験室が必要となる。一方、ソフトウェアはコードに基づいており、実装コストは安価である。
- タイミングの解像度: ハードウェアは非常に高精度(ナノ秒単位)である。ソフトウェアの解像度はそれよりも粗い(マイクロ秒またはミリ秒単位)。
- テストの焦点: ハードウェアは低レベルのエラー検出とシールド機能を評価する。ソフトウェアは高レベルのリカバリプログラム、オペレーティングシステム、およびアプリケーションをテストする。
8. よくある質問
ハードウェア障害注入とソフトウェア障害注入の主な違いは何ですか?
ハードウェアインジェクションは物理的なピンや回路を標的とする一方、ソフトウェアインジェクションはメモリ、レジスタ、およびコードを標的とする。 ハードウェアによる手法では、プローブや放射線などの物理的なツールを用いて、回路の低レベルな反応をテストします。ソフトウェアによる手法では、コードやシステムメモリを修正することで、アプリケーションやオペレーティングシステムがエラーをどのように処理するかをテストします。
ソフトウェア障害注入によって、永続的なハードウェア障害をシミュレートすることは可能か?
はい、コンパイル時インジェクションを使用してプログラムのコードを永続的に変更することで可能です。 実行前にソースコードまたはアセンブリ命令を変更することで、恒久的に欠陥のあるプログラムイメージを作成できます。これは、実行時のパフォーマンス低下を引き起こすことなく、恒久的な物理的故障を模倣します。
ピンレベルのテストにおいて、アクティブプローブを使用するよりもソケット挿入の方が安全なのはなぜですか?
ソケット挿入は制御信号の操作を利用するのに対し、アクティブプローブは外部電流を注入するため、チップが焼損する可能性がある。 アクティブプローブは電流を物理ピンに直接流すため、シリコンが過熱する危険性があります。ブレークアウトソケットはピンを安全に遮断し、論理ゲート(AND、OR、反転)を使用して電気的な危険を伴わずに故障をシミュレートします。
システムアーキテクトへの最終的な考察
ダウウェイ・ビークルでは、シンプルなルールに従っています。 システムが障害発生時にどのように反応するかをテストしていない場合は、その障害が発生した際にシステムが故障すると想定しなければなりません。 単一のテスト方法だけに頼ってはいけません。開発の初期段階ではソフトウェアインジェクションを使用して、アプリケーションレベルのステートマシンとOSのリカバリルーチンをテストしてください。その後、物理プロトタイプに対してハードウェアインジェクションを使用して、ハードウェアウォッチドッグ、メモリ保護システム、および物理的なピンの故障がシステム全体に影響を及ぼすような大惨事を引き起こさないことを確認してください。
参考文献
- [1] 障害注入技術とツール (総合学術調査)
- [2] 機能検証に基づく障害注入環境 (IEEE信頼性・保守性シンポジウム)
- [3] ISO 26262-11:2018 – 自動車の機能安全のための半導体応用に関するガイドライン
- [4] IEC 61508 電気・電子・プログラマブル電子安全関連システムの機能安全。




