「第3回 ソフトウェアテストセミナー」レポート

#3 セッション2 静的コード解析でわかる!不具合の傾向と対策

この記事を読むのに必要な時間:およそ 1.5 分

コベリティ日本支社
安竹 由起夫 氏

コベリティ日本支社<br>安竹 由起夫 氏

3番目のセッションでは,コベリティ日本支社の安竹由起夫氏より,⁠静的コード解析でわかる!不具合の傾向と対策」と題し,静的解析の仕組みや多くのプログラムを解析した結果から見られる不具合の実際などについて,講演が行われました。

100%パスカバレッジを達成した静的解析ツール

開発ライフサイクルの早いタイミングでプログラムの不具合を検出し,信頼性を高められれば,製品の品質を高められるだけでなく,開発期間の短縮やコストの低減といったメリットも生まれます。ただ,プログラムを実行して解析を行う動的解析の手法では,プログラムを実行可能なタイミングまで検証を行えません。そこでプログラムを実行することなくコードを解析し,不具合を検出する「静的解析」の手法の重要性が高まっています。

この静的解析を実施するツールとして,コベリティより提供されているのが「Prevent」です。Java,C/C++,C#といったコードの解析に対応した静的解析ツールとなっており,ソフトウェア開発におけるテスト工程をサポートするというものとなっています。

Preventの大きな特徴として,コベリティ日本支社の安竹由起夫氏は誤検知率の低さを挙げます。その背景にあるのは,100%パスカバレッジの実現です。関数呼び出しや条件分岐によって生まれるプログラムのパスをすべて検査することで,誤検知率を下げているというわけです。このような検知精度を高めるための仕組みが搭載されていることがPreventの特徴となっています。

Preventが100%パスカバレッジを達成することにこだわっている理由は,ソースコード内におけるさまざまな関係をすべて見ていかないと,正確に問題を発見することができないからと安竹氏は述べます。たとえばある関数内で宣言された変数がこちらのパスでは呼び出し先で解放されているが,別のパスを通るとその呼び出し先に飛ばないため解放されていなかったといったことは,すべてのパスを追いかけなければ分からないというわけです。

ソースコードの構造やビルドにおける問題点の解析も可能

コベルティでは,アーキテクチャ解析を行う「Coverity Architecture Analysis」や,ビルドシステムの障害を事前に検知する「Coverty Build Analysis⁠⁠,そしてマルチスレッドのJavaアプリケーションにおける競合やデッドロックを動的解析により検出する「Coverty Dynamic Analysis」といった製品も提供しています。安竹氏によりこれらの製品についても解説が行われました。

Coverty Architecture Analysisでは,同社のコード解析エンジンを活用し,ソースコードの構造や設計を解析し,関数の呼び出し関係を可視化するといったことを可能にしています。さらに「ソースコードを修正した場合に,以前の解析結果と比較することで修正の影響範囲を判断するといった使い方もできます」と説明します。

Coverty Build Analysisは,ビルドに必要なソースファイルが組み込まれているか,それらが問題なくコンパイルされているかなど,ビルド時の障害発生を防ぐ解析機能を提供する製品です。ビルドに時間がかかっている原因の特定することも可能ということで,エンジニアの生産性改善に役立つツールと言えるでしょう。

マルチスレッドのJavaアプリケーションにおいて,競合状態やデッドロックを自動的に予測,検出することを可能にしているのがCoverty Dynamic Analysisで,競合状態に陥りそうな場所にあたりを付けておき,タイミングをずらしながら実際に動かすことで,本当に競合するのかどうかといったことを調べられるツールとなっています。

システムに深刻な影響を与える問題が多発

続いて,コベリティがこれまで解析したソースコードを解析した結果が紹介されました。解析対象となったのは178の商用プロジェクトで,コード行数は約8800万行,検出された不具合は14万2417件とのことでした。

その中で検出密度が高かったのは,配列のサイズを超えたアクセスである「OVERRUN_STATIC」とのこと。NULLを保持,またはNULLチェックした変数がその後のパスで間接参照される「FORWARD_NULL⁠⁠,そしてメモリなどのリソースがスコープを外れてリークする「RESOURCE_LEAK」といった問題も多かったということでした。いずれも重要度の高い問題であるにも関わらず,見過ごされていることが多い現実がこの結果から分かります。

さらにオープンソースでの解析結果も紹介されました。プロジェクト数は280で,LinuxやFirefox,PHP,rubyなどのソースコードが解析されています。こちらの解析対象は6000万行で,検出された不具合は3万8453件ということでした。もっとも多かったのは「FORWARD_NULL」で,こちらは商用コードでも3番目に検出密度が高い問題として挙げられています。このように見ていくと,問題の種類において商用プロジェクトとオープンソースの間に大きな違いはなく,テスト工数がないことなどが原因ではないかと安竹氏は分析します。さらにシステムに深刻な影響を与えるOVERRUN_STATICの問題が多く発生していることなどを踏まえ,レビューの際にはこうした点を重点的にチェックして欲しいと注意を促しました。

なお,静的解析ツールを利用してソースコードを分析すると,大量の問題が出てくることが珍しくなく,それによって開発現場が混乱してしまうことも考えられます。こうした混乱を避けるために,静的解析ツールを利用する際には,まず既存のコードと新規コードを切り分けて解析し,その結果や重要度によって対応すべき問題に優先度を付けることが重要であると安竹氏は活用のポイントを紹介します。さらに検出した問題の傾向や検出された問題をレビューするのに要した工数,問題の修正にかかった工数などのメトリクスを収集することが,継続的にコード品質を維持する上で重要と紹介し,プレゼンテーションを終えました。