2014年1月6日月曜日

SonarQube で C++ のコードを解析してみた

C++ の静的解析にはこれまで cppcheck を使ってきましたが、今回は SonarQube を使ってみたいと思います。
※ SonarQube で C++ の解析をする場合、プラグインのライセンス購入が必要になります。本記事ではトライアルキーを使用しています。

セットアップ~サンプルの解析
まずは環境をセットアップしたいと思います。
手順は公式ドキュメントを参考にしました。

サーバープログラムのセットアップ
ダウンロードページから sonarqube-X.X.zip をダウンロードします。X.X はバージョン番号です。
今回は 2013/11/21(検証したのが去年なの…) 時点での最新である、4.0 を使用しました。
ダウンロードしたら、解凍します。
保存先は C:\sonarqube か /etc/sonarqube にしましょうと書いてありますが、今回は D:\sonarqube\sonarqube に保存しました。

つづいて、プログラムを起動します。
sonarqube\bin\windows-x86-32\StartSonar.bat を実行すると以下のような画面が出ます。


クライアントのセットアップ
クライアント側をダウンロードします。
ダウンロードページの SonarQube Runner のところから sonar-runner-dist-X.X.zip をダウンロードしてください。(2013/11/21 時点での最新である、2.3 を使用しました。)
保存先は C:\sonar-runner か /etc/sonar-runner にしましょうと書いてありますが、今回は D:\sonarqube\sonar-runner に保存しました。

サンプルの解析
公式ドキュメントの手順 4. のダウンロードリンクからサンプルがダウンロードできるので取得し、解凍します。
保存先は C:\sonar-examples か /etc/sonar-examples にしましょうと書いてありますが、今回は D:\sonarqube\sonar-examples に保存しました。

展開したら、コマンドプロンプトで D:\sonarqube\sonar-examples-master\projects\languages\java\sonar-runner\java-sonar-runner-simple まで移動し、そこで sonar-runner.bat を実行します。
D:\sonarqube\sonar-runner\bin\sonar-runner.bat

INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
と、出力されたら成功です。
http://localhost:9000/ にアクセスすると以下のように結果が見れます。

プロジェクトページはこんな感じ。


C++ で試す
Java の解析ができたので、次は C++ を解析したいと思います。
SonarQube で C++ の解析をするためには、プラグインが必要になります。
こちらからプラグインがダウンロードできます。
sonar-cpp-plugin-X.X.jar(2013/11/21 時点での最新である、1.6 を使用しました。) がダウンロードされるので、そのファイルを
sonarqube\extensions\plugins にコピーします。

次にサーバーを再起動し、http://localhost:9000/ を開きます。
右上の Login ボタンをクリックし、administrator アカウントでログインします。
(デフォルトでは admin/admin)



ログイン後、右上の Setting ボタンをクリックします。
設定ページが開くので、General Settings > Licenses を開くと図のようなページが開きます。

C/C++ のライセンス入力ボックスにキーを入力します。(本記事ではトライアルキーを使用)

ライセンスキーの入力が完了したらプラグインを使用できるようになります。
まずは、サンプルを解析しました。
sonar-examples-master\projects\languages\cpp\cpp-sonar-runner で java の時と同様に sonar-runner.bat を実行します。
問題なく解析でき、以下のように結果が得られます。


サンプルの結果は公式ページからも見ることができるので、どんなものかすぐに見たい方はこちらからどうぞ。
http://nemo.sonarqube.org/dashboard/index/poco.net

iutest で試す
自作テスティングフレームワークの iutest を解析してみました。
結果がこんな感じ。

結構な数が出ました…ちまちま修正していきます…

Jenkins との連携
Jenkins との連携もできます。プラグインは Sonar plugin です。
その辺についてはこちらでは省きます。
詳しく知りたい人は、以下が参考になると思います。(セットアップも詳しく書かれています。)
SonarQubeをWindows環境で使ってC#コードを解析する - 亀岡的プログラマ日記
SonarとJenkinsを連携させる - 亀岡的プログラマ日記

感想
使ってみた感想。
検出数は多いのですが、コーディングルールに関するものが多くクリティカルな問題はあまり検出されないように感じました。(nullptr デリファレンスを検出できるか試したが、出なかった(※サンプルコードが悪かったのかもしれないが…))
複雑度やコード重複なども出力されるのでメトリクスツールとしては使えそうでした。

MIRSA や長い行・関数・引数、複雑度の高いものなどなど出ますが、自分のコーディングスタイルと合ってなかったり、直しようのないものもあったりしたので、これらの警告を無視/無効にする方法を調べないといけないと思いました。(トライアルライセンスの期限が切れてしまってるが…)

あとは、今回トライアルライセンスで検証しましたが、ライセンスが有料で € 7,000 するのがネックでしょうか・・・

0 件のコメント:

コメントを投稿