静的解析

静的解析とは

静的解析もしくは静的コード解析とは、ソースコードを実行せずにソフトウェアの品質と信頼性の検証を行う作業のことをいいます。近年では、ソフトウェア品質・組み込みセキュリティに対する関心が飛躍的に高まっています。これは、多くの製品リコールや故障はソフトウェアが原因となっているからです。しかし、コードの規模と複雑性は減少することなく、コード検証の作業は困難になる一方ですが、多くの場合、開発スケジュールの延長はできません。ソースコード解析では、コードレビューやテストを主な検証作業としますが、人間が考えるパターンに基づいた手法では網羅的で信頼性の高い検証が十分にできているとは言えません。開発プロセスの下流で欠陥・バグが発見された場合、設計時に発見した際の修正コストと比較して何十倍、場合によっては何百倍になってしまうだけでなく、製品化までの時間にも影響を与えます。静的解析は欠陥やエラーの検出作業を自動化することを可能としており、網羅的かつ短時間で欠陥・エラーの検出作業を行うことを可能とします。

静的解析の利用について

静的解析ツールは下記のような業界のソフトウェア開発で活用されています。

  • 自動車:ドライブトレーン、パワートレーン、ナビゲーション
  • 航空防衛:フライトコントロール、アビオニクス、Propulsion
  • 医療機器:、医用画像処理、診断装置、手術ロボット
  • ロボティクス:故障診断、コンピュータビジョン、モータ制御
  • 上記の他、特に信頼性・安全性が重要であるクリティカルソフトウェア開発

特に対象になるのは、制御アルゴリズム・ロジックやユーザビリティに関係するソフトウェア等のクリティカルなソフトウェアコンポーネンツです。また、ソフトウェアコンポーネンツの再利用が想定され、コードの信頼性を担保しなければならないケースは静的解析が重要になります。つまり、「エラーがないコード品質」が求められるソフトウェアでは静的解析が有効です。

実際の静的解析の現場では、静的解析のエキスパートを育てるのではなく、静的解析をソフトウェアエンジニアと品質管理エンジニアとで利用できる環境を構築することが重要です。例えば、ソフトウェアエンジニアがコード作成時にEclipse統合開発環境(IDE)で静的解析を実行し、開発の初期段階で欠陥・エラーを検出することで修正コストを大幅に削減可能です。

静的解析と動的解析

検証作業には静的解析と動的解析があり、どちらかのみで全ての検証作業を網羅することはできません。多くの検証プロセスはテストケースを用意し、ソフトウェアを実行することが主な作業です。これを動的解析と呼びます。動的解析の作業は、動的テストに対する計画、実行するテストケースの設計・作成、テストの実行、テスト結果の確認が必要となります。

一方、静的解析は、ソフトウェアを実行せずに欠陥検出を上流で行い、納入前にソフトウェア品質を確認します。静的解析は欠陥・エラーの検出に有効ですが、動的テストの置き換えではありません。静的解析が正確かつ網羅性が高いと、ソフトウェアエンジニアはより高品質なコードを作成し、品質管理エンジニアは効率的・効果的にコード品質を測定・管理することができます。

静的解析の基本的な手法と課題

一般的な静的解析の手法は下記になります。

  • コードメトリクス:コードの行数をカウント、コメント密度の決定、コード複雑度の評価など
  • コーディング規約:MISRA-C/C++やJSF++ (Joint Strike Fighter Air Vehicle C++)などのコーディングルールへ準拠
  • バグ検出:パターンマッチング・タイプ解析等で、短時間でソースコード解析し、表面的なコード欠陥を検出

静的解析は、ゼロ除算、オーバーフローやポインターの範囲外参照等のランタイムエラーの特定と診断が可能です。その上、コーディング規約への準拠を確認する等、静的解析によるメトリックを使用して、ソフトウェア品質の測定と改善を行います。ほかの検証手法と比較すると、静的解析は自動化されているため、プログラムの実行やテストケースの作成が不要です。

