ナレッジ
静的コード解析ツールとは?できることやお勧めのツールを紹介
目次
ソフトウェア開発において、コードの品質やセキュリティを確保するために静的解析を導入したいという方は多いでしょう。しかし、静的解析の具体的な目的や、できること、できないこと、動的テストとの違いについて理解されているでしょうか。
本記事では、静的解析の基本的な概念から始まり、その目的や役割、動的テストとの違いについて解説します。また、静的解析の中でも特に静的コード解析について、ツールでできることとできないこと、静的コード解析ツールを導入するメリットと導入時の課題についても触れ、最後に、お勧めの静的コード解析ツールをご紹介します。
静的解析とは?
静的解析とは、コードを実行することなくソースコードやバイナリコードを解析して、コード上に存在するさまざまな問題を発見したり、コードの内部構造やOSSなどのコンポーネントを特定したりする手法です(図表1)。
静的解析は、基本的にはツールを利用して行います。
静的解析の種類
静的解析はその目的と手法によりいくつかの種類に分けられます。今回の記事ではその中でも「静的コード解析」をメインに取り上げますが、この章では静的解析の種類を紹介し、その違いを明確にしていきます。
静的コード解析
静的コード解析は、コードを実行せずに、プログラムのソースコード上のプログラミングとしての誤りや、不正動作になり得る記述などを自動的に検出するために用いられます(図表2)。
開発初期の段階でバグやコーディング規約からの逸脱も発見できるため、コード品質の向上やリリース後の不具合低減に役立ちます。また、脆弱性につながる可能性のあるソースコードの記述を検出することで、ソフトウェアのセキュリティ向上にも利用できます。
ソフトウェアの構造解析
ソフトウェアの構造解析は、ソフトウェアのソースコードや実行ファイルを分析して、その内部構造や動作を理解する手法です(図表3)。この手法では、関数やクラスの関係、制御フロー、データフロー、モジュール間の依存関係などを構造解析の上 、ソースコードからクラス図やコールグラフなどを生成します。
この解析でコードが可視化されることにより、コードレビューが容易になったり、コード上の不具合の原因特定に役立てたりすることができます。また、 ソフトウェアのメンテナンス性と拡張性が向上します。
ソフトウェアコンポジション解析
ソフトウェアコンポジション解析(SCA:Software Composition Analysis)は、ソフトウェアの依存関係やそのソフトウェアが含むOSS(オープンソースソフトウェア)を検出します(図表4)。目的は、ライセンス違反を防ぐことと既知の脆弱性や依存関係の問題を特定しセキュリティリスクを低減することです。
バイナリコードの静的解析
バイナリコードの静的解析は、コンピュータプログラムやデータファイルのバイナリ形式のオブジェクトファイル を解析する手法です(図表5)。この解析を通じて、プログラムの内部構造や動作、アルゴリズム、不正コード、バグなどを検出・解析します。主に逆アセンブル、デバッグ、マルウェア解析などの目的で使用されます。高度な知識と専門的なツールが求められます。
静的コード解析ツールの目的(導入するメリット)
本章では、静的コード解析ツールを利用する目的(導入するメリット)と、開発プロジェクトの効率化やリスク低減にどのように役立つかを解説します。
バグの早期発見
コードのコンポーネントが実行される前にバグを見つけることで、修正コストを削減できます。早期に発見されるバグは、後々の修正作業よりも簡単かつ低コストで修正可能です。
コード品質の向上
コーディング規約に基づいてコードをチェックすることで、組織として一定の記述ルールにのっとった実装が担保されるため、コード品質を確保できます。
人手によるコードレビューの工数削減
静的コード解析ツールを導入することで、人手による目視でのコードレビューの工数を削減できます。静的コード解析ツールで検出できる問題を人手によるコードレビューの前に検出しておくことで、レビュワーはより人手でしか確認できない観点に集中してレビューすることができます。
セキュリティ強化
コード内の潜在的な脆弱性を事前に発見することで、リリース後のセキュリティリスクを低減できます。
メンテナンス効率の向上
静的コード解析ツールを使用し、関数の複雑度、関数コール数などのメトリクスを参考にコードを修正することで可読性を向上させたり、コーディング規約からの逸脱を検出、修正することで一貫性のあるコードを保つことができ、将来的なメンテナンス作業が容易になります。
静的コード解析と動的テストの比較
動的テストとは、実際にコードを実行してその挙動を観察することで、評価・検証する手法です。例えば、コンポーネントテストや統合テストなどがこれに該当します。
一方、静的コード解析はコードを実行せずに解析を行います。動的テストでは設計仕様やコードの構造に基づいてコードが期待通りに動作するかを確認すること、静的コード解析ではツールが持つチェック観点をベースにプログラムを解析することが目的であり、適切に使い分ける必要があります。
図表6に、静的コード解析と動的テストのメリット・デメリットをまとめました。
| 静的コード解析 | 動的テスト(単体テスト) |
---|---|---|
主な目的 | 不正動作になり得る記述や、記述ルールからの逸脱などを検出する。 | コードが期待通りに動作することを確認する。 |
メリット | プログラミング上の注意点に関して、網羅的に確認できる。プログラマーの抜け漏れを検出できる。 | 実際にコードを実行し、起こった問題を報告するため、誤検知が少ない。 |
デメリット | コードを実行せずに分析するため、動的テストに比べると過検知・誤検知が多い。 | プログラマーの意図しないコーディングミスを検出しづらい。 |
図表6:静的コード解析と動的テストのメリット・デメリット
静的コード解析ツールで、できること・できないこと
本章では、静的コード解析ツールで実際に何ができるのか、そして何ができないのかについて解説します。静的コード解析ツールにできることとできないことを把握しておくことで効果的な静的コード解析ツールの導入につながります。
できること
まずは、静的コード解析ツールでできることを解説します。
コーディング規約のチェック
プロジェクト特有のコーディングスタイルを順守しているかを自動で確認できます。静的コード解析ツールの中には、SEI CERT C Coding StandardやMISRA Cなどの特定のプログラミング言語を対象としたコーディング規約に対応しているものも多く、それらのコーディング規約から逸脱している記述箇所を検出できます。
ランタイムエラーの検出
未初期化変数や不適切なメモリ管理、NULL参照など、不具合を発生させる可能性のあるエラーが発生し得る箇所 を検出できます。
脆弱性の発見
バッファオーバーフロー、SQLインジェクション、クロスサイトスクリプティング(XSS)などの脆弱性を生むプログラミングエラーが発生し得る箇所を検出できます。
メトリクスの収集と分析
関数の複雑度、関数コール数などのメトリクスを収集し、コードの品質を計測できます。
ツールによって、上記の全ての機能を持っているものや一つの機能に特化しているものがあります。
できないこと
続いて静的コード解析ツールにできないことです。
プログラムの仕様上の問題の検出
仕様上の問題とは、設計や要求仕様に対して意図した機能が正しく実装されていないケースのことです。こうした問題の検出には、プログラムの動作が仕様通りかどうかを判断する必要があります。このため、静的コード解析ツールでは仕様上の問題を見つけることはできません。
特定のユースケースの検証
特定の入力に対する出力や挙動を確認するには、動的テストが必要です。
パフォーマンスの計測
コードの実行速度やリソース使用量など、効率性に関わる特性は計測できません。
静的コード解析ツールを導入する際の課題
静的コード解析ツールを導入する際には適切なツール選定や、開発チームのスキルギャップ、初期コストや運用の負担など、多くの要素を考慮する必要があります。
本章では、静的コード解析ツールを導入する際に直面しがちな課題を解説します。
過検知・誤検知のリスク
静的コード解析ツールはあくまでコードの構造や記述をコーディング規約やパターンなどに基づいて問題を指摘するため、時には過検知や誤検知が発生します。これにより、必要以上に多くの警告が発生し、確認作業に非常に工数がかかる可能性があります。ツールの設定や検出結果の精査方法を工夫することで過検知を減らしたり、静的解析するコード部位を特定することが重要です。
コストと時間の問題
静的コード解析ツールの導入には初期コストと時間(工数)がかかります。また、定期的な解析を行うためにはその都度リソースを割く必要があります。静的コード解析の導入は、目的をはっきりさせ、効果的に利用することが求められます。CI/CDによる自動化に静的コード解析ツールを組み込むことで効率化することもできます。
運用計画を立てる必要がある
静的コード解析ツールを効果的に使用するためには、開発プロセスに合わせて、運用方法を定めることが重要です。運用方法を定めずに、導入してしまうと、ツールの利用が開発者任せとなり、ツールが効果的に利用されない可能性があります。
フリーの静的コード解析ツールのメリット・デメリット
ここでは、フリーの静的コード解析ツールのメリットとデメリットについて解説します。
メリット
メリットはライセンス費用がかからないことです。
デメリット
続いて4つのデメリットをお伝えします。
機能制限
有償のツールに比べると、ビューが分かりづらく、どこで問題が発生しているのかを特定しづらいことがあります。
また、解析の深度が低く、過検知・誤検出が多い場合や、逆に検出できる問題が少ない場合があります。狙った問題がツールの機能として検出できない場合、静的コード解析ツール導入の目的が達成できないことになるため、注意が必要です。
サポートの限定
公式サポートがない場合が多いため、トラブル発生時には自己解決が求められます。
対応言語が少ない
有償ツールだと同じツールで複数言語について解析できます。例えば、下記のような言語を同じツールで解析することが可能です。
- C
- C++
- C#
- Java
- VBScript
- VB.NET
- ABAP
- PHP
- JavaScript
- ASP.NET
- XML
- HTML
- COBOL
- Swift
- Objective-C
- Cold Fusion
- SQL
- Python
信頼性
機能安全やセキュリティの標準や法規にのっとった開発が求められる場合は、認証を受けていないなどの理由で、利用できない可能性があります。
お勧めの静的コード解析ツール
有償の静的コード解析ツールの中では、Coverity、Fortify SCA 、Sparrow SAST/SAQTというツールがお勧めです。
これらのツールについて、より詳しく知りたい場合には、当社にお問い合わせいただけますと幸いです。
静的コード解析ツール で品質向上を
静的コード解析は、ソフトウェア開発においてバグの早期発見、コード品質の向上、セキュリティ強化などを実現するための重要な手法です。静的コード解析ツールをプロジェクトに効果的に導入し、ソフトウェア品質を向上させましょう。
■関連サービス■
この記事は面白かったですか?
今後の改善の参考にさせていただきます!