VisualStudioのclang-tidyで命名規則チェックの実行

# はじめに
前日の記事[Clang（python）で命名規則チェック](https://qiita.com/fallaf/items/9cfd3c5c282919308267 "Clang（python）で命名規則チェック")で書いた内容について、@SaitoAtsushiさんからclang-tidyでも独自定義の命名規則チェックができるという情報をいただきました。
やり方調べてそれっぽく動くようになったのでやり方をメモします。

# 環境
OS：Windows10
Visual Studio 2022 Professional: 17.4.2
※VisualStudioでの開発を行うため、備え付けのclang-tidyを使います。2019 ver16.4 以降なら入っているそうです。
## 12/13追記：必要があればClangのインストール
下記の`clang-tidy -dump-config`コマンドが動かなかった場合はVisual Studio Installerから「**Windows用C++Clangツール**」をインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/cb320f63-b00a-eed3-cfb0-89a6bc73cc1c.png)
これまでほかの手段で命名規則チェックを実施しようとする中で私は自PCにClangを入れていたため動いていたようです…。

# 設定方法
## .clang-tidyファイルの作成
[公式のドキュメント](https://clang.llvm.org/extra/clang-tidy/ "Extra Clang Tools 16.0.0git documentation")を見るに、どうやら「.clang-tidy」ファイルというものに独自の設定を書けば良いらしいです。
書けば良いとは言ってもどう書けば良いのか？　その例は`clang-tidy -dump-config`を見ると良さそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/fac46594-9ce7-8d37-05e1-8e1e7657cb4a.png)
アプリの検索から**Developer Command Prompt for VS 2022**を探して上記を入力すると、以下のような表示が出ます。こういう感じで書けば良いようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/e2d263f3-d06b-9121-4d8e-aa749088437d.png)
そんな急に言われても困るので[こちら](https://reviews.llvm.org/D107325)を参考にします。
この中の「Checks: readability-identifier-naming」で始まるファイルを真似すれば良さそうです。
一旦全部コピペしてきてテキストファイルで保存します。
「int」のところを「n」にして試してみます。
int型の変数が「n」で始まっていればOK、そうでなければNGというルールにします。
```
Checks: readability-identifier-naming
CheckOptions:
（略）
- key:    readability-identifier-naming.HungarianNotation.PrimitiveType.int
  value:  n
（略）
```
- Checks：どのオプション（CheckOptions）を実行するか。readability-identifier-* みたいな書き方も可能っぽい
- CheckOptions：keyとvalueを列挙していく

## .clang-tidyファイルの配置
作ったはいいけどどこに置けばいいのか？は[Using clang-tidy](https://clang.llvm.org/extra/clang-tidy/#id2 "Using clang-tidy")内に書いてくれている`$ clang-tidy --help`による出力結果を見てみます。
下の方に以下の内容が書いています。

>  clang-tidy attempts to read configuration for each source file from a
>  .clang-tidy file located in the closest parent directory of the source
>  file. If InheritParentConfig is true in a config file, the configuration file
>  in the parent directory (if any exists) will be taken and current config file
>  will be applied on top of the parent one.

DeepL翻訳によると
> ソースファイルの最も近い親ディレクトリにある .clang-tidy ファイル。もし設定ファイルのInheritParentConfigがtrueなら、親ディレクトリの設定ファイル（もし存在するなら）が取られ、現在の設定ファイルは親ファイルの上に適用されます。

とのことなので、やや信じがたいですが、対象となるソースの近く（slnのところとか）においておけばそれだけでよしなにやってくれるようです。試しに以下の場所に置いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/d721f6a7-d754-b057-3120-5123befe0840.png)
ちなみに開いているのはMicrosoftのページで紹介されているサンプルプロジェクト[CppDemo](https://learn.microsoft.com/ja-jp/cpp/code-quality/demo-sample?view=msvc-170)です。

# clang-tidyの有効化
デフォルトでは有効になっていないため、プロジェクトのプロパティを開いて「コード分析（Code Analysis）」→「全般」→「Clang-Tidyの有効化」を「はい」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/3daeb26c-3ac3-8964-96f6-cc6268f31912.png)
次に、「Clang-Tidy」の項目を開いて有効化したいチェッカーを入力します。最初は空欄になっているので、右の方の▽から「編集」を選択して入力します。
今回は「**clang-analyzer-\*, readability-identifier-naming.\***」としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/923c0d19-fe00-9e8a-9f71-9f4e6249c3ab.png)
「適用」「OK」を押します。

# 結果
適当にint型の変数を宣言して全体をリビルドします。
宣言するだけだと「宣言するだけで使用されていません」の警告が出て邪魔なので適当にif文書いています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/7277c313-f2a4-ca0b-d31d-60faaf33c0a7.png)
`iTest`には何か警告が出ていて、`nTest`には何も出ていないようです。
どういう警告が出ているのでしょうか。見てみると以下の内容が出ています、（エラー一覧ウィンドウにも同じ内容が出ています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/a85b7eb6-8daa-3544-de10-f95964d8b115.png)
有効化した「**readability-identifier-naming**」の警告が出ています。ケーススタイルが良くない！ということで成功です。

# おまけ：ほかのチェックもしたい
命名規則以外にどういうチェックができるのかは[Clang-Tidy Checks](https://clang.llvm.org/extra/clang-tidy/checks/list.html "Clang-Tidy Checks")ページがその一覧になっています。
[Abseil](https://abseil.io/about/ "Abseil")シリーズ、バグが起こりやすそうシリーズ（bugprone）、パフォーマンスシリーズ等いろいろあるみたいです。
この辺のも使いたい時も命名規則の時と同様に
- `.clang-tidy`ファイルの先頭`Checks`と`CheckOptions`に対象項目を追加
- VisualStudioのプロパティに追加

の2点を実行すればOKです。
仮に「関数の定義が500行を超えていたらアウト」というルールを設定する場合は以下のように設定します。
```
Checks: readability-identifier-naming,readability-function-size
CheckOptions:
（略）
  - key:    readability-function-size.LineThreshold
    value:  500
（略）
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343311/b9d5763e-eda1-097b-0593-e27bc8e89abd.png)


# おわりに
日本語の情報が少なくて難儀しましたが何とか動いてよかったです。
もう少し複雑な宣言だとちょっと設定が難しいのかな？といった印象ですが、簡単な定義であればVisualStudio上で警告も出してくれるので安心です。
設定で動かない、間違っている等あればコメントいただけるとありがたいです。

# 参考リンク
公式のドキュメント：https://clang.llvm.org/extra/clang-tidy/
公式の人たちの議論：https://reviews.llvm.org/D107325