9.ランタイムエラー

組込み

 この章では、厄介なランタイムエラーへの対策について説明します。ランタイムエラーは、プログラム実行時に発生するエラーです。PC上のプログラムで、ランタイムエラーが発生すると、通常は、プログラムが勝手に終了するでしょう。組込み制御システムを動かしている「組込み制御ソフトウェア」が、急に止まってしまうと、使っている人は危険な状態になる可能性があります。したがって、特に注意深くこのエラーの発生を回避する必要があります。なお、ここでは、間違った計算アルゴリズムにより、正しくない計算結果を出力していても、計算を継続している状態は、ランタイムエラーとはしません。

 ランタイムエラーは、プロセッサーに依存して扱える内容が異なるものですが、一般には、ゼロ割、オーバーフロー、メモリへの不適切なアクセス、数学関数への不適切な値設定などで起こります。ランタイムエラーはプロセッサー、つまりハードウェアに依存する処理部分として、リアルタイムOS側で上手くハンドリングできる場合があります。それは、リアルタイムOS側の機能として、ランタイムエラーが発生時に実行する、例外割り込み処理を扱えるようにすることです。例外割り込み処理で、エラーが発生したときのコード行を示すプログラムカウンターと、エラーの種別を、グローバル変数に残すのです。また、例外割り込み処理を工夫して、急な「組込み制御ソフトウェア」の停止を避ける仕掛けを入れることもできます。

 例外割り込み処理が残した、プログラムカウンターから、ランタイムエラーが発生したプログラム処理の場所と、発生したエラー内容が分かるので、それを手掛かりに「不具合」の原因を探します。なお、あらかじめ、ソフトウェアの関数コードの、メモリマッピング情報を準備しておくと良いでしょう。組込み用のコンパイラーや開発環境には、組込みハードウェア環境にソフトウェアを書き込んだ際の、メモリマッピング情報を取得する機能があるので、それを活用します。

 私の場合は、複数社で共同開発している「組込み制御ソフトウェア」を統合して組込みハードウェアで動作テストさせている際に、ランタイムエラーが発生したことがありました。上記方法で発生箇所を特定したのですが、プログラムカウンターは、協力会社からオブジェクトコードで提供された関数のある行を指していました。提供元の会社の担当者に調べてもらったところ、tan関数に90度の値が入り、オーバフローが発生したことが、すぐにわかり、対策をしてもらいました。

 なお、ここでも、「不具合」を早期に見つけることを目的として、「組込み制御ソフトウェア」で使う例外割り込み処理を設計しています。

 上記までは、ランタイムエラーが発生した際の対策になりますが、本来であれば、ランタイムエラーが発生しないようにすべきです。ランタイムエラーの発生原因があらかじめ分かっていれば、それを発生させる可能性のあるプログラム部分を、事前に確認しておくこともできます。利用するプロセッサーのランタイムエラーの発生原因が、ゼロ割、オーバフロー、メモリ範囲外アクセス、数学関数への不適切な値設定とすると、それらを発生する可能性のあるコード箇所を調べることになります。プログラムの規模が大きい場合は、なかなか大変な作業になります。大きい単位ではなく、調査しやすい規模の関数単位で検査するのが、現実的でしょう。結局ここでも、テスト容易化のために、「組込み制御ソフトウェア」の関数のサイズ決めています。

 私が現役のソフトウェア開発者の時には使えませんでしたが、現在はPolyspace®という、Cコードのランタイムエラーの可能性をチェックするツールも市販されています。この製品は、フランスのアリアン5ロケットのソフトウェアが原因で発生した事故を研究して生まれたもので、Cコードを動かすことなく、静的に解析してランタイムエラーの可能性を確認します。解析にはそれなりに計算負荷がかかるので、使い方には工夫が必要のようですが、上手く使えば検査作業の負荷軽減になることでしょう。