ランタイムエラーとは?
ランタイムエラー(実行時エラー)とは、コンパイル時には検出されずに、プログラム実行時に発生するソフトウェアの不具合です。ランタイムエラーは稀にしか発生せず、再現性も乏しいことから、テストでの発見が難しいものが多いのですが、ソフトウェアまたはハードウェアで発生すると故障の原因となります。
ランタイムエラーの種類
ランタイムエラーの種類としては、以下のようなものが挙げられます。
- 論理エラー(算術例外など)
- 制御フロー・データフローエラー(未初期化変数やポインターなど)
- メモリ関連エラー(バッファオーバーフローなど)
- 同時アクセスエラー(競合状態など)
ランタイムエラーのもたらす危険
ランタイムエラーが発生すると、故障の原因となります。出荷後の製品で不具合が発生した場合、製品リコールなどにつながり、コストや企業の信頼性へ損害を与えます。また、セーフティクリティカルなアプリケーションの場合、ランタイムエラーは以下のような重大な事故の原因となるため、検証が非常に重要です。
- 算術オーバーフローによるロケット搭載コンピューターのクラッシュ
- 競合状態による医療機器の致死量放射線の注入
ランタイムエラーの検出
開発の後工程でランタイムエラーが発見されると修正コストが非常に大きくなるため、開発の初期段階で発見することが重要です。ランタイムエラーの検出には、一般的には以下の方法がありますが、ランタイムエラー検出には、ソフトウェアのあらゆる実行パターンを想定する必要があり、単純ではありません。
コードレビュー
ソフトウェアソースコードを体系的に検査し不具合を特定する作業です。組み込みシステムの開発における重要なタスクですが、人の目によるコードレビューでは、コードの規模と複雑性の増大に伴い、テスト工数が増加し、見落としも増えるため、網羅的なコードレビューは非常に困難で現実的ではありません。
静的解析
ソースコードを実行せずにソフトウェアの品質と信頼性の検証を行う作業です。コードメトリクスの測定、コーディング規約への準拠や、バグ検出の解析でランタイムエラーを検出しますが、動的な挙動によるエラーは発見できず、解析後にエラーが残ることになります。
動的解析
多くの場合テストケースを用意して検証しますが、テストケースの組み合わせは無限に存在するため、テストのみでのランタイムエラーの検出は不十分で非効率的です。
ランタイムエラーが存在しないことを証明するには
Polyspace®は、形式手法に基づく抽象解析と静的解析を使用して、プログラムを実行せずに、すべての入力値や実行パスの組み合わせを検証し、ランタイムエラーを検出するだけではなく、ソフトウェアにランタイムエラーが存在しないことを証明します。抽象解釈の技法は、コンパイル時にソフトウェアの動的・実行時の特性を検証し、従来の静的解析技法と動的テストのギャップを埋めるものです。
抽象解析と静的解析を組み合わせることで、以下のメリットがあります。
- 特定しにくいランタイムエラーの検出
- クリティカルなランタイムエラーがないことの証明
- コード品質メトリクスの測定
- MISRA-C/C++やJSF++などのコーディング規約への準拠の検証
- 発見されたエラーは色分け表示され、デバッグの負担を最小化
詳しくは、Polyspace の製品ページをご覧ください。
ランタイムエラー検出の例および関連資料
参考: 静的解析, 形式手法 / 形式検証, 組み込みシステム, 検証とテスト