C++
gsl

C++ Core Guidelines CheckerとGSLの導入

(An English version is available here.)

公開後の追記

この記事ではC++ Core Guidelines Checkerの導入をしていますが、このツールにはいくつか欠点があります。どうやらclang-tidyのほうが良さそうなので、そちらを導入したほうが良さそうです。(コメントにて、@tenmyo さんからclang-tidyについて教えて頂きました。)

C++ Core Guidelines Checkerの情報自体は、参考のために残しておきます。

はじめに

C++ Core Guidelines Checkerとは?

主にBjarne StroustrupとHerb Sutterによって、C++ Core Guidelinesという、より良いC++のコードを書くために従うべきガイドラインが整備されています。このガイドラインの多くの項目は、解析ツールによって検証可能になるように書かれています。

C++ Core Guidelines Checkerとは、C++ Core Guidelinesの項目を基にしたC++の静的解析ツールです。Microsoftによって開発されており、Visual Studio 2017であればデフォルトで使えます。(追記:このツール以外にも、clang-tidyでもできます。)このツールは、ビルドする際に、違反するコードについてError Listウィンドウにwarningを出力します。どのようなケースについてどのようなwarningを出力するかは、Visual Studio C++ Core Guidelines Checker Reference | Microsoft Docsに書かれています。

2018年5月現在、C++ Core Guidelines CheckerはWindows上のVisual Studioでのみ動作します。よって、この記事では導入方法やサンプルコードを用意していますが、その環境についてのみの話になります。

GSLとは?

GSL (Guidelines Support Library)とは、C++ Core Guidelinesにおいて使うべきと定められた型や関数が含まれるライブラリです。どのような型や関数があるかについては、次の記事が詳しいので参考にして下さい。

GSLには複数の実装がありますが、この記事ではMicrosoftによる実装(Microsoft/GSL)を扱います。

なお、GSLは複数のコンパイラをサポートしています。C++ Core Guidelines Checkerも独立したツールに切り出して、マルチプラットフォームで動作するようにしてほしいと思います・・・。

導入方法

C++ Core Guidelines Checkerを有効にする

Visual StudioのProject毎に、C++ Core Guidelines Checkerの設定をします。有効にする具体的な方法や、一部のwarningを無効にする設定などは、以下のページに書かれているので参考にして下さい。

GSLのコードをコピペ

Microsoft/GSLのREADMEにも書かれていますが、gslフォルダをコピペで持ってきます。ConanなどのPackage Managerには登録されてないんでしょうか・・・?

GSLのwrapperの作成

現状のC++ Core Guidelines Checkerは、自分が書いたコード以外にも、サードパーティ製ライブラリのコードに対してもwarningを出力します。(この挙動は問題になっており、Microsoftも対処しようとしているようです。)具体的には、GSLを使おうとすると、GSLのコードに対してwarningを出力します。これでは、検査して欲しい自分のコードに対するwarningが埋もれてしまいますので、GSLのコードを検査の対象外にするために、GSLのwrapperを作成し、それを通して使うようにします。

GSLのwrapperは、以下のコードになります。_MSC_VERでifdefしている理由は、CppCoreCheck/warnings.hがVisual Studio 2017インストール時に作成されるファイルであることと、#pragmaディレクティブでwarningをdisableする際の書き方がMSVC特有のものだからです。

gsl_wrapper.h
#ifdef _MSC_VER
#if _MSC_VER >= 1910
#include <CppCoreCheck/warnings.h>
#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)
#endif // _MSC_VER >= 1910
#endif // _MSC_VER


#include <gsl/gsl>


#ifdef _MSC_VER
#if _MSC_VER >= 1910
#pragma warning(default: ALL_CPPCORECHECK_WARNINGS)
#endif // _MSC_VER >= 1910
#endif // _MSC_VER

サンプルコード

以上の導入方法をとると、次のGitHub repositoryのような構成になるはずです。
https://github.com/TomoyukiAota/CoreCheckerAndGsl

おわりに

以上、C++ Core Guidelines CheckerとGSLの導入方法についてまとめました。C++ Core Guidelines CheckerについてはサポートしているプラットフォームがWindows上のVisual Studioのみ、GSLについてはgslフォルダのコピペといったスマートでないところがあり、まだまだ両者とも発展途上な感が否めません。しかし、C++ Core Guidelines Checkerが出力してくれるwarningや、GSLが提供する型や関数については、より良いC++のコードを書く上で一考の価値がありますので、より良いツール/ライブラリとして発展することを望みます。