LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-09

はじめに

前日の記事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
これまでほかの手段で命名規則チェックを実施しようとする中で私は自PCにClangを入れていたため動いていたようです…。

設定方法

.clang-tidyファイルの作成

公式のドキュメントを見るに、どうやら「.clang-tidy」ファイルというものに独自の設定を書けば良いらしいです。
書けば良いとは言ってもどう書けば良いのか? その例はclang-tidy -dump-configを見ると良さそうです。
image.png
アプリの検索からDeveloper Command Prompt for VS 2022を探して上記を入力すると、以下のような表示が出ます。こういう感じで書けば良いようです。
image.png
そんな急に言われても困るのでこちらを参考にします。
この中の「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内に書いてくれている$ 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
ちなみに開いているのはMicrosoftのページで紹介されているサンプルプロジェクトCppDemoです。

clang-tidyの有効化

デフォルトでは有効になっていないため、プロジェクトのプロパティを開いて「コード分析(Code Analysis)」→「全般」→「Clang-Tidyの有効化」を「はい」にします。
image.png
次に、「Clang-Tidy」の項目を開いて有効化したいチェッカーを入力します。最初は空欄になっているので、右の方の▽から「編集」を選択して入力します。
今回は「clang-analyzer-*, readability-identifier-naming.*」としました。
image.png
「適用」「OK」を押します。

結果

適当にint型の変数を宣言して全体をリビルドします。
宣言するだけだと「宣言するだけで使用されていません」の警告が出て邪魔なので適当にif文書いています。
image.png
iTestには何か警告が出ていて、nTestには何も出ていないようです。
どういう警告が出ているのでしょうか。見てみると以下の内容が出ています、(エラー一覧ウィンドウにも同じ内容が出ています)
image.png
有効化した「readability-identifier-naming」の警告が出ています。ケーススタイルが良くない!ということで成功です。

おまけ:ほかのチェックもしたい

命名規則以外にどういうチェックができるのかはClang-Tidy Checksページがその一覧になっています。
Abseilシリーズ、バグが起こりやすそうシリーズ(bugprone)、パフォーマンスシリーズ等いろいろあるみたいです。
この辺のも使いたい時も命名規則の時と同様に

  • .clang-tidyファイルの先頭ChecksCheckOptionsに対象項目を追加
  • VisualStudioのプロパティに追加

の2点を実行すればOKです。
仮に「関数の定義が500行を超えていたらアウト」というルールを設定する場合は以下のように設定します。

Checks: readability-identifier-naming,readability-function-size
CheckOptions:
(略)
  - key:    readability-function-size.LineThreshold
    value:  500
(略)

image.png

おわりに

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

参考リンク

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0