静的コード解析は、ソフトウェアのソースコード内の欠陥を検出するプロセスです。静的解析ツールは、一般的なコーディングミスを検出するのに役立ちます。それらを使用する利点は次のとおりです:
- ソースコードの可読性と保守性を高める。
- 実行時の予期しない動作を防ぐ。
- 実行を最適化する。
- コードのセキュリティを高める。
C++の世界では、CppcheckはC++コードベースの問題を検出する最も一般的なツールです。Cppcheckの結果を確認する方法はいくつかあります。
- XML形式:CppcheckはXMLファイルを生成でき、それを使ってカスタマイズしたHTMLレポートを作成したり、別のツールで解析結果を確認したりできます。
- HTML形式:HTMLレポートは、Cppcheckの問題を分かりやすく提示する方法です。サーバーに保存して、チームで共有できます。
- IDEプラグイン:IDEから直接問題を確認できるCppcheckプラグインが多数用意されています。
数年前、私たちは CppDepend に、他のツールの結果をインポートしてCppDependからクエリできる機能を追加しました。Cppcheckのリード開発者であるDaniel氏に、彼のツールをCppDependへ統合してよいか尋ねたところ、「1つのツールを使うより、複数のツールを組み合わせた方がよい」と回答があり、彼のツールを組み込むことに問題はありませんでした。
CppDependがCppcheckユーザーに提供する可能性を見ていきましょう:
1. CQLinqで問題をクエリする
CQLinqを使用すると、問題をデータベースのようにクエリできます。たとえば、すべてのCppcheckの問題を取得できます:

または、最も頻繁に発生している問題を取得できます:

問題が最も多いクラスを特定するのも有用です:

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

問題を含む、最も頻繁に使用されるメソッドを検索することもできます。このようなメソッドのバグは、高い優先度で解決すべきです。

2. 問題のトレンドを生成する
プロジェクトに問題があること自体は珍しくありません。どのプロジェクトにも、解決すべき多くの問題があり得ます。しかし、プロジェクトの品質傾向は確認する必要があります。プロジェクトの変更と進化に伴って問題数が増加するのは、悪い兆候だからです。CppDependには、トレンドチャートを作成するためのトレンド監視機能があります。
トレンドチャートは、解析中に時系列で記録されたメトリクス値から構築されます。デフォルトで50を超えるトレンドメトリクスが利用可能で、独自のトレンドメトリクスも簡単に作成できます。
このトレンドチャートを使うと、Cppcheckの問題の推移を監視できます:

3. カスタムHTMLレポートを生成する
CppDependでは、いくつかのCQLinqクエリを一覧表示する追加のレポートセクションをHTMLレポートへ追加できます。CQLinq Query Explorerパネルでは、レポート対象のCQLinqグループがオレンジ色の長方形で囲まれます。

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

4. Cppcheckをビルドプロセスへ統合する
CppDependには、Critical CQLinq Ruleという概念があります。Critical Ruleは、決して違反してはならない優先度の高いルールを定義する手段です。Critical Ruleを使用すると、重大なルール違反が発生したときにビルドプロセスを失敗させられます。
Critical Ruleとは、 Critical Rule フラグがオンになったCQLinqルールです:

ビルドプロセス中にCritical Ruleに違反すると、プロセス CppDepend.Console.exe はゼロ以外の終了コードを返します。この動作を利用して、Critical Ruleに違反した場合にビルドプロセスを失敗させられます。
特定の種類のCppcheck問題が見つかった場合にビルドを失敗させるCppcheckのCritical Ruleを、簡単に定義できます。
概要
CppDependは他の静的解析ツールにも開かれており、 こちらで説明しているように、カスタマイズしたツールも簡単に組み込めます。これにより、CppDependのすべての機能を使って、有名なC/C++静的解析ツールの結果をより詳しく調べられます。
優れたツールをCppDependへ組み込むことを許可してくれたDaniel氏に、心から感謝します。