これらの解析はソフトウェアの品質を測定する際の重要項目です。しかし、コードメトリクスの測定、コーディング規約への準拠や、バグ検出の解析のみでは、ランタイムエラーの危険性を把握しきれていません。一般的な静的解析手法では、ソフトウェア内に潜む全てのエラーを検出し切れず、解析後にエラーが残ることになります。この場合、動的解析にてエラーを発見することになりますので、修正コストが増加します。また、一般的な静的解析手法ではシンタックスの解析にフォーカスしており、あるコーディングパターンに対するチェックはしますが、実際にエラーを検出できないケースがあります。なお、コーディングルールへの準拠は、エラー検出の観点では充分ではありません。

静的解析ツールPolyspace®と形式手法

一般的な静的解析手法で起きるエラー検出の課題は、静的コード解析ツールPolyspace®形式手法が解決します。Polyspaceの形式手法はエラー検出に対して下記を可能とします。

  • わかりにくい実行時エラーの検出
  • 特定の実行時エラーがないことの証明

形式手法は、倫理的なコンピューターサイエンスの基礎を用いており、実績豊富な技法である抽象解釈を使用します。抽象解釈はソフトウェアコンパイル時の動的性質を検証し、一般の静的解析技術と動的テストのギャップを埋めます。抽象解釈はプログラムを実行せずに、プログラム内で全ての可能な振る舞い(全ての入力の組み合わせと実行シーケンス)を検査して、ランタイムエラーが発生する状況を明確にします。コードの障害点一つ一つが、“エラーと実証された”、“正常(エラーが発生しない)と実証された”、“到達不能(デッドコード)と判明された”、もしくは“未実証”のいずれかであると判断されるため、この手法は極めて網羅的です。もちろん、コードメトリクスの測定、コーディング規約への準拠のチェック、バグ検出も合わせて解析します。Polyspaceはコード証明を加えることで、静的コード解析の包括的なソリューションとなっています。

静的解析: Polyspace検証によるランタイムエラー証明

Polyspace静的解析のメリット

Polyspaceの抽象解釈を用いた静的解析は、高い信頼性が求められるソフトウェア開発にとって、4つのメリットがあります。

  •  コード信頼性の確保
    抽象解釈を用いる静的解析はコードを徹底的に検査することで、ランタイムエラーの検出だけではなく、コードの正確性・安全性も証明します。抽象解釈はコード内に障害がないことを識別することができ、ソフトウェア信頼性に関する曖昧な点を解決します。
  • 効率の向上
    抽象解釈はアプリケーションの動的性質を検証することで、ランタイムエラーが存在しないコードと信頼性の侵害に繋がるコードを識別できます。コードを実行する前にエラーを指摘することで、修正が最も容易な段階でエラーを消去して時間とコストを大きく削減します。
  • オーバーヘッドの削減
    抽象解釈はコードを実行する必要がありませんので、テストケースを作成・実行するコストなく高精度の解析結果を得ることができます。また、Polyspace製品では、コードメトリクス測定、コーディングルールチェック、バグ検出と、ランタイムエラーに対するコード証明を全て提供しており、多くの解析を同時に行うことが可能です。
  • デバッグ作業の容易化
    抽象解釈はエラーの症状だけではなく、エラーの発生点を指摘することでデバッグを容易化します。エラーの原因を分析するためのトレース作業や、再現するための時間を削除することができます。抽象解釈は徹底的な解析の上、リピート可能です。コード内の各操作は自動的に全ての入力の組み合わせを取り組んで指摘、解析、検査します。

詳しくは、Polyspace® の製品ページをご覧ください。

参考: Polyspace Bug Finder, Polyspace Code Prover, 形式手法 / 形式検証, 組み込みシステム, 検証とテスト, コードレビュー, ランタイムエラー