原文連接:https://hokein.github.io/clan...python
clang-tidy是一個基於clang的靜態代碼分析框架,支持C++/C/Objective-C。git
它是一個功能更強大的lint工具。絕大部分lint工具只能在出現問題的代碼地方給出提示,以後須要人爲修改,而clang-tidy則可以自動修復功能(固然這個如何修復須要該check做者提供);而且clang-tidy採用模塊化設計,很是容易擴展。若是用戶想往clang-tidy添加一個新的檢測功能,只須要編寫一個clang-tidy check實現(如何編寫一個clang-tidy check之後將會有一章詳細介紹),每個check檢測一種問題,例如檢測某個違反Code style的模式,檢測某些API不正確使用的方法等等。github
clang-tidy check能夠檢測各式各樣的問題:正則表達式
檢測違反代碼規範的代碼模式(header guard不知足,include頭文件順序錯誤);npm
找出不容易在編譯時發現的代碼錯誤(把int賦值給std::string, 變量定義在頭文件);json
把deprecated的API替換成新的API,modernize模塊典型例子,把C++03的代碼自動轉換成C++11的代碼(for-range-loop, auto, nullptr, overriede, default);bash
Google code style提供了cpplint腳本,用於檢測代碼中違反code style的地方。clang-tidy也支持檢測代碼中違反Google code style的地方(google-*
check), 它們之間有什麼區別?cpplint是一個python的腳本,它是採用正則表達式匹配出違反code style的代碼, 因此它能檢測的功能會受限於正則表達式,它不可以檢測全部的違反code style的地方,而且還會有False positive和True positive;而clang-tidy則是基於抽象語法樹(AST)對源文件進行分析,相比之下,是在分析的結果更加準確,能檢測的問題也更多。框架
這二者各有優缺點,clang-tidy須要對源代碼進行語法分析(編譯源文件),因此它須要知道源文件的編譯命令,對於依賴較多較大的文件,花費時間會較長;cpplint則不須要源文件編譯,對文件內容進行正則匹配,運行會更快。ide
clang-tidy每次只針對一個編譯單元(TranslationUnit, 可簡單理解成1個.cpp
文件)進行靜態分析,所以,它只能查找出一個編譯單元裏面的代碼問題,對於那種只在跨編譯單元出現的問題,就無能爲力了。模塊化
如今clang-tidy實現有100+個check,請查看list列表。根據check不一樣種類(從check名字的前綴就能知道哪一類),分爲以下幾大類:
boost 檢測boost庫API使用問題
cert 檢測CERT的代碼規範
cpp-core-guidelines 檢測是否違反cpp-core-guidelines
google 檢測是否違反google code style
llvm 檢測是否違反llvm code style
readability 檢測代碼上相關問題,但又不明確屬於任何代碼規範的
misc 其它一些零碎的check
mpi 檢測MPI API問題
modernize 把C++03代碼轉換成C++11代碼,使用C++11新特性
performance 檢測performance相關問題
clang-tidy是一個命令行工具,能夠在官網下載編譯好的二進制包。
我寫了一個clang-tools-prebuilt的npm包,能夠經過npm install clang-tools-prebuilt
的命令下載(僅支持MacOS, Linux)。
// 列出全部的check $ clang-tidy -list-checks // 找出simple.cc中全部沒有用到的using declarations. 後面的`--`表示這個文件不在compilation database裏面,能夠直接單獨編譯; $ clang-tidy -checks="-*,misc-unused-using-decls" path/to/simple.cc -- // 找出simple.cc中全部沒有用到的using declarations並自動fix(刪除掉) $ clang-tidy -checks="-*,misc-unused-using-decls" -fix path/to/simple.cc -- // 找出a.c中沒有用到的using declarations. 這裏須要path/to/project/compile_commands.json存在 $ clang-tidy -checks="-*,misc-unused-using-decls" path/to/project/a.cc
分析項目中的y編譯單元,clang-tidy首先要知道如何編譯單元(該編譯單元的編譯命令),它從目錄下查找compliation database,這個database就是compile_commands.json
文件,裏面包含該項目中全部的編譯單元的編譯命令。在使用以前要導出這個文件。目前已經有工具幫咱們作了這項工做。
若是是cmake的項目,經過cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON path/to/llvm/sources
命令導出;
若是是GYP項目,經過ninja -C out/D -t compdb cc cxx objc objcxx > compile_commands.json
;
若是是make項目,使用Bear工具;
一次命令只能分析一個文件太麻煩,要分析整個項目的全部文件?run_clang_tidy.py腳本正是你想要的,經過多進程的方法對整個項目文件進行分析。