最近在做arm64的移植,在網上看到了lint系列靜态代碼分析工具,在windows下就是pc-lint了,便拿來用了一下,功能還是挺強大的。初次上手,過程中也遇到不少疑惑,寫此文來記一下。
首先,安裝好pc-lint後,可去官網上下載下傳最新的更新檔(包括更新檔更新器lpatch和更新檔配置如l9-a-b.lp),這些都是最新的功能補充,網址:http://www.gimpel.com/html/ptch90.htm。
初次安裝好程式後,會讓你做一下基本設定,之後也可以再打開CONFIG.exe來進行設定。這些設定會存在std.lnt中。
在安裝目錄中有PC-lint.pdf,這是參考手冊,介紹了pc-lint的功能和使用。
将pc-lint內建到vs中,截止到目前已支援到vs2010、2012,後續新vs應該也都會支援的。目前我是在vs2008中使用的,隻要在vs菜單中點選“工具”,再點“外部工具”,彈出的對話框中點選“添加”。然後:
1. 标題:随便寫一個,如pc-lint,後面可加個快捷鍵,即加:(&7),這樣以後就可以在依次點選:alt > T > 7,就可以執行pc-lint分析目前cpp了。
2. 指令:即pc-lint的exe路徑,如:D:\z__program_files\lint\lint-nt.exe。
3. 參數:給lint-nt.exe的參數,因為pc-lint是像linux中衆多工具一樣,是靠強大的指令選項來執行功能的。如:-i"D:\z__program_files\lint" std.lnt env-vc9.lnt --u "E:\dev\lint_use\$(ProjectFileName).lnt" $(ItemPath),-i是添加目錄,std.lnt是配置,env-vc9.lnt是針對vs2008的配置,--u(是兩個“-”哈)是說對單個檔案進行分析,後面一個是工程的lnt配置檔案(下面要講),itempath就是目前cpp了。其中$(xxx)都是和工程屬性中一樣的宏,通過點選右邊的箭頭也可以給你生成出來。
4. 初始目錄:寫$(ProjectDir)就好了。
然後就可以在vs中使用pc-lint了,分析結果會出現在輸出視窗中。點選具體錯誤,可定位到相關檔案的相關行上。
講一下,其中涉及到工程的lnt配置檔案,主要是一些頭檔案包含目錄的生成,這個pc-lint已經為你準備好了,隻需要執行一個指令,就可以通過vs工程屬性檔案來生成lnt檔案。即:D:\z__program_files\lint> lint-nt "E:\dev\xxx\xx.vcproj" >"E:\dev\lint_use\xx.vcproj.lnt",
首先打開windows指令提示符,最好以管理者身份運作,進入lint安裝目錄,再輸入以上的lint-nt及後面的指令,注意xx.vcproj.lnt中的xx要和前面的xx.vcproj相同,因為上面外部工具中設定參數時用的宏是工程完整名。我是将所有的工程.lnt檔案都生成到一個統一的E:\dev\lint_use目錄下的。最後還需注意:
因為vcproj檔案中,有時有用到類似%SolutionDir%的宏,pc-lint是沒識别出來的,這個我不知道是否pc-lint有支援,我是用文本編輯工具打開.lnt檔案,直接編輯将其中的%SolutionDir%替換為真實的絕對路徑。
配置都是.lnt檔案,就是在其中加入指令參數控制功能,我覺得你也可以建立自己的lnt檔案,雖然我還沒試過,哈哈。這些檔案熟悉了之後都可以自己用文本編輯器直接編輯。
首先講一下std.lnt,其中是你作的配置。檔案内容比如:
// Microsoft Visual C++ 2008, -si4 -sp4, lib-atl.lnt lib-mfc.lnt lib-stl.lnt lib-w32.lnt
// Standard lint options
au-LP64.lnt // v_add: for LP64 model (should before options.lnt)
co-msc90.lnt
lib-atl.lnt lib-mfc.lnt lib-stl.lnt lib-w32.lnt
options.lnt -si4 -sp4
-i"C:\Program Files\Microsoft Visual Studio 9.0\VC\include"
-i"C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include"
-i"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include"
-i"E:\boost_1_54_0"
+libdir(E:\boost_1_54_0)
其中au-LP64.lnt是自己後來加上的,主要是為了做64位移植,指定是LP64資料指針模型。這個要放在options.lnt之前,因為options.lnt對這個有些功能指定做了修改。
+libdir(E:\boost_1_54_0),是指将指定檔案夾,比如此處的boost,指定為庫目錄,注意這個目錄要是已經屬于包含目錄了,即前面用-i"E:\boost_1_54_0"加過了,此兩目錄指定需要一緻,+libdir中指定 -i 中的子目錄也是不行的。
再來介紹下options.lnt,這個檔案主要用來自定義一些你自己想要的功能,就是在原來的功能上取消掉某些warning的産生,因為pc-lint是很嚴厲的,而有些甚至是建議性的,你不需要完全按照它的要求來(相信也沒有人能完全達到這個要求,或者說不在乎其中的有些要求)。關于這個檔案中能配置的選項,可參見PC-lint.pdf中的Appendix A。
其中的内容如,都是我自己加的哈:
// Please note -- this is a representative set of error suppression
// options. Please adjust to suit your own policies
// See manual (chapter LIVING WITH LINT)
// for further details.
// lib
-wlib(0)
//-elib(1275) // boost cause internal error fixed by new patch / wlib(0)
// suppress is ok
-e958 // padding align in struct
-estring(958,member) // up, suppress for au-64.lnt
-e917 // Prototype coercion, e747 is enough.(e.g.: 917: int to unsigned int, int to unsigned long; 747: int to unsigned long)
-e970 // Use of modifier or type 'Name' outside of a typedef
-esym(970,long) // up, suppress for au-64.lnt
// may open for v_self use
-e715 // Symbol 'Symbol'(Location) not referenced
-e732 // loss of sign: int ro unsigned, int to unsigned long (e570 is enough: negative constant to unsigned, (unsigned long)-1)
// tmp for test
-wlib(0) 是設定庫代碼的報警等級,預設為-wlib(2),我設定為了最低的-wlib(0),這樣庫中的錯誤和警告都不會有提示,哈哈。
-elib(1275),是指對庫中代碼的某個錯誤屏蔽,此處為1275,這些錯誤号都可以在pc-lint手冊中看到具體描述。
上面提到把boost的目錄設為了庫目錄,就是因為boost中很多東西會被檢測出來有錯誤,可能模闆技術用的太炫,pc-lint沒hold住啊。這樣在我設定的-wlib(0)下,boost就被忽略了。
-e#,是具體屏蔽某個錯誤。
還有像-estring,-esym這些大家就看手冊吧。
最後,pc-lint主要是用來對單個檔案進行分析,不過一般也是這樣,你需要針對每個c / cpp來分析,相應根據分析的結果進行修改。
網上有人也寫出了一個友善pc-lint來管理工程的工具,叫做LintProject,可以将一個工程的結果全部分析出來,然後生成html檔案,可以友善的打開檢視。其實,它就是針對工程的每個檔案都執行了下pc-lint分析而已。下載下傳位址:http://www.codeproject.com/Articles/8526/LintProject-Improving-the-Usability-of-PC-Lint-wit 。
它其中用到的指令大緻是這樣:
<lint-folder>\lint-nt.exe -i"<lint-folder>" -b -u std.lnt env-vc7.lnt -i"Debug" <source file> >Lint\<source file>.txt
相當于把生成結果重定向到某個txt中了。其中env-vc7.lnt和env-vc9.lnt其實内容是一樣的。
将下下來的LintProject中的可執行檔案LintProject.exe放進pc-lint的目錄下,我們就可以在指令提示符中來使用這個工具:
D:\z__program_files\lint> LintProject.exe E:\dev\xxx\xx.vcproj E:\dev\lint_use\result /cfg"Debug|Win32" /param"" /s。
它就會自動将分析好的結果在打開的html檔案中展示出來,可以看到這個工程的每個檔案分别有多少警告提示。具體其他使用,可以在上面的下載下傳網頁中看到說明。
好了,pc-lint就介紹到這了,大家都嘗試一下吧,看看你是否符合一個程式員的自我修養哦。