ただのメモ

開発で得た知識のアウトプット

GitHubリポジトリにSynopsys Coverity Scan Static Analysisのバッジをつける

今回はGitHubのREADMEでよく見かけるCoverity Scanのバッジをつける流れのメモです。

https://camo.githubusercontent.com/c5ac830f3fb7dfc432f31df74c22978336950978c40ba6ae205a1cec827b31a0/68747470733a2f2f7363616e2e636f7665726974792e636f6d2f70726f6a656374732f32323431372f62616467652e737667 ← コレ

Synopsys Coverity Scan とは

 Coverityは、Synopsys社が提供する静的コード解析ソフトウェアで、Coverity Static Analysisではビルドのプロセスから生成したグラフから網羅的な解析を行います。Coverityではこのような方式をとっていることから、低レベルなエラーなども含めた高精度な解析結果を得ることができます。対応している言語は、C/C++, C#, Java, JavaScript, PHP, Python, .NET Core, ASP.NET, Objective-C, Go, JSP, Ruby, Swift, Fortran, Scala, VB.NET, iOS, TypeScriptなどです。

詳細情報は、以下のリンクから静的解析 (Coverity)のデータシートから見ることができます。
www.synopsys.com

 Coverityは、GitHubで公開されているオープンソースのソフトウェアでは、Coverity Scanというサービスにより無償で利用できます。

今回利用するプロジェクト

今回はCMakeを利用した次のC++プロジェクトに対して解析を行います。特にwxWidgetsという外部ライブラリをリンクしているため、コード解析の例として参考になると思います。
github.com

このソフトウェアは、WindowsをVimのキーバインディングで操作するツールとして公開しているもので、興味のある方は次の記事をご覧ください。
www.pit-ray.com

手順

Coverity Scanは次のサイトから利用します。
scan.coverity.com

GitHubとの連携

まずは、GitHubとのリンクを行うために、右上のSign upからSign in with GitHubを押します。

f:id:pit-ray:20210112173841j:plain

f:id:pit-ray:20210112174038j:plain

すると、Coverity ScanによるGitHubへのOAuthの認証が要求されるので、許可します。
f:id:pit-ray:20210112174406j:plain

プロジェクトの追加

アカウントを連携したら次のリンクから自分のプロジェクトを選択します。
https://scan.coverity.com/projects/new?tab=github_index

そうしたら、ライセンスやホームページURLなどの必要な事項を記入し、Submitします。今回の場合は、自分のリポジトリであるので、RoleをMaintainer/Ownerとしていますが、適宜適切なものを選択します。
f:id:pit-ray:20210112174919j:plain

すると、Project Settingsの設定画面が表示されると思います。ここで、Quick Start GuideからSubmit Buildを選択します。
f:id:pit-ray:20210112175817j:plain

解析

解析のためのファイルはUpload Buildのページからアップロードします。ここでバージョンや説明などの必要な事項を入力します。

f:id:pit-ray:20210112175711j:plain

初めに述べたように、Coverity Static Analysisはビルド時のプロセスを監視して解析用のグラフを生成します。そこで、Coverityビルドツールをダウンロードし、オフラインで解析用のファイルを生成したうえで、そのファイルをアップロードします。このような手順を踏むことで、外部ライブラリなどのプロジェクト固有の環境の変化に対応することができます。

まず、以下のページからビルドツールをダウンロードします。
Coverity Scan - Download the Coverity Scan Build Tool: C/C++


必要な言語のページから、適切なOSを選択します。
f:id:pit-ray:20210112180941j:plain

すると、826 MBのデカい圧縮ファイルがダウンロードできるので、解凍し、そのうちのbinディレクトリのパスを通します

次に、GitHubから自分のリポジトリを落とします。

$ git clone https://github.com/pit-ray/win-vind.git
$ cd win-vind

MinGW + CMakeの場合は、次のように解析グラフを生成します。

$ mkdir debug_s
$ cd debug_s
$ cmake -DCMAKE_BUILD_TYPE=Debug -G "MinGW Makefiles" -DCMAKE_SH="CMAKE_SH-NOTFOUND" ..
$ cov-build --dir cov-int cmake --build .

最後のcov-buildで、死ぬほど時間がかかりますが気長に待ちます。成功すれば、Compilation units (100%) are ready for analysysと表示され、cov-intディレクトリが生成されます。

このディレクトリをtarコマンドやzipコマンドで圧縮するか、Windowsの標準UIで圧縮します。
f:id:pit-ray:20210112182646j:plain

そうしたら、先ほどの Upload a Project Buiildページのファイル選択から圧縮したcov-int.zipを選択します。アップロードと解析にかなりの時間を必要とするはずなので、また待ちます。

解析が終わると、次のように解析結果を見ることができます。ライブラリも含んで41万行のバカでかいプロジェクトのように表示されています。

f:id:pit-ray:20210112183111j:plain

バッジを貼り付ける

ダッシュボードのProject Settingsを見ると、下部にバッジのHTMLがあるので、README.mdに貼り付けます。
f:id:pit-ray:20210112183554j:plain


以上で終わりです。参考になれば幸いです。