静的解析とはコードを実行せずにコードの品質を向上させるプロセスです

静的解析、もしくは、静的コード解析とは、コードを実行せずにコードの品質、信頼性、および、セキュリティの検証を行う作業のことを言います。静的解析を行うと、アプリケーションの安全性とセキュリティを損なう可能性のあるバグとセキュリティの脆弱性を開発の早い段階で特定できます。静的解析は、テストケースの作成を行うことなく網羅的、かつ、短時間でコードの品質を確保する費用対効果の高いアプローチです。

静的解析ツールの活用

静的解析はツールによる自動化を行いやすいため、導入が比較的容易で下記の業界でのソフトウェア開発で主に活用されています。

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

動的解析と静的解析を行う理由

ほとんどのソフトウェア開発チームでは、ソフトウェアのバグやランタイムエラーを検出するために単体テストなどの動的解析に依存しています。動的解析では、エンジニアがテストケースを作成して実行するため、網羅的に検証を行うのは非常に困難です。安全でセキュアなソフトウェアを検証するためには動的解析だけに頼ることはできません。

たとえば、この非常に単純なケースを考えてみましょう。

speed関数は、14行目でゼロ除算の可能性があり、ランタイムエラーを引き起こす可能性があります。ゼロ除算が発生しないことを最終的に決定するには、変数入力のすべての可能な値を使用して関数を検証する必要があります。

静的解析は動的解析を補完して、いくつかの利点を提供します。

  • エラー検出
  • 同時実行性、汚染されたデータ、データフロー、セキュリティ、静的メモリと動的メモリに関連する何百ものクラスのバグを特定できます。 見つかったいくつかのバグは、動的解析では検出することがほぼ不可能です。

  • 低コスト
  • 静的解析は、テストケースの作成やプログラム実行のオーバーヘッドが発生することなく、簡単に自動化できます。開発の早い段階でバグを検出できるため修正にかかるコストを抑制します。

  • コーディング標準への準拠
  • コードがMISRA C®/C++やJSF++などのコーディング標準、CWE、CERT C/C++、ISO/IEC 17961などのセキュアコーディング標準、またはサイバーセキュリティガイドラインに準拠していることを確認できます。コーディング標準に準拠することでコードの可読性や保守性が向上します。

  • 重大なランタイムエラーが存在しないことを証明
  • 静的解析ツールは、ソフトウェアに重大なランタイムエラーが存在しないことを証明できます。このレベルのツールは、理論科学の基礎を適用した形式手法を使用してコードの安全性を証明します。

静的解析ツールを扱う人

  • ソフトウェア開発者
  • ベストプラクティスでは、コードが記述されたらすぐにバグとコーディング標準をチェックすることをお勧めします。開発プロセスの早い段階で検出されたエラーは、デバッグと修正がはるかに簡単です。

  • ソフトウェアテスター
  • アプリケーションコードが統合された後、統合されたコードに対して詳細な静的解析を実行して、重大なランタイムエラーが存在しないことを証明します。

  • プロジェクトマネージャーと品質保証リーダー
  • 静的解析ツールは、ソフトウェア品質、プロジェクトステータス、欠陥数、および品質傾向を監視するために使用できるコード品質メトリクスを生成します。

静的解析ツールの選択基準

Polyspace®製品など、静的解析を実行するために使用できるツールがいくつかあります。静的解析ツールを選択するときは、 次の質問を考慮してください。

  • 業界標準をサポートしていますか?

    経済的損失、身体的傷害、またはソフトウェアエラーによる資産や環境への損害のリスクを最小限に抑えるには、標準に準拠することが重要です。 さまざまな業界が独自の安全基準を定義しています。たとえば、自動車用のISO 26262、航空宇宙用のDO-178、医療機器用のIEC62304などです。

  • 解析結果はどの程度信頼性が高く、実用的ですか?
  • 静的解析にはさまざまなテクノロジーを使用できます。これらのテクノロジーは、異なる度合いの健全性と精度を提供します。たとえば、抽象解釈は、偽陰性を生成しないため、健全であると見なされる形式手法です。

  • ツールはバグを修正するための洞察とガイダンスを提供しますか?
  • 多くの場合、ツールがバグを検出するだけでは不十分です。開発者は、コードの構造をナビゲートし、バグの根本原因を見つけるために、より多くの情報を必要としています。呼び出し階層、変数値、状況依存ヘルプ、推奨される修正などの情報により、複雑な問題を解決する機能が向上します。

  • ツールは共同レビューを提供しますか?
  • 一部の静的解析ツールは、ソフトウェア開発チーム内で、たとえばオンラインプラットフォームを介して、解析結果と品質メトリクスを簡単に共有する機能を提供します。この機能により、チームは共同レビュー、トリアージ、および欠陥の解決を行うことができます。

  • ツールは既存のソフトウェア開発プロセスと統合できますか?
  • 効果的な静的解析ツールには、継続的インテグレーションや継続的デリバリー(CI/CD)、DevOps、DevSecOpsなどの新しいプロセスを含むさまざまなソフトウェア開発プロセスと統合する機能が必要です。ツールは、IDE(Eclipse™ や Microsoft® Visual Studio® Code など)、CIツール(Jenkins™ や Bamboo® など)、バグ追跡ツール(例:JiraおよびRedmineなど)と統合するための豊富なAPIとプラグインを提供する必要があります。

  • ツールはパブリッククラウドとプライベートクラウドで機能しますか?
  • Amazon® AWS® やMicrosoft Azure® などのパブリックおよびプライベートクラウドでソフトウェアを開発することは、急速に人気が高まっています。クラウドは、開発チームに敏捷性、スケーラビリティ、高可用性、およびグローバルアクセスを提供します。静的解析ツールを評価するときは、ツールがクラウド対応であること、つまり、ツールをクラウドプラットフォーム上のソフトウェア開発プロセスに展開して統合できることを確認することが重要です。もっと詳しく知る

Polyspace製品が選ばれる理由

Polyspace製品は、形式手法を使用して、考えられるすべての制御フローおよびデータフローで重大なランタイムエラーが存在しないことを証明します。 Polyspace製品ファミリには次のものが含まれます。

  • Polyspace Bug Finder™は、C/C++コードのコーディング標準違反をチェックし、メモリリークなどの様々なバグや汚染されたデータ使用などによるセキュリティ脆弱性を検出し、循環的複雑度などの品質メトリクスを測定します。
  • Polyspace Code Prover™は、形式手法を使用した静的解析にてゼロ除算や整数オーバーフローなどの動的なエラーがC/C++コードに存在しないことを証明します。
  • Polyspace Products for Adaは、Adaソースコードに重大なランタイムエラーが存在しないことを証明しています。

Polyspace製品は、バグ検出、コーディング標準への準拠、重大なランタイムエラーが存在しないことを証明する機能など、前のセクションに記載されている利点と機能を提供します。 たとえば、上記のサンプルコードの場合、Polyspace Code Proverは、すべての可能な入力に対してspeed関数のコードパスを網羅的に解析して、ゼロ除算が発生しないことを証明できます。解析した結果、14行目の除算記号がグリーンで表示されますが、これはすべての入力に対して安全であり、ランタイムエラーが発生しないことを示しています。

Polyspace Code Proverを使ったDivide by Zero(ゼロ除算)チェック

Polyspace静的解析のメリット

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

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

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

参考: 検証、妥当性確認、テスト, 組み込みシステム, コードレビュー, 形式手法, ソフトウェア測定法, ソフトウェア品質保証, software quality objectives, ソースコード解析, 静的解析ビデオ