# 代碼風格審查工具Cpplint

代碼風格審查工具Cpplint

它山之石哥蔚,可以攻玉。 --《詩經(jīng)·小雅·鶴鳴》

1宇驾,簡介

Cpplint是一個Python腳本课舍,作為一款開源免費的代碼靜態(tài)檢測工具筝尾,Google也使用它作為自己的C++代碼檢測工具办桨,也就是說损姜,只要你想代碼遵從Google C++代碼規(guī)范殊霞,那么Cpplint將會提供很好的代碼靜態(tài)檢測支持绷蹲。

cpplint

  • Cpplint.py支持的文件格式包括.cc比规、.h、.cpp灾常、.cu岗憋、.cuh仔戈。

  • Cpplint只是一個代碼風格檢測工具,其并不對代碼邏輯晋修、語法錯誤等進行檢查。

2,安裝

Cpplint在Window下可以如下幾種方式使用

2.1運行命令行檢測

使用命令即可對代碼文件進行檢測忠怖。

Python cpplint.py   <file>

2.2 集成到VS中使用

在vs中使用的配置

這樣使用比較方便凡泣,支持錯誤雙擊跳轉(zhuǎn)鞋拟。

集成到VS:打開VS2015—》工具—》外部工具—》添加工具

寫入如下代碼:

Title:Cpplint.py
Command:E:\CpplintToPython\Python27\python.exe
Arguments:”E:\Cpplint\cpplint.py\cpplint.py” –output=vs7 $(ItemPath)
Initial directory:$(ItemDir)
Check Use Output window

2.3 使用python安裝版本

也可以使用python安裝cpplint模塊贺纲,

pip install cpplint 

或者

easy_install  cpplint

最新版本v1.4.4 支持python2 python3版本。

注意:直接只用python源碼版本或者安裝版本的話福铅,需要判斷其是否支持python3

3嘁圈,命令行的詳細使用

cpplint.py      [--verbose=#] 
                [--output=vs7] 
                [--filter=-x,+y,...]
                [--counting=total|toplevel|detailed] 
                [--root=subdir]
                [--linelength=digits] 
                [--headers=x,y,...]
                [--quiet]
        <file> [file] ...

verbose指定輸出錯誤級別

對于發(fā)現(xiàn)的每個問題检柬,cpplint都會給出一個位于區(qū)間[1, 5]之間的置信度評分,分數(shù)越高就代表問題越肯定肛根,可以通過verbose選項控制輸出哪些級別,如下臼氨,置信度評分為1芭届、2的將不會再輸出

cpplint.py --verbose=3 test.cpp 

cpplint的輸出格式

[--output=vs7]:cpplint的輸出格式有emacs和vs7兩種, 默認是emacs,vs7是Visual Studio輸出的兼容格式

指定輸出錯誤類型

[--filter=-x,+y,...]:指定輸出錯誤類型持隧,-表示不輸出树叽,+表示輸出(錯誤類型可以查看腳本中的_ERROR_CATEGORIES 定義的對應的列表)

例子:

--filter=-build,-whitespace,+whitespace/comma

-whitespace题诵,所有的[whitespace*]都將不輸出,但是有了+whitespace/comma性锭,則[whitespace/comma]類型的錯誤將被輸出

控制每行的最長長度

[--linelength=digits]:控制每行的最長長度草冈,google cpplint默認是80字符

擴展檢查文件后綴

輸出錯誤的方式

[--counting=total|toplevel|detailed]:輸出錯誤總數(shù)的方式,默認為total參數(shù)

例子:

--counting=total
#輸出
Total errors found: 96
--counting=toplevel
#輸出
Category 'whitespace' errors found: 88
Category 'build' errors found: 8
Total errors found: 96

--counting=detailed
#輸出:
Category 'whitespace/braces' errors found: 28
Category 'whitespace/semicolon' errors found: 1
Total errors found: 29 

cpplint支持每個目錄放置CPPLINT.cfg 單獨配置,CPPLINT.cfg通過包含多組鍵值對實現(xiàn)配置

      set noparent
      filter=+filter1,-filter2,...
      exclude_files=regex
      linelength=80
      root=subdir
      headers=x,y,...

屏蔽代碼不被檢查

假設代碼中有些部分不希望被檢查哩俭,或者覺得是cpplint產(chǎn)生的誤報拳恋。僅僅須要在對應代碼行尾加入凝視”// NOLINT”就可以,cpplint就會跳過這些行谬运。如:

return 0; // NOLINT

控制過濾置信度

對于發(fā)現(xiàn)的每一個問題梆暖,cpplint都會給出一個位于區(qū)間[1, 5]之間的置信度評分,分數(shù)越高就代表問題越肯定轰驳,能夠通過verbose選項控制輸出哪些級別弟灼。例如以下蝗肪。置信度評分為1、2的將不會再輸出:

cpplint  --verbose=3 test.cpp

假設須要讓cpplint支持其他文件擴展辛馆,又不想改動源代碼豁延。則能夠通過extensions選項如:

cpplint --extensions=hpp test.cpp

能夠通過filter選項。依照自己的須要過濾掉特定的警告苔可,”-FOO”表示不輸出帶有FOO的警告袋狞,”+FOO”表示輸出帶有FOO的警告,如:

cpplint --filter=-whitespace/tab,+whitespace/ending_newline test.cpp

能夠通過counting選項同蜻。來顯示每種Category有多少個錯誤早处,如:

cpplint.py --counting=detailed test.cpp

4, Q&A

常見報錯原因

  1. Tab found; better to use spaces 沒有使用四個空格代替縮進
  2. Lines should be <= 80 characters long 存在大于80字符的行
  3. Should have a space between // and comment 應該在//和注釋之間有一個空格
  4. An else should appear on the same line as the preceding }
  5. If an else has a brace on one side, it should have it on both [readability/braces] 上兩個錯誤經(jīng)常一起出現(xiàn),為大括號的位置不合規(guī)范
  6. Extra space for operator ++; ++符號和變量間不能有空格
  7. Redundant blank line at the end of a code block should be deleted. 代碼塊最后的空行應該被刪除
  8. Line contains invalid UTF-8 (or Unicode replacement character) 使用了中文注釋報的錯
  9. Line ends in whitespace. 代碼行最后存在空格
  10. Include the directory when naming .h files [build/include_subdir] [4]

