文章目錄
- 基本介紹
- 安裝`clang-tidy`
- 使用`clang-tidy`
- 配置文件和格式文件
- 配置文件
- 格式文件
- 使用配置文件和格式化文件
- 在代碼中設置排除`clang-tidy`檢測
- reference
歡迎訪問個人網絡日志🌹🌹知行空間🌹🌹
基本介紹
clang-tidy
是一個基于 clang 的 C++ “linter” 工具。其作用主要是用來檢查和修正代碼中的典型編程問題,像代碼風格/接口誤用/通過靜態分析可定位到的bug
。clang-tidy
模塊化功能做的很好,有預留接口,非常便于實現新的代碼檢查功能。
安裝clang-tidy
直接編譯安裝LLVM
工程,包含子工程構建,編譯安裝的bin
路徑下有clang-tidy
工具。
LLVM編譯安裝的詳細步驟可以參考這里
使用clang-tidy
clang-tidy
是一個基于 LibTooling
的工具,如果您為項目設置編譯命令數據庫,則使用起來會更容易(有關如何執行此操作的示例,請參閱如何為 LLVM
設置工具)。源碼對應的編譯命令數據庫保存在compile-command.json
文件中,這個文件中其實保存的是每個可執行文件的構建命令,現在很多工具可以自動生成這個文件,例如對于使用CMake
管理的工程,只需要在編譯的時候帶上參數cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
即可在build
目錄下生成compile-command.json
文件,在執行.clang-tidy
命令時設置-p={project}/build
即可。
可以在命令行添加--
符號,以不使用編譯命令而時使用編譯選項來定制檢測規則,用來實現單個文件的格式檢測:
clang-tidy test.cpp -- -Imy_project/include -DMY_DEFINES ...
-I
參數指定要包含的頭文件路徑
clang-tidy
有其自己的檢測器,也可以使用Clang
的靜態分析器,每一項檢測都有其自己的名字,使用-checks
參數可以指定要進行哪些檢測,它指定了逗號分隔的正向和反向規則,正向規則指定了要添加的檢測子集,反向規則指定了要移除的規則。示例:
clang-tidy -checks='-*,modernize-*' test.cpp --
-checks
指定要進行哪些檢測,-*
表示移除所有檢測,modernize-*
表示保留modernize
開頭的所有檢測。-checks
支持的參數有:
checks 名稱前綴 | 說明 |
---|---|
abseil- | Google Abseil 相關的檢測 |
altera- | 針對FPGA 的OpenCL 相關的檢測 |
android- | Android 相關檢測 |
boost- | Boost 庫相關檢測 |
clang-analyzer- | Clang Static Analyzer 檢測 |
更多檢測名稱前綴參考:
1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy
配置文件和格式文件
配置文件
clang-tidy
提供了一個配置文件,可以指定要使用的檢測器、檢測器的參數等。配置文件使用YAML
語法編寫,一般放在當前工程目錄下,文件名為.clang-tidy
。
# 指定要使用的檢測器
Checks: '-*,modernize-*,performance-*'# 指定檢測器的參數
CheckOptions:- key: 'modernize-use-nullptr.NullPtrBeforeZero'value: '0'
格式文件
clang-tidy
命令的--format-style=
參數,需要.clang-format
文件作為參數來設置修復格式化代碼的樣式。
--format-style=
可選的值有:
- ‘none’,默認值,關閉格式化
- ‘file’,設置此值
clang-tidy
會使用最近父目錄下的.clang-format
文件來設置格式化的樣式 - '{ }'指定格式化選項,例如:
-format-style='{BasedOnStyle: llvm, IndentWidth: 8}'
- ‘llvm’, ‘google’, ‘webkit’, ‘mozilla’
一個簡單的.clang-format
文件的內容:
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false
AlignOperands: true
使用配置文件和格式化文件
對于單個文件,通過命令行可以直接來運行:
clang-tidy -format-style='file' -config-file=.clang-tidy -p ../build/debug test_clang.cpp
對于工程中有很多文件,寫成shell
腳本的形式為:
#!/bin/bashfunction main() {local project_dirproject_dir=$(git rev-parse --show-toplevel)cd "$project_dir" || exit 1local srcssrcs=$(git ls-files src crossdock |grep -E -v 'thrift-gen|Test\.cpp' |grep -E '\.cpp$')local cmdfor src in $srcs; docmd="clang-tidy -p=build"cmd+=" -checks=\"-clang-diagnostic-unused-command-line-argument\" "cmd+=" $src"echo "$cmd"eval "$cmd"done
}main
在代碼中設置排除clang-tidy
檢測
對于工程中的代碼,有時候可以確認代碼是正常的,但是不滿足clang-tidy
的規則,這個時候需要增加設置使目標代碼免除檢測。
通用抑制檢測的機制:
- 對于一行,使用
NOLINT
注釋:
int main(int argc, char** argv) // NOLINT
{return 0;
}
- 下一行免除檢測
// NOLINTNEXTLINEint main(int argc, char** argv)
{return 0;
}
- 設置一段代碼免除檢測
int main(int argc, char** argv)
{// NOLINTBEGINint x;int y;// NOLINTENDreturn 0;
}
上面的NOLINT
注釋后可以接參數,設置具體要避免哪些規則的檢測:
int main(int argc, char** argv)
{// NOLINTBEGIN(google*)int x;int y;int array[10]; // NOLINT(*-avoid-c-arrays)// NOLINTEND(google*)return 0;
}
reference
1.https://clang.llvm.org/extra/clang-tidy/index.html#using-clang-tidy