2022-10-21

使用clangtidy進(jìn)行自定義checkers實(shí)現(xiàn)告警提醒和自動(dòng)fix功能

Clang-Tidy和Clang Static Analyzer

- Clang-Tidy的底層邏輯主要是通過文本和抽象語法樹匹配享钞,通過AST Matchers來替換、增加或刪除模式妨猩。

-?Clang Static Analyzerd的底層邏輯也是利用語法樹,可以更進(jìn)一步通過符號(hào)執(zhí)行赖晶,通過模擬程序執(zhí)行流程發(fā)現(xiàn)bug

- Clang-Tidy介紹(屬于Clang)

基于Clang的C++Linting工具框架

? 完全訪問AST和預(yù)處理器

??Clang-Tidy是可擴(kuò)展的–可以進(jìn)行自定義check

? 現(xiàn)有200多個(gè)check

? 可讀性中贝、效率、正確性评抚、現(xiàn)代化

? 高度可配置

? 可以在許多地方自動(dòng)修復(fù)代碼

示例說明:

#define ZERO 0

int function(int b)

int a c;

switch(b){

case 1: a=b/0; break; // AST可以識(shí)別

case 2: a= b/ZERO;break; // AST可以識(shí)別

case 4: c=b-4;a=b/c;break;// AST可以無法識(shí)別镀首,需要Symbolic Execution

};

return a;

clang-tidy check的使用

Dump AST : clang –cc1 –ast-dump init.cpp

? clang-tidy? -list-checks? ? ? ? ? ? //查看clang-dity生效的checks

? clang-tidy -list-checks -checks=*?? //查看clang-dity可用的checks

? clang-tidy --checks=-*,cppcoreguidelines-init-variables init.cpp --


? clang-tidy --checks=-*,cppcoreguidelines-init-variables init.cpp --fix --


clang-query的使用

通過clang-quey可以快速驗(yàn)證matcher的效果

matchers wiki: https://clang.llvm.org/docs/LibASTMatchersReference.html

? clang-query memory.c --? ? ?//查詢AST節(jié)點(diǎn)

? m functionDecl(isExpansionInMainFile())? ?//查詢main文件內(nèi)展開的函數(shù)節(jié)點(diǎn)

??m varDecl(isExpansionInMainFile())? ? //查詢main文件內(nèi)展開的變量節(jié)點(diǎn)

??set output detailed-ast? //設(shè)置輸出格式為詳細(xì)ast

再次搜索輸出變?yōu)閍st格式

? m functionDecl(isExpansionInMainFile(),hasName("foo"))? ?//查詢main文件內(nèi)展開的并包含函數(shù)名為foo的函數(shù)節(jié)點(diǎn)

可以通過多重條件精確匹配到合適的節(jié)點(diǎn)

??m functionDecl(isExpansionInMainFile(),matchesName("f"))? ?//查詢main文件內(nèi)展開的并函數(shù)名以字符"f"開頭的函數(shù)節(jié)點(diǎn)

? m callExpr(callee(functionDecl(hasName("malloc")))) //查找函數(shù)名為malloc的函數(shù)調(diào)用

實(shí)現(xiàn)一個(gè)可以檢查malloc(free)和修改malloc(free)的check

? cd to/clang-tools-extra/clang-tidy

? ./add_new_check.py misc change-malloc (添加check)

? Rebuild …

? clang-tidy --list-checks –checks=* | grep change?–查看是否新增成功

? 修改自定義的check實(shí)現(xiàn)檢查malloc的代碼邏輯

通過函數(shù)名字坟漱,找到需要對(duì)應(yīng)的函數(shù)調(diào)用節(jié)點(diǎn),代碼如下:

+

通過重載ChangeMallocCheck函數(shù)過濾出來的提示節(jié)點(diǎn)更哄,和自動(dòng)fix目標(biāo)代碼


? clang-tidy --checks=-*,misc-change-malloc malloc.c --

將malloc和free函數(shù)的告警信息并打印出來


? clang-tidy --checks=-*,misc-change-malloc malloc.c --fix --

