干渉だらけの世界で取り組む、組込ソフトウェアの設計とテスト
2021-04-19

Joydeep Chowdhury(Vector Informatik)

組込ソフトウェアにとって目や耳に相当するもの、それがセンサーです。マイクロプロセッサーはセンサーからのデータを受信し、把握した内容に基づいて何らかのアクションを起こします。ただし、干渉が原因でセンサーが誤った情報をプログラムに送ってしまうこともあります。 

そのような例の1つが2009年のニューヨークタイムズ紙に掲載されています。これは、オーブンの傍に置いた携帯電話に通話が着信したところ、あたかも手品のようにオーブンにスイッチが入り、中に入っていたプラスチック製の器具が融けてしまったというケースです。被害者は疑わしい表情の修理担当者を前にして、それを再現してみせました。つまり、この一件は偶然起こった事故ではありませんでしたし、問題のオーブンも電化製品に対する米国の安全規格を満たしていました。

この事例は、着信で発生した電磁波の周波数が、通常のセンサーをアクティブ化する共振周波数にたまたま的中し、そのシグナルを認識したプロセッサーが、オーブンの点火と判断したために発生したものです。これが安全を損なう現象であることはもちろんですが、こういった予期せぬ干渉は他にも報告されています。

組込ソフトウェアでは、万全の対策を施した安全なシステム設計が行われています。しかし、センサーのデータについては多くの場合、私たちはそれが正しいと信じ切っています。アナログシグナルによる干渉はときに検出が非常に難しく、ベースバンドで干渉が生じれば、フィルターでそれを検出することは恐らくできません。そうなると、干渉によって生じたセンサーデータはそのままマイクロコントローラーに渡され、ソフトウェアはそれに従って次の動作を決定してしまいます。

これが偶発的に起こることもあるでしょう。しかし、悪意のある第三者がこの方法で意図的にソフトウェアを騙そうとすることも当然考えられます。いずれにせよセンサーは誤った情報をマイクロコントローラーに送り、ソフトウェアの異常な挙動を引き起こしてしまうのです。これが根本的に危険で無防備な状況であるのはいうまでもありません。火災を招くオーブンがターゲットとなりうることはご覧のとおりですが、安全が最重視される多彩なインテリジェント機器、たとえば医療機器なども干渉による誤動作の恐れがあり、それによって健康や人命が損なわれることもあります。

干渉から破壊に至るメカニズム

下のブロックダイアグラムに示したBluetoothマイクの例で考えてみましょう。まず、単純なアナログシグナルがこのマイクに渡されます。渡されたシグナルは増幅されてADコンバーターに渡された後、マイクロコントローラーに到達します。 

ここで、偶発的か意図的かを問わず、ある干渉源が与えられたとしましょう。 

この回路ではBluetoothマイクに、アンプに接続するワイヤーがあります。またこの回路には固有の共振周波数と共振波長があります。それと完全に一致する周波数を持ち、マイクのシグナルをラッチアップできるシグナルが偶発的に、あるいは人為的に生成されたとしたらどうなるのか―。  ある研究者のグループがこれとまったく同じ仮定に基づいて実験したところ、まさにそのラッチアップが発生することが確認されました。  

これらの研究者によると、ベースバンドで動作するデバイスでは、誤作動を起こす恐れのある干渉が低域側で発生していても、アナログフィルターはシグナルの破損を検出できない場合があるのです。フィルターは通常、高周波数での異常は捕捉できますが、低周波数ではできません。この回路にはマイクしかないため、このような事態が発生しても影響が尾を引くことはありません。しかし、生命に関わる装置でこれが生じれば、マイクロプロセッサーが誤ったデータに基づいて極端な判断を下したために、悲惨な結果が生じかねません。 
 

「雑音だらけ」の環境でのプログラミング

ソフトウェア設計についていえば、ソフトウェアスタックは例外が処理されるように構築しなければなりません。マイクロプロセッサーに届いたシグナルに不審な点、たとえば許容可能な範囲を超えているなどの異常があれば、そのシグナルは慎重に扱い、下す判断にも相応の注意が必要です。さきほどの研究者の実験を踏まえ、私たちはセンサー入力には不備があるものと考えて異常の検出に努め、セキュリティーと安全に関するリスクを減らさなければなりません。

では、疑わしいシグナルをソフトウェアが適切に処理しているかをテストするには、どうすればよいのでしょうか。干渉の物理的な生成は必ずしも容易ではありませんし、また仮にそれが可能であったとしても、他の方法も使用してソフトウェアを漏れなくテストする方が賢明です。

そういった方法の一例が、サブシステムのテスト用ツールであるVectorCAST/C++です。このツールでは関数を選択的にスタブ化して変数に値を割り当てることができます。つまり、シグナルの干渉で発生する可能性のある極値や破損値を作成し、ソフトウェアがそれをどう処理するかを確認できるのです。センサーから送出される値をこの方法で無効化したり、プローブポイント機能を使用して、選択したテストコードを重要な分岐点に戦略的に挿入し、不正な状態や危険な状態をソフトウェアの範囲内で作成したりできます。例外テストの実行中は、結果のモニタリング、例外の捕捉、コードカバレッジの可視化によって、ソフトウェアが適切な判断を下しているかを監視できます。これらのテストをシミュレーターやターゲットで実行することにより、柔軟性を高めることができます。

詳細についてはこちらからお問い合わせください。

関連トピック

はじめての単体テスト

単体テスト、単体テストの効率化について解説している資料です。

詳細はこちら
ソフトウェア開発のライフサイクルを通してテスト作業を自動化

VectorCASTはC言語、C++に対応した組込の単体テストを自動化するための単体テストツールです。

詳細はこちら
導入事例|VectorCAST(日本精機株式会社)

フルグラフィッククラスター制御の単体テストにVectorCASTを採用

詳細はこちら
ホワイトペーパー|組込ソフトウェア開発を効率化する変更ベーステスト

VectorCASTのホワイトペーパー「組込ソフトウェア開発を効率化する変更ベーステスト」をダウンロードいただけます。

詳細はこちら
ホワイトペーパー|医療機器のテスト

世界的な医療機器/医療用品メーカーのお客様との間で先日完了したサービス案件について詳しく説明します。

詳細はこちら
ホワイトペーパー|バグの修正および防止コストの定量化

このホワイトペーパーでは、テストの効率向上に使用できる手法を取り上げます。

詳細はこちら