clang-tidy
1. 什么是clang-tidy
Clang-Tidy是一個(gè)由LLVM項(xiàng)目提供的開源工具,是一個(gè)靜態(tài)分析工具,用于進(jìn)行靜態(tài)代碼分析和代碼質(zhì)量改進(jìn)。它利用Clang編譯器的強(qiáng)大功能,對(duì)C++代碼進(jìn)行靜態(tài)分析,并提供了一系列的代碼改進(jìn)建議和警告。Clang-Tidy是基于Clang的AST(抽象語法樹)進(jìn)行分析,并能檢測(cè)出許多常見的編碼錯(cuò)誤和代碼風(fēng)格問題。包括語法錯(cuò)誤、邏輯錯(cuò)誤、性能問題和風(fēng)格問題。
2. clang-tidy可以解決什么問題
clang-tidy可以解決各種類型的代碼問題,包括:
- 代碼風(fēng)格問題:例如縮進(jìn)、空格、命名規(guī)范等。
- 可維護(hù)性問題:例如不必要的拷貝、錯(cuò)誤的類型轉(zhuǎn)換等。
- 潛在的編程錯(cuò)誤:例如空指針引用、數(shù)組越界等。
- 性能問題:例如慢速算法、重復(fù)計(jì)算等。
clang-tidy可以幫助開發(fā)人員在編譯時(shí)發(fā)現(xiàn)代碼中的錯(cuò)誤,這可以幫助開發(fā)人員提高代碼質(zhì)量和可靠性。clang-tidy還可以幫助開發(fā)人員提高代碼風(fēng)格,這可以使代碼更易于閱讀和維護(hù)。
3. 工作原理
Clang-tidy的工作原理是將源代碼傳遞給Clang編譯器,然后通過靜態(tài)分析找到代碼中的問題。Clang編譯器是一個(gè)基于LLVM的項(xiàng)目,它提供了了一個(gè)強(qiáng)大的C++前端,能夠解析、編譯和優(yōu)化C++代碼。而Clang-tidy則利用了Clang編譯器的這些功能,對(duì)源代碼進(jìn)行深度分析,并找出其中可能存在的問題。
具體來說,Clang-tidy使用了以下技術(shù):
- 靜態(tài)分析:Clang-tidy使用靜態(tài)分析技術(shù)對(duì)源代碼進(jìn)行解析,從而構(gòu)建出抽象語法樹(Abstract Syntax Tree,AST)。通過AST,Clang-tidy能夠深入理解代碼的邏輯,找出其中可能存在的問題。
- 規(guī)則引擎:Clang-tidy還使用了一套規(guī)則引擎,用來檢查代碼是否符合特定的規(guī)則。這些規(guī)則可以是檢查潛在的錯(cuò)誤、風(fēng)格問題或性能優(yōu)化點(diǎn)等。
- 修復(fù)建議:對(duì)于發(fā)現(xiàn)的問題,Clang-tidy能夠提供一些修復(fù)建議。例如,對(duì)于一個(gè)未初始化的變量,Clang-tidy可以建議將其初始化為零。
4. 如何使用clang-tidy
如何在mac上安裝c lang-tidy
我是直接使用brew install llvm
后,將工具直接軟連接到系統(tǒng)路徑下,因?yàn)閙ac本身自帶clang編譯器,如果將llvm放入系統(tǒng)路徑,會(huì)對(duì)mac自身的環(huán)境造成影響。
# 安裝指令:
brew install llvm
ln -s "/usr/local/opt/llvm/bin/clang-format" "/usr/local/bin/clang-format"
ln -s "/usr/local/opt/llvm/bin/clang-tidy" "/usr/local/bin/clang-tidy"
# 檢查安裝情況
(base) ? bin clang-format --version
clang-format version 16.0.6
(base) ? bin clang-tidy --version
Homebrew LLVM version 16.0.6
Optimized build.
find_program(CLANG_TIDY_BIN clang-tidy)
find_program(RUN_CLANG_TIDY_BIN /usr/local/Cellar/llvm/10.0.0_3/share/clang/run-clang-tidy.py)
list(APPEND RUN_CLANG_TIDY_BIN_ARGS
-clang-tidy-binary ${CLANG_TIDY_BIN}
-header-filter="\".*\\b(cpp-client/src)\""
-checks=clan*,cert*,misc*,perf*,cppc*,read*,mode*,-cert-err58-cpp,-misc-noexcept-move-constructor,-cppcoreguidelines-*)
add_custom_target(tidy
COMMAND ${RUN_CLANG_TIDY_BIN} ${RUN_CLANG_TIDY_BIN_ARGS}
COMMENT "running clang tidy")
主要有二種使用方式:
-
使用命令行
可以直接使用命令行:
clang-tidy -checks=all -p my_project my_file.cpp
但是一般會(huì)配合githook同步使用, 在用戶add或者commit的時(shí)候,觸發(fā)githook,觸發(fā)腳本,從而掃描用戶修改的文件,達(dá)到代碼靜態(tài)掃描的目的。
-
使用cmake
推薦參考項(xiàng)目: github-cmake-cpp-project-template
# 該命令會(huì)生成
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
find_program(CLANG_TIDY_BIN NAMES "clang-tidy")
if(CLANG_TIDY_BIN)
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_BIN}" "-checks=*")
endif()
- 使用腳本
clang-tidy官方腳本
4. 總結(jié)
Clang-tidy是一種強(qiáng)大的源代碼自動(dòng)檢查與修復(fù)工具,它能夠幫助開發(fā)人員發(fā)現(xiàn)并修復(fù)代碼中的各種問題。通過使用Clang-tidy,我們可以提高開發(fā)效率,確保代碼的質(zhì)量和可維護(hù)性。在未來,我們期待看到Clang-tidy在更多領(lǐng)域的應(yīng)用,以及其進(jìn)一步的改進(jìn)和優(yōu)化。
5. 舉例說明:
在沒有任何特定命令行參數(shù)的情況下運(yùn)行該工具將運(yùn)行該實(shí)用程序啟用的默認(rèn)檢查器集。讓我們檢查一下它還提供了哪些其他檢查器(通過傳遞–checks='*'來查看所有檢查器),特別是 grep 查找名稱中帶有現(xiàn)代化的檢查器。這些檢查器提倡使用現(xiàn)代語言結(jié)構(gòu):
$ clang-tidy --list-checks -checks='*' | grep "modernize"
modernize-avoid-bind
modernize-deprecated-headers
modernize-loop-convert
modernize-make-shared
modernize-make-unique
modernize-pass-by-value
modernize-raw-string-literal
modernize-redundant-void-arg
modernize-replace-auto-ptr
modernize-shrink-to-fit
modernize-use-auto
modernize-use-bool-literals
modernize-use-default
modernize-use-emplace
modernize-use-nullptr
modernize-use-override
modernize-use-using
選項(xiàng)列表已經(jīng)令人印象深刻,不是嗎?Clang-Tidy 確實(shí)開箱即用地提供了一些有趣的檢查器(從 Clang/LLVM 3.9 開始),并且列表隨著版本的不同而不斷增長(zhǎng)。
檢查器的名稱幾乎是不言自明的(例如,modernize-use-auto將在適用的情況下使用auto),但如果您想探索每個(gè)檢查器的含義,請(qǐng)查閱clang-tidy 主頁(yè)上的檢查器列表:
為了展示該工具的使用方式,讓我們重點(diǎn)關(guān)注現(xiàn)代化使用覆蓋檢查器,因?yàn)樗亲钸m用且最無爭(zhēng)議的檢查器。
% clang-tidy-3.9 -checks='modernize-use-override' test.cpp -- -std=c++11
1 warning generated.
/home/kfunk/test.cpp:5:18: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]
virtual void reimplementMe(int a) {}
^
override
好吧。所以它注意到Derived::reimplementMe(int)
重寫了基類方法但缺少override
說明符!現(xiàn)在我們可以手動(dòng)添加…或者只是讓該工具通過傳遞*-fix來為我們完成它!在示例上運(yùn)行它(啟用現(xiàn)代化使用覆蓋*檢查器和修復(fù)功能):
有幾件事值得一提:
- 并非所有clang-tidy 的檢查器實(shí)際上都帶有修復(fù)功能,但以現(xiàn)代化開頭的檢查器都帶有修復(fù)功能。
- 您可以同時(shí)使用多個(gè)檢查器中的修復(fù)程序(考慮*-checks=‘modernize-use-override,modernize-use-auto’ -fix)*
- 運(yùn)行 clang-tidy 會(huì)調(diào)用完整的 Clang 編譯器前端,因此需要一些時(shí)間才能完成
- clang-tidy 的重構(gòu)結(jié)果非常準(zhǔn)確,因?yàn)樗玫搅顺墒斓?C++ 解析器的支持
注意:強(qiáng)烈建議使用run-clang-tidy.py在整個(gè)項(xiàng)目上運(yùn)行 clang-tidy,因?yàn)樗鼘⒉⑿羞\(yùn)行該工具多次并確保并發(fā)執(zhí)行不會(huì)相互干擾(例如通過避免并行修改共享標(biāo)頭并進(jìn)而生成損壞的代碼)。文章來源:http://www.zghlxwxcb.cn/news/detail-617274.html
- 參考:
clang-tidy 官網(wǎng)文章來源地址http://www.zghlxwxcb.cn/news/detail-617274.html
到了這里,關(guān)于c++靜態(tài)代碼掃描工具clang-tidy詳細(xì)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!