3.2 静的解析 (Static Analysis)
「静的解析 (Static Analysis)」 は、ソフトウェアを実行することなく、ツールまたは人によってコードやシステムアーキテクチャの形式、構造、内容などを評価するテストの一形態です。
静的解析の主な目的は、実際の欠陥または潜在的な欠陥を検出することと、ソフトウェアの保守性を向上させることです。このアプローチにより、テストケースの実行に必要なデータや事前条件をわざわざ作成しなくても、コードの詳細な分析が可能になります。
シラバスでは、テクニカルテストアナリストが理解すべき静的解析の手法として、以下の主要なアプローチを挙げています。
1. 制御フロー解析 (Control Flow Analysis)
Section titled “1. 制御フロー解析 (Control Flow Analysis)”制御フロー解析は、主にツールを使用し、制御フローグラフを用いてプログラム内の手順を解析する技法です。
検出できる不正
Section titled “検出できる不正”この技法によって、以下のようなコードの構造的な不正を検出することができます。
- 複数の開始点を持っていたり、終了しなかったりする適切でない設計のループ
- 対象が曖昧な関数呼び出しや、誤った処理順序
- 決して実行されることのない到達できないコード(デッドコード)や、呼び出されていない関数
サイクロマティック複雑度の測定
Section titled “サイクロマティック複雑度の測定”制御フロー解析は、コンポーネントの「サイクロマティック複雑度」を求めるために用いられます。これは、グラフにおける「独立したパスの数」を表す指標です。 Thomas McCabeの理論によれば、システムが複雑になるほど保守が困難になり、含まれる欠陥の数も増える傾向があります。そのため、この指標が高いと測定されたコンポーネントは、複数のコンポーネントに分割するなど、リファクタリングを検討する必要があります。
2. データフロー解析 (Data Flow Analysis)
Section titled “2. データフロー解析 (Data Flow Analysis)”データフロー解析は、制御フローのパスに沿って「変数がどのように使われているか」というライフサイクルを調査し、潜在的な不正を特定する技法です。
変数の3つのアクション
Section titled “変数の3つのアクション”変数の使い方は、以下の3つの不可分アクションに分類されます。
- 変数が定義、宣言、または初期化されたとき(例:
x:=3) - 変数が使用または読み込まれたとき(例:
if x > temp) - 変数が削除、破棄、またはスコープ外に出たとき(例: ループ制御変数がループから抜けるときなど)
データフローの代表的な不正
Section titled “データフローの代表的な不正”これらのアクションが正しい順序で行われていない場合、潜在的な不正の指標となります。
- 定義された後に使用されず、別の定義で上書きされたり削除されたりする
- 定義された後に削除(解放)されない(動的に割り当てられた変数のメモリリークの可能性)
- 定義される前に、使用または削除される
- 削除された後に、使用または削除される
データフロー解析の限界と注意点
Section titled “データフロー解析の限界と注意点”プログラミング言語によっては特定の不正を意図的に許容している場合があるため、コンパイラだけでなく専用の静的解析ツールが必要になることがあります。 また、ツールは「実行時に変数に割り当てられた値に基づいて決まるパス」を常に正確に予測できるわけではないため、実際には起こり得ない潜在的な不正(誤検知)をレポートしてしまうことがあります。さらに、配列などの動的に割り当てるデータ構造や、同時実行されるスレッド間で共有される変数の解析は非常に困難です。
3. 静的解析による保守性の向上
Section titled “3. 静的解析による保守性の向上”静的解析ツールは、欠陥を見つけるだけでなく、コードやアーキテクチャの「保守性」を向上させるためにも活用されます。構造化されておらずコメントもないコードは、修正時に新たな欠陥を埋め込むリスクを高めます。
コーディング標準の検証
Section titled “コーディング標準の検証”命名規則、インデント、コメントの記述などのコーディング標準やガイドラインに準拠しているかを検証します。ツールは欠陥を検出するというより、コードが構文的に正しくてもルールの違反に対して「警告」を発します。
モジュール化の支援とメトリクス
Section titled “モジュール化の支援とメトリクス”保守しやすいシステムは、コンポーネント間の依存度である 「結合度」 が低く、単一のタスクへの集中度である 「凝集度」 が高い傾向があります。静的解析ツールは以下の方法でこれを支援します。
- リファクタリングの候補となる「重複しているコード」を検索する
- 結合度や凝集度といった有用なメトリクスを生成する
- オブジェクト指向コードにおける親クラスへの可視性の問題や、構造的に複雑度が高い部分をハイライトする
Webサイトとセキュリティのチェック
Section titled “Webサイトとセキュリティのチェック”Webサイトの実装コードに対して静的解析を適用し、サイトのツリー構造のバランスをチェックすることもできます。バランスの悪さは、テストタスクの困難さやメンテナンス負荷の増加を引き起こします。 また、コードインジェクションやクロスサイトスクリプティングなど、セキュリティの脆弱性にさらされる可能性のチェックにも活用されます。