將malloc和free函數(shù)的告警修復(fù)信息打印出來芋齿,


并自動(dòng)修復(fù)該告警



新增一個(gè)clangtidy check自定義類別

1.clang-tools-extra/clang-tidy/ClangTidyForceLinker.h

修改ClangTidyForceLinker.h腥寇,增加learn模塊鏈接

2.clang-tools-extra/clang-tidy/CMakeLiest.txt

修改CMakelist,添加learn模塊到編譯腳本

3.創(chuàng)建learn相關(guān)文件夾

創(chuàng)建learn模塊的文檔 觅捆、check赦役、test文件夾,否則會(huì)報(bào)錯(cuò)惠拭。

cd?~/llv/cl/llvm-project/clang-tools-extra/

mkdir -p checkers/learn? ??

mkdir -p ../test/clang-tidy/checkers/learn

mkdir -p ../docs/clang-tidy/checks/learn

4.創(chuàng)建clang-tools-extra/clang-tidy/learn/CMakeLists.txt文件(可以從MPI模塊拷貝一份扩劝,然后修改刪減)

修改learn模塊的編譯配置,mpi? --> learn

4.創(chuàng)建clang-tools-extra/clang-tidy/learn/LearnTidyModule.cpp文件(可以從MPI模塊拷貝一份职辅,然后修改刪減)

修改learn模塊總接口文件LearnTidyModule.cpp,負(fù)責(zé)管理本模塊的checks聂示,mpi? --> learn

5. 新增checker 類別成功

.

6. 測(cè)試新增checker功能

刪除一個(gè)類別

新增類別的逆向操作域携,刪除所做修改即可,此處不再實(shí)測(cè)鱼喉。

參考網(wǎng)站:

Clang AST簡介 - https://clang.llvm.org/docs/IntroductionToTheClangAST.html

? 匹配Clang AST - https://clang.llvm.org/docs/LibASTMatchers.html

? AST Matcher 參考 - https://clang.llvm.org/docs/LibASTMatchersReference.html

? Stephen Kelly’s 博客 - https://devblogs.microsoft.com/cppblog/author/stkellyms/,

https://steveire.wordpress.com/

? llvm 教學(xué)視頻 - https://github.com/vabridgers/LLVM-Virtual-Tutorial-2020.git

? 編譯數(shù)據(jù)庫參考 compile_commands.json - https://sarcasm.github.io/notes/dev/compilationdatabase.html

? 已實(shí)現(xiàn)的clang-tidy checks 列表 https://clang.llvm.org/extra/clangtidy/checks/list.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秀鞭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扛禽,更是在濱河造成了極大的恐慌锋边,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件编曼,死亡現(xiàn)場離奇詭異豆巨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)掐场,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門往扔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熊户,你說我怎么就攤上這事萍膛。” “怎么了嚷堡?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蝗罗,是天一觀的道長。 經(jīng)常有香客問我蝌戒,道長串塑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任瓶颠,我火速辦了婚禮拟赊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粹淋。我一直安慰自己吸祟,他們只是感情好瑟慈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋匕,像睡著了一般葛碧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上过吻,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天进泼,我揣著相機(jī)與錄音,去河邊找鬼纤虽。 笑死乳绕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逼纸。 我是一名探鬼主播洋措,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼杰刽!你這毒婦竟也來了菠发?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤贺嫂,失蹤者是張志新(化名)和其女友劉穎滓鸠,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體第喳,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糜俗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了墩弯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吩跋。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖渔工,靈堂內(nèi)的尸體忽然破棺而出锌钮,到底是詐尸還是另有隱情,我是刑警寧澤引矩,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布梁丘,位于F島的核電站,受9級(jí)特大地震影響旺韭,放射性物質(zhì)發(fā)生泄漏氛谜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一区端、第九天 我趴在偏房一處隱蔽的房頂上張望值漫。 院中可真熱鬧,春花似錦织盼、人聲如沸杨何。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽危虱。三九已至羊娃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埃跷,已是汗流浹背蕊玷。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弥雹,地道東北人垃帅。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像剪勿,于是被迫代替她去往敵國和親挺智。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容