clang-tidy
.clang-tidy は、clang-tidy の静的解析ルールやコーディング規約をプロジェクト単位で管理する設定ファイルです。YAML形式で記述し、コード品質の維持やチーム内のコーディングルール統一に利用されます。
主な役割
- バグの検出
- パフォーマンス改善提案
- Modern C++ への移行支援
- コーディング規約の統一
- CI/CDでの品質ゲート
1. Checks
概要
有効化するチェックルールを指定します。
Checks: >
-*,
bugprone-*,
modernize-*,
performance-*
意味:
- すべてのチェックを無効化
bugprone-*modernize-*performance-*
を有効化
例
Checks: >
-*,
clang-analyzer-*,
bugprone-*
- ✅ 静的解析
- ✅ バグ検出
- ❌ 命名規則チェック
- ❌ Modern C++ チェック
- ❌ パフォーマンスチェック
Checks: >
-*,
readability-*
コードスタイルのみをチェックします。
if(a==b){
}
↓
if (a == b)
{
}
カテゴリ
| カテゴリ | 内容 |
|---|---|
bugprone-* |
バグ検出 |
modernize-* |
C++11/14/17への移行支援 |
performance-* |
パフォーマンス改善 |
readability-* |
可読性向上 |
cppcoreguidelines-* |
C++ Core Guidelines |
portability-* |
移植性チェック |
clang-analyzer-* |
LLVM静的解析 |
cert-* |
CERTセキュリティ規約 |
misc-* |
その他 |
2. WarningsAsErrors
警告をエラーとして扱います。
WarningsAsErrors: >
bugprone-*,
performance-*
例:
warning:
↓
error:
CI/CD(Azure DevOps、GitHub Actionsなど)でビルド失敗にできます。
3. HeaderFilterRegex
解析対象のヘッダーファイルを制限します。
HeaderFilterRegex: "src/.*"
例:
src/a.h → 解析対象
ThirdParty/*.h → 対象外
通常はサードパーティライブラリを除外するために使用します。
HeaderFilterRegex: "MyProject.*"
4. AnalyzeTemporaryDtors
一時オブジェクトのデストラクタを解析するかを指定します。
AnalyzeTemporaryDtors: true
例:
Foo().Close();
リソース解放処理などを含むデストラクタまで解析します。
通常の大規模プロジェクトではデフォルトの false で十分です。
5. FormatStyle
自動修正時のフォーマット方式を指定します。
FormatStyle: none
フォーマットを変更しません。
FormatStyle: file
.clang-format を参照して整形します。
例:
if(a){
}
↓
if (a)
{
}
主な値:
nonefilellvmgooglemozillachromium
企業開発では file が一般的です。
6. User
ユーザー名を指定します。
User: AA
自動生成コメントなどに使用されます。
例:
Generated by AA
通常はあまり使用しません。
7. UseColor
コンソール出力の色付けを制御します。
UseColor: true
- 赤:エラー
- 黄:警告
- 緑:情報
CI環境では無効化することが多いです。
8. CheckOptions
各チェックルールの動作を細かく設定します。
代表例は readability-identifier-naming です。
クラス名
CheckOptions:
- key: readability-identifier-naming.ClassCase
value: CamelCase
class myclass {};
//変更後
class MyClass {};
関数名
FunctionCase: camelBack
void TEST();
//変更後
void test();
変数名
VariableCase: lower_case
int TestValue;
//変更後
int test_value;
プライベートメンバー接頭辞
PrivateMemberPrefix: m_
int value;
//変更後
int m_value;
プライベートメンバー接尾辞(Google Style)
PrivateMemberSuffix: _
int value_;
9. HeaderFileExtensions
ヘッダーファイルとして扱う拡張子を指定します。
HeaderFileExtensions:
- h
- hpp
例:
.h
.hpp
をヘッダーとして認識。
10. ImplementationFileExtensions
ソースファイルとして扱う拡張子を指定します。
例:
ImplementationFileExtensions:
- cpp
- cc
- cxx
11. InheritParentConfig
親ディレクトリの設定を継承します。
InheritParentConfig: true
例:
Project/
└─ .clang-tidy
src/
└─ .clang-tidy
src の設定が親の .clang-tidy を継承します。
大規模プロジェクトでよく利用されます。
12. CustomChecks(LLVM 18以降)
独自ルールを定義できます。
例:
- メンバー変数は必ず
m_で始める - 独自コーディング規約を強制する
高度な利用方法です。
CheckOptions
| 設定項目 | 用途 |
|---|---|
ClassCase |
クラス名 |
FunctionCase |
関数名 |
VariableCase |
変数名 |
PrivateMemberPrefix |
メンバー接頭辞 |
PrivateMemberSuffix |
メンバー接尾辞 |
NamespaceCase |
名前空間 |
MacroDefinitionCase |
マクロ名 |
EnumConstantCase |
列挙値 |
GlobalConstantPrefix |
グローバル定数接頭辞 |