静的解析(コーディングスタンダード解析)とは
静的解析は、コードを実行せずに行なう検証です。この文書では特に、ソースコードを解析して特定のコーディングパターン(コーディングルール)に違反している箇所を指摘する、コーディングスタンダード解析について説明します。ソースコードを目視で検証するレビューも静的なテスト技法の1つですが、ここでは取り扱いません。また、データフローや制御フローを解析するフロー解析も静的解析の1種ですが、こちらについては、C++testページのフロー解析で説明しています。
静的解析の利点と弱点
静的解析は導入しやすく、低コストで大きな効果が期待できます。しかし、静的解析ではカバーできないソースコードの問題もあるため、フロー解析、単体テスト、コードレビューなどの他のテスト技法と組み合わせて使用すると、より万全にソフトウェアの品質を保証できます。静的解析の利点
- コーディング時という開発の早い段階でエラーを検出できるため、バグ修正コストを抑制できる。
- プロジェクトの共通のコーディングスタイルを推進できるため、コードの可読性や保守性が向上する。
- ツールによって自動化しやすいため、導入が比較的容易。
- 開発者が良いコーディングスタイルを意識するようになる。ベテランの開発者が暗黙のうちに身につけている良いコーディング習慣を経験のない開発者も自然に習得できる。
- 目視によるレビューの効果を高められる。レビューの前に、機械的に指摘できるエラーを摘み取ることが可能なので、レビューでは設計などの高度な問題に集中できる。
静的解析の弱点
- 基本的にコードの実行順序やパスに起因する問題は検出できない。このような問題を検出するには、フロー解析が有効である。
- 実行時の問題(例外のスロー、メモリ破壊など)は検出が難しい。このような問題を検出するには、フロー解析、単体テスト、実行時メモリエラー検証が有効である。
静的解析(コーディングスタンダード解析)で検出できる問題
コードの可読性に関する問題
- 命名規約違反
- インデントなど書式の問題
エラーが発生しやすいパターン
コンパイルエラーにはならないが、エラーの原因になりやすいために避けるべき実装パターンを指摘できます。これまでの多くの開発者や専門家の経験から、C/C++、Java、C#、VB .NET など、言語の特性に応じた多数の推奨パターン(ベストプラクティス)または避けるべきアンチパターンが蓄積されており、そのようなコーディング作法を解説した書籍が多く出版されています。また、ソフトウェアの応用分野や目的に応じて、業界団体などが定めたコーディング標準が存在し、規約への準拠が求められる場合もあります。
以下はそのようなコーディング標準の例です。
- MISRA-C、MISRA-C++ 規約
MISRA (Motor Industry Software Reliability Association)が定めたC/C++言語向けのコーディング規約です。元々は自動車関連ソフトウェア向けの規約でしたが、現在は、高い信頼性と安全性が要求される組込み開発分野で広く利用されています。
- SEI CERT C / SEI CERT C++
SEI CERT Cコーディングスタンダードとは、脆弱性につながる恐れのある危険なコーディング作法や未定義の動作を削減することを目的に、セキュリティの扱う研究・開発センターであるCERT Coordination CenterがまとめたC言語のコーディング規約です。C++言語のコーディング規約は、SEI CERT C++コーディングスタンダードです。
静的解析の自動化ツールを使用すれば、優れたコーディングパターンを自動的に推進でき、コードが任意のコーディング標準に準拠していることを確認できます。 アプリケーション独自のエラー(発見されたエラーの再発防止) テストでバグが発見されたとき、バグの原因を突き止めて、コード中に他に同じような問題を持つ箇所がないかどうかを確認することが重要です。さらに、バグの原因となったコーディングパターンを、避けるべきパターンとしてルール化できれば、常にこのルールの違反を監視することで、将来にわたって同じバグが発生するのを防止できます。ユーザー独自のコーディングルールを作成するルールカスタマイズ機能を持ち、ルール違反を自動的にチェックできる静的解析ツールを使えば、開発者の負担を増やすことなく、エラー再発防止策を自動的に開発プロセスに組み込むことができます。
コードの複雑さなどに関する問題(メトリクス解析)
- クラス、メソッド、メソッド引数などの数
- クラス、メソッドの処理の複雑さ
- クラス間の依存関係
規模の大きすぎるコード、複雑すぎるコード、他のモジュールへの依存性が高すぎるコードは保守が難しく、エラーが混入しやすいものです。これらの問題の指標となるメトリクスを継続的に測定し、一定の値を超えたモジュールについてはリファクタリング等で問題を解決して、コードの健全性を保つことが重要です。静的解析ツールには、メトリクス解析機能を持ち、しきい値を超えたモジュールを警告できるものもあります。
関連項目
静的解析を自動化するツールのご紹介
C/C++対応静的解析ツール・単体テストツール C++test
C++testは、静的解析(コーディング規約チェック/フロー解析)、単体テスト、カバレッジ計測、実行時メモリエラー検出機能などを搭載したC言語/C++言語対応のオールインワンテストツールです。
C#/VB.NET対応 静的解析・動的解析ツール dotTEST
dotTEST は、C#言語/VB.NET言語対応した静的解析・動的解析テストツールです。Windows アプリケーション・Web アプリケーションなどのさまざまな.NET アプリケーションの開発に用いられています。
Java対応静的解析・単体テストツール Jtest
Jtestは、テスト工数の大幅削減とセキュアで高品質なJavaシステムの開発を強力にサポートするJava対応テストツールです。2,000個以上のコーディング規約をもとにソースコードを静的に解析し、プログラムの問題点や処理フローに潜む検出困難なエラーを検出します。