ブログ 約5分

C/C++静的解析ツールを最大限に活用する

Share this article
C/C++静的解析ツールを最大限に活用する

静的コード解析は、ソフトウェアのソースコード内の欠陥を検出するプロセスです。静的解析ツールは、よくあるコーディングミスを検出するのに役立ちます。これらを使用する利点には、次のようなものがあります。

  • ソースコードの可読性と保守性を高める。
  • 実行時の予期しない動作を防ぐ。
  • 実行パフォーマンスを改善する。
  • コードのセキュリティを高める。

多くのC/C++静的解析ツールが利用可能であり、それぞれが特定の領域に焦点を当て、独自の利点を提供しています。例としては次のようなものがあります。

  • Cppcheck 
  • Clang Analyzer
  • Visual C++ Analyzer
  • Vera++
  • Goanna
  • Viva64
  • PCLint

これらのツールの結果を探索する方法はいくつかあります。

  • XML形式:これらのツールからXMLファイルを生成でき、それを使ってHTMLレポートを作成したり、別のツールで解析結果を探索したりできます。
  • HTML形式:HTMLは、レポートを生成してチームで共有するのに便利な形式です。XSLスタイルシートを使ってカスタムレポートを作成することもできます。
  • IDEプラグイン:よく知られたIDEのほとんどは、これらのツール向けのプラグインを提供しており、ソースコード内で違反を直接確認できます。

コード品質ツールの問題の1つは、実際には問題ではないもの、つまり誤検出で開発者を圧倒しがちなことです。誤検出が発生すると、開発者はツールの出力を無視するようになったり、ツール自体を使わなくなったりします。

結果をより適切に探索するには、関連する検出結果だけに集中し、開発者に結果を明確に表示する方法があると便利です。

CppDepend と CQLinq

CppDepend は、ほかのツールを補完するもう1つの静的解析ツールです。LINQベースのコードクエリ言語(CQLinq)を使って、コードベースをデータベースのように照会できます。

CppDependは既定で Cppcheck、Vera++、Clang Analyzer を内蔵しており、そのAPIを使ってほかの静的解析ツールをサポートするよう簡単に拡張できます。Visual Studio Analyzer プラグインのソースコードも公開されており、ほかのツールを統合する方法を確認できます。

例としてClangのソースコードを取り上げ、CppDependでこれらのツールの結果をどう探索できるかを見てみましょう。

すべての問題を取得する:

すべての問題を取得するクエリは非常にシンプルです。しかし、ご覧のとおり、それほど有用ではありません。331,417件の問題を含む結果を処理するのは困難だからです。

static1

これらのツールの結果をより適切に処理するには、フィルタリングして目的のものだけに集中できます。

ツール別のクエリ

最初のクエリを変更し、対象ツールの条件を追加できます。

static2

最も頻繁に報告される問題

これらのツールで最も頻繁に報告される問題を知ることは興味深いことです。

static3最も頻繁に見つかるのは、Vera++ が報告するスタイルの問題です。これらが目的に合わない場合は、クエリから除外できます。

問題の最も多いクラス

どのクラスに多くの違反が含まれているかを知ることは非常に興味深いことです。

static4

前のクエリは興味深いものですが、どのクラスに最も重大な品質問題があるのかを正確には示していません。考慮すべきもう1つの有用なメトリクスは NBLinesOfCode です。前のクエリを変更して、問題数と NBLinesOfCode の比率を計算できます。

static5

問題を抱える、最も広く使われているメソッド

静的解析ツールが問題を報告する場合、どれを優先すべきかを知ることが有用です。特にバグに関する場合は重要です。バグは特定のメソッドに存在する可能性がありますが、そのバグがいくつのメソッドに影響するのかを知ることが興味深い点です。広く使われているメソッドはより多くのコードから呼び出されるため、その問題は迅速に解決する方が望ましいでしょう。

static6

CQLinqを使うと、これらすべてのツールの結果とCppDependの結果を組み合わせて、より高度なクエリを作成し、これらのチェックをビルドプロセスへ追加できます。

問題の傾向

ソフトウェアプロジェクトで問題が発生することは珍しくありません。どのプロジェクトにも、解決すべき問題は存在します。しかし、プロジェクトの品質傾向を監視すべきです。プロジェクトの変更や進化に伴って問題数が増えるのは、悪い指標だからです。CppDependには、トレンドチャートを作成するためのトレンド監視機能があります。

トレンドチャートは、解析時に時間をかけて記録されたメトリクス値から作成されます。50を超えるトレンドメトリクスが既定で利用でき、独自のトレンドメトリクスも簡単に作成できます。

このトレンドチャートを使うと、Cppcheckの問題が時間とともにどう変化しているかを監視できます。

cppcheck7

静的解析ツールの結果をHTMLレポートへ統合する

CppDependでは、いくつかのCQLinqクエリを一覧表示する追加のレポートセクションをHTMLレポートへ追加できます。


CQLinq Query Explorer パネルでは、特定のCQLinqレポートグループがオレンジ色の四角形で囲まれて表示されます。

cppcheck10

HTMLレポートでは、これらの追加セクションにメニューからアクセスできます。

cppcheck11

静的解析ツールの結果をビルドプロセスへ統合する

CppDependには Critical CQLinq Rule という概念があります。クリティカルルールを使うと、決して違反してはならない優先度の高いルールを定義できます。クリティカルルールでは、違反が発生したときにビルドプロセスを失敗させることが可能です。

クリティカルルールとは、 Critical Rule フラグがオンになっているCQLinqルールにすぎません。

ビルドプロセス中にクリティカルルールが違反されると、 CppDepend.Console.exe は0以外の終了コードを返します。この動作を利用して、クリティカルルールが違反された場合にビルドプロセスを失敗させられます。

特定の種類のCppcheckの問題が見つかった場合にビルドを失敗させる、Cppcheckのクリティカルルールを簡単に定義できます。

まとめ

CppDependはほかの静的解析ツールに対して開かれており、独自のカスタムツールも簡単に統合できます。これにより、CppDependのすべての機能を使って、サポートされているC/C++静的解析ツールの結果をより適切に探索できます。

Share this article