屏蔽指定報錯的具體示例

如下報錯:

1.h:113:  Could not find a newline character at the end of the file.  [whitespace/ending_newline] [5]

其中 whitespace/ending_newline 是此類出錯的標識默责。

使用如下配置可以屏蔽 readability/utf8,whitespace/ending_newline咸包。多于1個以逗號作為分割,-代表屏蔽葡缰,+代表取消屏蔽忱反。

cpplint.exe  --filter=-readability/utf8,-whitespace/ending_newline    info.h

5滤愕,參考鏈接

  1. 谷歌編碼風格
  2. Google C++ Style Guide
  3. https://github.com/cpplint/cpplint
  4. microsoft CodeAnalysis
miao.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末间影,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌裙顽,老刑警劉巖宣谈,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異漩怎,居然都是意外死亡嗦嗡,警方通過查閱死者的電腦和手機勋锤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門叁执,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矮冬,你說我怎么就攤上這事』斗” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵硝拧,是天一觀的道長。 經(jīng)常有香客問我障陶,道長,這世上最難降的妖魔是什么抱究? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鼓寺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘妈候。我一直安慰自己,他們只是感情好苦银,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布赶站。 她就那樣靜靜地躺著,像睡著了一般贝椿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陷谱,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音习勤,去河邊找鬼。 笑死焙格,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的眷唉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼冬阳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肝陪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤氯窍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狼讨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡政供,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了离陶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枕磁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出计济,到底是詐尸還是另有隱情,我是刑警寧澤沦寂,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布淘衙,位于F島的核電站传藏,受9級特大地震影響彤守,放射性物質(zhì)發(fā)生泄漏毯侦。R本人自食惡果不足惜具垫,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筝蚕。 院中可真熱鬧,春花似錦起宽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腐晾。三九已至,卻和暖如春赴魁,著一層夾襖步出監(jiān)牢的瞬間卸奉,已是汗流浹背颖御。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留潘拱,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓芦岂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親禽最。 傳聞我的和親對象是個殘疾皇子袱饭,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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