ソフトウェア品質保証

静的解析(コーディングスタンダード解析)とは

静的解析(コーディングスタンダード解析)とは

静的解析は、コードを実行せずに行なう検証です。この文書では特に、ソースコードを解析して特定のコーディングパターン(コーディングルール)に違反している箇所を指摘する、コーディングスタンダード解析について説明します。ソースコードを目視で検証するレビューも静的なテスト技法の1つですが、ここでは取り扱いません。また、データフローや制御フローを解析するフロー解析静的解析の1種ですが、こちらについてはフロー解析で説明しています。
 静的解析の利点
  • コーディング時という開発の早い段階でエラーを検出できるため、バグ修正コストを抑制できる。
  • プロジェクトの共通のコーディングスタイルを推進できるため、コードの可読性や保守性が向上する。
  • ツールによって自動化しやすいため、導入が比較的容易。
  • 開発者が良いコーディングスタイルを意識するようになる。ベテランの開発者が暗黙のうちに身につけている良いコーディング習慣を経験のない開発者も自然に習得できる。
  • 目視によるレビューの効果を高められる。レビューの前に、機械的に指摘できるエラーを摘み取ることが可能なので、レビューでは設計などの高度な問題に集中できる。
静的解析の弱点
  • 基本的にコードの実行順序やパスに起因する問題は検出できない。このような問題を検出するには、フロー解析が有効である。
  • 実行時の問題(例外のスロー、メモリ破壊など)は検出が難しい。このような問題を検出するには、フロー解析単体テスト、実行時メモリエラー検証が有効である。

静的解析は導入しやすく、低コストで大きな効果が期待できます。しかし、静的解析ではカバーできないソースコードの問題もあるため、フロー解析単体テスト、コードレビューなどの他のテスト技法と組み合わせて使用すると、より万全にソフトウェアの品質を保証できます。

静的解析

静的解析(コーディングスタンダード解析)で検出できる問題

コードの可読性に関する問題
  • 命名規約違反
  • インデントなど書式の問題
多くのシステムは、複数の開発者によって開発され、完成後もバグの改修、仕様変更、機能拡張などのために変更され続けます。統一された命名規約や書式に従ってコードを記述すると、最初にコードを書いた人とは別の人がコードを読む際に理解しやすく、保守が容易になります。

エラーが発生しやすいパターン
コンパイルエラーにはならないが、エラーの原因になりやすいために避けるべき実装パターンを指摘できます。これまでの多くの開発者や専門家の経験から、C・C++、Java、C#、VB .NET など、言語の特性に応じた多数の推奨パターン(ベストプラクティス)または避けるべきアンチパターンが蓄積されており、そのようなコーディング作法を解説した書籍が多く出版されています。
また、ソフトウェアの応用分野や目的に応じて、業界団体などが定めたコーディング標準が存在し、規約への準拠が求められる場合もあります。
以下はそのようなコーディング標準の例です。

  • MISRA-C、MIRA-C++ 規約
    MISRA (Motor Industry Software Reliability Association)が定めたC・C++言語向けのコーディング規約です。元々は自動車関連ソフトウェア向けの規約でしたが、現在は、高い信頼性と安全性が要求される組込み開発分野で広く利用されています。
  • PCI DSS
    PCI DSS(Payment Card Industry Data Security Standard)は、国際的なクレジット カード会社が共同で策定した、カード会員データを取り扱う事業者が準拠すべきグローバルな基準です。この標準は、「すべてのWebアプリケーションを『Open Web Application Security Project Guide』などの安全なコーディングガイドラインに基づいて開発する」と定めています。OWASP Top Ten Projectは、セキュリティの有識者からなるプロジェクトメンバーが選んだ、Webアプリケーションの最も危険な 10個の脆弱性を発表するものです。
静的解析の自動化ツールを使用すれば、優れたコーディングパターンを自動的に推進でき、コードが任意のコーディング標準に準拠していることを確認できます。 アプリケーション独自のエラー(発見されたエラーの再発防止) テストでバグが発見されたとき、バグの原因を突き止めて、コード中に他に同じような問題を持つ箇所がないかどうかを確認することが重要です。さらに、バグの原因となったコーディングパターンを、避けるべきパターンとしてルール化できれば、常にこのルールの違反を監視することで、将来にわたって同じバグが発生するのを防止できます。ユーザー独自のコーディングルールを作成するルールカスタマイズ機能を持ち、ルール違反を自動的にチェックできる静的解析ツールを使えば、開発者の負担を増やすことなく、エラー再発防止策を自動的に開発プロセスに組み込むことができます。
 
コードの複雑さなどに関する問題(メトリクス解析)
  • クラス、メソッド、メソッド引数などの数
  • クラス、メソッドの処理の複雑さ
  • クラス間の依存関係
 
規模の大きすぎるコード、複雑すぎるコード、他のモジュールへの依存性が高すぎるコードは保守が難しく、エラーが混入しやすいものです。これらの問題の指標となるメトリクスを継続的に測定し、一定の値を超えたモジュールについてはリファクタリング等で問題を解決して、コードの健全性を保つことが重要です。静的解析ツールには、メトリクス解析機能を持ち、しきい値を超えたモジュールを警告できるものもあります。


静的解析(コーディングスタンダード解析)と機能安全規格コンプライアンス