Community版SonarQubeでC/C++コードチェック

SonarQubeでC++開発
Christopher KuszajewskiによるPixabayからの画像

※この記事にはプロモーションが含まれています。

今回は、Community版のSonarQubeでVisual Studio C++ 2019のコードをチェックします。Community版SonarQubeにはC/C++は標準サポートされていないため、OSSプラグインsonar-cxxを使用します。

スポンサーリンク
スポンサーリンク

プラグインsonar-cxx導入

sonar-cxxとは

SonarQube対応のフリープラグインです。パーサーは、C89・C99・C11・C17・C++03・C++11・C++14・C++17・C++20 standardsに対応しています。また、Visual StudioおよびGCC等マルチプラットフォームをサポートしてます。

機能の詳細については、SonarQube C++ plugin (Community)を参照してください。

インストール

環境は、前回コード品質可視化DockerでSonarQube!WSL2で構築で作成したものを使用します。

プラグインのサポート表からV1.3.2を採用することとし、プラグインダウンロードサイト(Release)から、下記2つのモジュールをダウンロードします。

  • sonar-c-plugin-1.3.2.1853.jar
  • sonar-cxx-plugin-1.3.2.1853.jar

モジュールは、下記コマンドでSonarQubeコンテナのプラグイン格納フォルダにコピーします。

docker cp sonar-c-plugin-1.3.2.1853.jar sonarqube:/opt/sonarqube/extensions/plugins/

docker cp sonar-cxx-plugin-1.3.2.1853.jar sonarqube:/opt/sonarqube/extensions/plugins/

モジュールのコピーが終わったら、[Adminisstration] > [System] > [Restart Server]をクリックし、サーバーを再起動します。

再起動が完了すると、[Administration] > [Marketplace]メニューの一覧にCおよびC++が追加されています。

cppcheckツール連携

コード解析の1つである、cppcheckの結果もSonarQubeの収集内容に加えることにします。

cppcheckは、cppcheckサイトのdownload欄からダウンロードしてWindowsにインストールします。

コードチェック

Visual Studio 2019のC++コンソールアプリケーションプロジェクトを例に、コードチェックの手順を説明します。

SonarQubeの管理コンソールで、適当なプロジェクト(ex. Test-C++)を作成しておきます。

チェック対象とするコードは以下の通りです。

#include <iostream>

char sub(char* x)
{
    char* p = new char[1000];
    return x[10];
}

int main()
{
    std::cout << "Hello World!\n";
    int* a = 0;
    char b[10] = { 0 };
    char c = sub(b);
}

C++ルールのactive化

sonar-cxxのルールセットは定義数が多いため、負荷を考慮してデフォルトでは全て無効に設定されています。これをActiveに変更します。

[Quality Profiles] > [C++(Community)] > [歯車] > [Copy]から、”Sonar Way”プロファイルを名前は任意(ex. Sonar way-new)でコピーします。

次に、[Quality Profiles] > [Sonar way-new] > [Activate More] > [Bulk Change] > [Activate in Sonar way-new]で全ルールをactive化します。

最後に、[Projects] > [Test-C++] > [Administration] > [Quality Profiles] > [C++ (Community)]で、コンボボックスから”Sonar way-new”を選択します。

設定ファイル作成

解析するソースコードフォルダのトップフォルダ(slnファイルと同じフォルダ)に、sonar-project.propertiesファイルを作成し、以下の内容を記述します。

例によって、SonarQubeプロジェクト作成時のKeyとNameを指定します。

Visual Studio 2019以外を使用する際は、sonar.cxx.vc.regexの値をMicrosoft Visual Studio Compilerを参考に設定値を変更してください。

sonar.projectName=Test-C++
sonar.projectKey=abc
#sonar.projectVersion=1.0
sonar.sources=.
sonar.sourceEncoding=UTF-8
sonar.cxx.vc.regex=(.*>)?(?<file>.*)\\((?<line>\\d+),\\d+\\):\\x20warning\\x20(?<id>C\\d+):\\x20(?<message>.*)
sonar.cxx.vc.reportPath=*.log
sonar.cxx.vc.charset=UTF-8
sonar.cxx.msbuild.reportPath=buildlog.log
sonar.cxx.msbuild.charset=UTF-8
sonar.cxx.cppcheck.reportPath=cppcheck.xml

設定の詳細は、Supported configuration propertiesに記載されています。

Visual Studioの設定

Visual Studioのビルド設定を3点見直して、強化します。

まず、[プロジェクト] > […のプロパティ] > [構成プロパティ] > [C/C++] > [全般] > [警告レベル]を”レベル4″に設定します。

次に、[プロジェクト] > […のプロパティ] > [構成プロパティ] > [コード分析] > [全般] > [ビルドに対するコード分析の有効化]を”はい”にし、

その下の[Microsoft] > [アクティブな規則]を”Microsoft ネイティブ推奨規則”に設定します。

最後に、[ツール] > [オプション] > [プロジェクトおよびソリューション] > [ビルドして実行] > [MSBuild プロジェクトビルドログファイルの詳細] を”詳細”に設定します。

実行

以下をCMDから実行します。

まず、C++プロジェクトをリビルドします。上記の詳細設定により、必要な情報がログファイルに出力されます。

call "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Community\Common7\Tools\VsMSBuildCmd.bat"

msbuild.exe /v:Detailed /t:rebuild /p:Configuration=Debug ConsoleApplication2.SLN > buildlog.log

次にcppcheckを実行します。

"%ProgramFiles%\cppcheck\cppcheck.exe" --xml --project=ConsoleApplication2.sln --xml-version=2 2> cppcheck.xml

最後に、下記を実行してSonarQubeサーバーに情報を送信します。

sonar-scanner.bat

Memory Leakを筆頭に、いくつか問題点が指摘されていることが分かります。

まとめ

Community版のSonarQubeにC/C++プラグインおよびcppcheckを導入して、解析の幅を広げました。まだ、同プラグインでは様々なツール類との連携も備えています。各自のプロジェクトに遭ったものを選択して、よりよいコード品質にしていきましょう。

以上、Community版SonarQubeでC/C++コードチェックの紹介でした。

コメント