国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何寫出優(yōu)雅的C++代碼

開發(fā) 后端
工欲善其事必先利其器,優(yōu)雅的代碼離不開靜態(tài)代碼檢查工具,大家可能平時(shí)使用較多的是cppcheck,但今天我想跟大家分享另一個(gè)靜態(tài)代碼檢查工具clang-tidy。

[[373379]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序喵大人」,作者程序喵大人 。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序喵大人公眾號(hào)。

 工欲善其事必先利其器,優(yōu)雅的代碼離不開靜態(tài)代碼檢查工具,大家可能平時(shí)使用較多的是cppcheck,但今天我想跟大家分享另一個(gè)靜態(tài)代碼檢查工具clang-tidy。

不同于cppcheck使用正則表達(dá)式進(jìn)行靜態(tài)代碼分析,clang-tidy是基于語法分析樹的靜態(tài)代碼檢查工具,雖然它的速度比正則表達(dá)式慢一些,但是它檢查的更準(zhǔn)確、全面,而且不僅可以做靜態(tài)檢查,還可以做一些修復(fù)工作,自行添加一些自定義檢查規(guī)則。

話不多說,上代碼:

  1. #include <iostream> 
  2.  
  3. int main() { 
  4.     int a = 1.2; 
  5.     return 0; 

這里有隱式類型轉(zhuǎn)換,可以使用clang-tidy來檢測(cè):

  1. ~/test$ clang-tidy -checks=* test_lint.cpp -- 
  2. 7748 warnings generated. 
  3. /home/wangzhiqiang/test/test_lint.cpp:20:13: warning: implicit conversion from 'double' to 'int' changes value from 1.2 to 1 [clang-diagnostic-literal-conversion] 
  4.     int a = 1.2; 
  5.             ^ 
  6. Suppressed 7747 warnings (7747 in non-user code). 
  7. Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 

這里也許你有疑問了,這不就是一個(gè)普通的編譯警告嘛,正常使用編譯器也可以檢查出來,那再看一段代碼:

  1. #include <iostream> 
  2.  
  3. int main() { 
  4.     char* d = NULL
  5.     return 0; 

我們都知道在C++中應(yīng)該更多的使用nullptr而不是NULL,這里使用了NULL而不是使用nullptr,可能我們?cè)陂_發(fā)過程中沒有注意到這種用法,所以clang-tidy派上了用場(chǎng):

  1. ~/test$ clang-tidy -checks=* test_lint.cpp -- 
  2. 7748 warnings generated. 
  3. /home/wangzhiqiang/test/test_lint.cpp:20:15: warning: use nullptr [modernize-use-nullptr] 
  4.     char* d = NULL
  5.               ^~~~~ 
  6.               nullptr 
  7. Suppressed 7747 warnings (7747 in non-user code). 
  8. Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 

再舉一個(gè)例子:

  1. struct Base { 
  2.     virtual void func() { 
  3.  
  4.     } 
  5. }; 
  6.  
  7. struct Derive : Base { 
  8.     virtual void func() { 
  9.  
  10.     } 
  11. }; 

這里可能我們乍一看沒有任何問題,其實(shí)在C++11里派生類繼承父類,重寫了某些函數(shù)時(shí)最好加上override關(guān)鍵字,通過clang-tidy還是可以檢測(cè)出來:

  1. ~/test$ clang-tidy -checks=* test_lint.cpp -- 
  2. 7749 warnings generated. 
  3. /home/wangzhiqiang/test/test_lint.cpp:14:18: warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [hicpp-use-override] 
  4.     virtual void func() { 
  5.     ~~~~~~~~~~~~~^ 
  6.                         override 
  7. Suppressed 7747 warnings (7747 in non-user code). 
  8. Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 

該工具還可以檢查代碼是否符合編碼規(guī)范,例如Google編碼規(guī)范等,看這段頭文件相關(guān)代碼:

  1. #include <iostream> 
  2. #include <string> 
  3. #include <memory> 

這里其實(shí)有一點(diǎn)點(diǎn)問題,頭文件引用順序不滿足編碼規(guī)范,這里其實(shí)clang-format都可以檢測(cè)出來,但clang-tidy也可以檢測(cè)出來,通過-fix還可以進(jìn)行自動(dòng)修復(fù):

  1. ~/test$ clang-tidy -checks=* test_lint.cpp -- 
  2. 8961 warnings generated. 
  3. /home/wangzhiqiang/test/test_lint.cpp:2:1: warning: #includes are not sorted properly [llvm-include-order
  4. #include <string> 
  5. ^        ~~~~~~~~ 
  6. Suppressed 8960 warnings (8960 in non-user code). 
  7. Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well 

它還可以檢測(cè)隱藏的內(nèi)存泄漏:

  1. int main() { 
  2.     char* ct = (char*)malloc(323); 
  3.     return 0; 

這是使用clang-tidy的檢測(cè)結(jié)果:

  1. ~/test$ clang-tidy -checks=* test_lint.cpp -- 
  2. 7756 warnings generated. 
  3. /home/wangzhiqiang/test/test_lint.cpp:20:5: warning: initializing non-owner 'char *' with a newly created 'gsl::owner<>' [cppcoreguidelines-owning-memory] 
  4.     char* ct = (char*)malloc(323); 
  5.     ^ 
  6. /home/wangzhiqiang/test/test_lint.cpp:20:5: warning: use auto when initializing with a cast to avoid duplicating the type name [hicpp-use-auto] 
  7.     char* ct = (char*)malloc(323); 
  8.     ^~~~~ 
  9.     auto 
  10. /home/wangzhiqiang/test/test_lint.cpp:20:11: warning: Value stored to 'ct' during its initialization is never read [clang-analyzer-deadcode.DeadStores] 
  11.     char* ct = (char*)malloc(323); 
  12.           ^ 
  13. /home/wangzhiqiang/test/test_lint.cpp:20:11: note: Value stored to 'ct' during its initialization is never read 
  14. /home/wangzhiqiang/test/test_lint.cpp:20:16: warning: C-style casts are discouraged; use static_cast [google-readability-casting] 
  15.     char* ct = (char*)malloc(323); 
  16.                ^~~~~~~~~~~~~     ~ 
  17.                static_cast<char*>( ) 
  18. /home/wangzhiqiang/test/test_lint.cpp:20:16: warning: do not use C-style cast to convert between unrelated types [cppcoreguidelines-pro-type-cstyle-cast
  19. /home/wangzhiqiang/test/test_lint.cpp:20:23: warning: do not manage memory manually; consider a container or a smart pointer [cppcoreguidelines-no-malloc] 
  20.     char* ct = (char*)malloc(323); 
  21.                       ^ 
  22. /home/wangzhiqiang/test/test_lint.cpp:21:5: warning: Potential leak of memory pointed to by 'ct' [clang-analyzer-unix.Malloc] 
  23.     return 0; 
  24.     ^ 
  25. /home/wangzhiqiang/test/test_lint.cpp:20:23: note: Memory is allocated 
  26.     char* ct = (char*)malloc(323); 
  27.                       ^ 
  28. /home/wangzhiqiang/test/test_lint.cpp:21:5: note: Potential leak of memory pointed to by 'ct' 
  29.     return 0; 
  30.     ^ 
  31. Suppressed 7747 warnings (7747 in non-user code). 
  32. Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well 

clang-tidy還有很多高端功能,大概可以檢測(cè)出250種問題,大體主要分為幾大類:

  • abseil:檢測(cè)abseil庫(kù)的相關(guān)問題
  • android:檢測(cè)Android相關(guān)問題
  • boost:檢測(cè)boost庫(kù)的相關(guān)問題
  • cert:檢測(cè)CERT的代碼規(guī)范
  • cpp-core-guidelines:檢測(cè)是否違反cpp-core-guidelines
  • google:檢測(cè)是否違反google編碼規(guī)范
  • llvm:檢測(cè)是否違反llvm編碼規(guī)范
  • performance:檢測(cè)性能相關(guān)的問題
  • readability:檢測(cè)與可讀性相關(guān),但又不屬于某些編碼規(guī)范的問題
  • modernize:檢測(cè)是否使用現(xiàn)代C++11相關(guān)的代碼問題

而且適用于Windows/Linux/MacOS多平臺(tái),還支持命令行,CLion/VSCode/VSStudio插件等,檢測(cè)規(guī)則還可以定制,重要的是免費(fèi)開源,快去用起來吧,寫出優(yōu)雅的C++代碼~

參考資料:

https://clang.llvm.org/extra/clang-tidy/

https://www.bilibili.com/video/av96166240/

 

責(zé)任編輯:武曉燕 來源: 程序喵大人
相關(guān)推薦

2019-09-20 15:47:24

代碼JavaScript副作用

2022-03-11 12:14:43

CSS代碼前端

2020-05-14 09:15:52

設(shè)計(jì)模式SOLID 原則JS

2021-12-07 08:16:34

React 前端 組件

2020-07-15 08:17:16

代碼

2020-05-08 14:45:00

JS代碼變量

2020-05-11 15:23:58

CQRS代碼命令

2021-09-01 08:55:20

JavaScript代碼開發(fā)

2013-06-07 14:00:23

代碼維護(hù)

2021-11-30 10:20:24

JavaScript代碼前端

2022-02-17 10:05:21

CSS代碼前端

2022-02-08 19:33:13

技巧代碼格式

2020-12-19 10:45:08

Python代碼開發(fā)

2020-05-19 15:00:26

Bug代碼語言

2021-12-13 14:37:37

React組件前端

2022-10-24 08:10:21

SQL代碼業(yè)務(wù)

2015-09-28 10:49:59

代碼程序員

2019-06-24 10:26:15

代碼程序注釋

2021-04-29 21:54:44

Python代碼語言

2015-05-11 10:48:28

代碼干凈的代碼越少越干凈
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品久久久99| 91网站视频在线观看| 日韩欧美一级二级三级久久久| 亚洲国产精品久久久久久女王| 色网站免费在线观看| 久久激情五月激情| 久久久爽爽爽美女图片| 青青草在线视频免费观看| 久久国产三级精品| 国产成人综合久久| 黄色在线观看www| 亚洲人成精品久久久久久| 欧美lavv| 欧美jizz19性欧美| 欧美日韩在线第一页| av动漫在线播放| 婷婷六月综合| 一区二区三区精品99久久| 亚洲色图另类色图| 成人国产精品免费网站| 成人免费淫片视频软件| 青青青国产精品| 欧美日韩一区二区三区不卡| 久久久999视频| 西西人体一区二区| 国产精品免费久久久久影院| 欧美精品资源| 欧美一区二区高清| 日本韩国福利视频| 91麻豆精品一区二区三区| 欧美最大成人综合网| 视频一区在线| 亚洲精品在线观看www| 精品成人一区二区三区免费视频| 日本大片免费看| 国产精品99| 日韩欧美一级片| 免费国产在线视频| 亚洲美女屁股眼交| 国产高潮免费视频| 91女神在线视频| 蜜桃传媒一区二区三区| 免费在线看一区| 欧美自拍资源在线| 亚洲欧美成人| 日本婷婷久久久久久久久一区二区| 91精品91| 99精彩视频在线观看免费| 日韩精品导航| 日韩av电影院| 日韩欧美视频| 99久久精品免费看国产一区二区三区 | 在线成人激情| 亚洲伊人成综合成人网| 亚洲综合小说| 精品一区二区视频| 久久黄色影院| 日韩精品国内| 国产精品综合网| 视频一区在线播放| 欧美精品在线免费| 日本中文字幕在线视频观看| 99视频一区| 亚洲成人激情在线| xxxx成人| 亚洲欧美另类国产| 欧洲亚洲精品| 久久久亚洲国产| 亚洲bt欧美bt精品777| 日本久久久久久久久久久| 日韩精品欧美| 国产精品久久国产三级国电话系列 | 国产精品视频在线观看| 亚洲深深色噜噜狠狠爱网站| 国产欧美日韩一区| 另类小说欧美激情| 欧美两根一起进3p做受视频| 午夜电影一区二区三区| 老司机99精品99| 一本色道久久88亚洲综合88| 免费成人蒂法| 国内精品久久久久久久果冻传媒| 国产一区欧美二区| 97福利电影| 日韩欧美在线网站| 秋霞午夜一区二区三区视频| 成人综合网网址| 美女久久久精品| 日韩精品视频一二三| 欧美性大战久久久久久久蜜臀| 成人免费直播| 8x拔播拔播x8国产精品| 91久久午夜| 爱福利视频一区二区| 亚洲一区在线观看视频| 欧美78videosex性欧美| 久久久免费电影| 国产精品毛片在线看| 日韩av资源在线| 欧美在线色视频| 欧洲午夜精品| 精品日本一区二区| 国产欧美日韩精品a在线观看| 狠狠色伊人亚洲综合网站l| 在线视频中文亚洲| 日韩a一区二区| 久久久亚洲人| 91麻豆精品国产综合久久久| 日本黄网站色大片免费观看| 青春草在线观看 | 91香蕉视频mp4| 高清在线观看av| 色在人av网站天堂精品| 亚洲欧美日韩国产一区| 三上悠亚av一区二区三区| 91精品国产一区二区三区| a级日韩大片| 伊甸园精品99久久久久久| 午夜激情久久久| 一区二区日韩| 日韩人妻精品一区二区三区| 欧美日韩亚洲视频| 日韩一区二区三区四区五区| 麻豆精品传媒视频| 亚洲国产日韩一级| 久久gogo国模啪啪裸体| 先锋影音亚洲资源| 一本久道中文字幕精品亚洲嫩| 精品视频二区| 精品视频一区二区三区四区| 99久久99久久久精品齐齐| 国产对白在线正在播放| 久久久精品999| 欧美精品99| 黄黄视频在线观看| 一本色道亚洲精品aⅴ| 成人区精品一区二区不卡| 日本电影亚洲天堂| 国产精品久久久久久久第一福利| 日韩成人在线观看视频| 91禁国产网站| 婷婷成人影院| jizz欧美性11| 欧美精品日韩www.p站| 激情av综合网| 国产一区二区免费电影| 亚洲天堂成人网| 久久电影天堂| 亚洲精品高清视频| 欧美日韩一区二区在线观看视频| 国产一区二区在线| 自拍偷拍21p| 久久亚洲电影天堂| av在线播放一区二区三区| 国模私拍一区二区国模曼安| 欧美日韩综合网| 欧美在线影院一区二区| 日韩视频在线观看| 轻轻色免费在线视频| 国产精品美女主播| 亚洲综合久久久久| 欧美美乳视频| 人人在线97| 国产精品色午夜在线观看| 夜夜嗨av一区二区三区中文字幕| 麻豆一二三区精品蜜桃| 粉嫩虎白女毛片人体| 欧美精品久久久久久久免费观看 | 亚洲国产精品成人av| 欧美成人三级在线视频| 成人看片毛片免费播放器| 狠狠干夜夜操| www.久久爱.com| 久久不见久久见中文字幕免费| 成人同人动漫免费观看| 五月开心六月丁香综合色啪| 老司机午夜精品| 99久久99久久免费精品蜜臀| 一本大道av伊人久久综合| 欧美三级电影在线观看| 成人va天堂| 日韩精品一区国产| 噜噜噜91成人网| 亚洲人成7777| 亚洲美女久久久| 精品欧美一区二区在线观看| 亚洲欧美一区二区三区国产精品 | 国产一区二区自拍| 99久久99精品久久久久久| 婷婷中文字幕一区| 亚洲免费视频一区二区三区| 国产精品国产福利国产秒拍| 色综合视频在线观看| 亚洲经典视频在线观看| 国产精品白浆| 国产精品亚洲欧美| 亚洲夂夂婷婷色拍ww47 | 免费无码国产v片在线观看| 中文字幕日韩一区二区三区不卡| 狠狠躁狠狠躁视频专区|