ObjectSquare [2012 年 3 月号]

[技術講座]


静的解析のススメ: AdLint でソースコードの健康診断をしませんか?

株式会社 オージス総研
組み込みソリューション第 2 部
AdLint 嶋 里江
矢野尾 裕

ソースコードの健康診断、していますか? 健康診断を怠ったことで、不具合が後から見つかり、大問題に発展した経験はありませんか?

不具合を事前に見つけ、ソフトウェアを健康な状態に保つため、 定期的にソースコードをきちんと検査することが大切です。

本記事では、検査方法の 1 つとして、ソフトウェアの解析について紹介します。

AdLint(オープンソース)プロジェクト、及びAdquaのご提供は終了しています(2016/1/28更新)

静的解析と動的解析

ソフトウェアを解析する方法として、静的解析と動的解析が挙げられます。

  静的解析 動的解析
概要 対象ソフトウェアを実行せずに検査。網羅性の高い検査が可能 対象ソフトウェアを実行して検査。実行時に実際に起こる事実に基づいて検査が可能
目的 ソースコードの内容から不具合となり得る問題を洗い出す 動作から実際に不具合となっている問題を洗い出す
解析対象 ソースコード (ホワイトボックス) 実行可能ファイル (ブラックボックス)
検査の方法 静的解析ツール、開発者によるコードレビュー 動的解析ツール、デバッガ
検査で発見できる問題 潜在的な不具合となり得る記述、コーディング規約違反など メモリリーク、デッドロックなど
メリット
  • ターゲット実行環境がなくても検査が可能
  • 結合前に単体の機能だけでも不具合を発見できる
  • 限定的なエラー処理など実行条件を簡単には整えられないケースも検査可能
  • 実際の動作に基づき正確な検査が可能
  • リグレッションテストのような、時間軸を考慮したテストが可能

デメリット
  • コードレビューの場合、網羅性を上げるには膨大な工数が必要
  • コードレビューは属人性が高い活動なので、どうしても検査の内容にムラが出る
  • 静的解析ツールは有償で高価なものが多い
  • ターゲットの実行環境を準備することが難しい場合がある
  • 網羅性を上げるには、膨大なテストデータ、シミュレータなどが必要
  • 問題を発見した際、ソースコードのどの部分が問題かを特定することが難しい場合がある

ソフトウェアの品質を向上するには、静的解析・動的解析、どちらかの解析だけを行っておけばよいというものではありません。

静的解析を実施し、発見された不具合を修正し、ソースコードに問題がない状態にした後で 実際の動作に基づいた動的解析を行った方がより効率的に開発ができるでしょう。

では、効率的に静的解析を行うためにはどうすればよいでしょうか?

静的解析ツール使用のススメ

上記でも挙げたように、静的解析の実施方法には コードレビューと静的解析ツールの使用が挙げられます。

以下のようなことは、コードレビューでのみ行うことができます。

しかし、コードレビューには以下のようなデメリットもあります。

これらのデメリットの部分をカバーするために、静的解析ツールは非常に有用です。

また、ソースコードレビューを実施する前に静的解析ツールを使用し、問題のある箇所を発見して修正しておくことで、 効率的にコードレビューを実施することも可能となります。

ここで、静的解析ツールを使用するメリットをいくつか説明します。

全ソースコードをチェックすることが可能

機械的に解析するので、人の目ではあり得る見落としがありません。

更に、網羅性が高いテスト結果を得ることができます。

実装と同時並行でテストが可能

静的解析ツールによっては、開発環境に組み込んで使用することも可能です。

例えば、コンパイルと静的解析を続けて実行することで、実装しながら、問題のある箇所を発見・修正することが可能となります。

環境設定が容易

動的解析ツールを使用するためには、実行環境でテストを行う必要があるため、環境設定が難しいことが少なくありません。

静的解析ツールは、開発環境に組み込んで使用することができるので、比較的簡単に解析環境を整えることができます。

客観的にソフトウェアの品質を確認できる

静的解析ツールには、潜在的な不具合を警告する機能だけではなく、 コード行数や、経路複雑度などの品質メトリクスを測定する機能を付随させているものが多いです。 これらのデータを更に解析することで、ソフトウェアの品質を数値で確認することが可能となります。

AdLint の紹介

株式会社 オージス総研 組み込みソリューション部 コード品質評価チームは 2/28 に 静的解析ツール AdLint(アドリント) を公開しました。

AdLint には、以下の特徴があります。

AdLint(オープンソース)プロジェクト、及びAdquaのご提供は終了しています(2016/1/28更新)

警告検知

ソースコード内の信頼性や移植性に欠ける部分に、問題を指摘する警告メッセージを出力することができます。

(画像はクリックで拡大します。)

AdLint

AdLint

メトリクス測定

サイクロマティック複雑度*1、推定静的パス数*2、デッドコードとなる文の数など、ソースコードの品質メトリクスを定量的に測定することができます。

これらの測定結果を分析することで、ソフトウェアの品質を数値として確認することが可能となります。

更に、AdLint での出力結果をAdquaで処理することで、実装レベル / 設計レベルにおける問題発見や品質改善に活用することができます。

*1 サイクロマティック複雑度 : McCabe (マッケーブ) の提唱したメトリックで、プログラムを構成する線上にある独立したパスの数。 計算式「制御フローグラフのエッジ数 - ノード数 + 2」で算出し、関数中の分 岐の数に 1 を足したものに等しい。

*1 推定静的パス数 :関数の制御フロー内で考えられるすべての実行経路の数。

AdLint 概要

解析対象プログラミング言語 C 言語
(ANSI C89 、ISO C90 、一部 GCC などの拡張機能に対応)
出力する警告メッセージの種類 718 種類
(2012 年 2 月現在、597 種類を出力)
測定する品質メトリクスの種類 15 種類
出力するコード情報の種類 14 種類
動作環境 Windows XP 、Windows 7 、各種 Linux ベース OS など、
Ruby バージョン 1.9.3-p0 以降が動作するもの
動作要件 Ruby バージョン 1.9.3-p0 以降 (必須)
GNU Make バージョン 3 以降 (推奨)

まとめ

ソフトウェアを健康な状態に保つことは重要です。

静的解析ツールを有効に取り入れ、実際に動作させる前に検査を行うことで、不具合を発見したり、品質を可視化することが可能となります。 静的解析ツールの導入により、品質改善活動の一端を担うことが可能となるでしょう。   

本記事及び AdLint をきっかけに、ソフトウェアの静的解析について興味を持って頂けると幸いです。

AdLint(オープンソース)プロジェクト、及びAdquaのご提供は終了しています(2016/1/28更新)


更新履歴



© 2012 OGIS-RI Co., Ltd.
Index Next
INDEX NEXT