軟體品質之道:PCLint之二,品質之道pclint
圓規為什麼可以畫圓?因為腳在走,心不變。你為什麼不能圓夢?因為心不定,腳不動。
1 燈塔與方向
時間過得可真快,仍記得櫻桃紅芭蕉綠的時節,轉眼已入深秋。我愛大自然,其次就是藝術。高納德老先生的著作《The Art of Computer Programming》至今仍塵封在書堆之中,實在是沒有膽量拿起這份重量。
今天真是美好的一天,不知道是不是已經看到燈塔的光芒了,突然射過來的光芒,好刺眼,好心慌。興奮的心情難以平複,感覺人生再也不會有如此複雜的心情了,突然看到希望的那一天,真是人生最大的幸福吧!
繼續說軟體品質之道的第二員大將,PCLint,上一篇文章中主要介紹了PCLint的安裝配置以及升級,這篇文章著重介紹如何將PCLint作為一個工具添加到常用開發環境中去,成為我們開發過程中的左肩右膀。
注,上篇文章中PCLint工具進行了更新,請小夥伴們注意重新下載,主要有兩方面的原因。第一,原工具應該是有問題的一個版本,升級後,不能正確的解析Visual Studio的工程檔案,在這上面,整整花費了我一個多星期的時間來調查,是導致這篇文章難產的主要兇手。第二,增加了Visual Studio 2010, 2012, 2013等版本的設定檔,方便大家的使用。
2 PCLint的命令列
PCLint主要使用命令列模式來進行檔案的解析,這個GCC的編譯器過程非常相似。其命令列格式為:
lint options file1 [ file2 file3... ]
既然將PCLint可以當做一個編譯器,則options即為編譯選項,file即為要編譯的檔案,對於C++來說,主要是*.cpp檔案,由於*.h作為包含檔案,是不會進行單獨進行編譯的,所以這一點需要注意。
如果對一個工程的檔案進行檢查時,則需要組建檔案列表來進行,類似於Makefile檔案,所以需要注意一下。
接下來是各個工具的具體配置方法,具體詳細的各個參數的資訊,還請查閱安裝目錄下的手冊。
3 VisualStudio配置3.1 掃描並建立cpp檔案清單
這個過程就是上面說到的組建檔案列表,在Visual Studio中,主要按照工程(或目錄)來進行建立。
1. 選擇工具,然後建立外部擴充工具。
2. 建立一個外部擴充工具,名稱PCLintCreation。
參數如下:
Title:PCLintCreation
Command:安裝路徑\lint-nt.exe
Arguments:-v-os("$(TargetName).lnt") "$(ProjectFileName)"
Initial directory: $(ProjectDir)
3. 同樣,可以根據前文SourceMonitor配置時,進行快速鍵的分配。
4. 執行添加的PCLintCreation,會在對應的工程檔案路徑下,產生一個對應的*.lnt檔案,內容如下:
5. 需要注意的是,當該工程下檔案發生變化時,需要重新執行此任務,保證檔案清單的正確性。
3.2 對工程下所有檔案進行檢查
根據上一步掃描的檔案,進行PCLint檢查。
1. 選擇工具,然後建立外部擴充工具,這個跟上部分的第一步相同。
2. 建立外部工具,名稱PCLintCheck。
參數如下:
Title:PCLintCheck
Command:D:\lint\lint-nt.exe
Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(TargetName).lnt"
Initial directory:$(ProjectDir)
需要注意的有幾點,第一,由於PCLint對於C++11的支援可能沒有Visual Studio 2013支援的那麼廣泛,所以會檢測失敗,所以不建議在Visual Studio 2013及以上版本進行使用。第二,第一個lint檔案,std.lnt即為上篇文章中配置產生的檔案,env-vc12.lnt為VC12(Visual Studio 2013)對應的設定檔,"$(TargetName).lnt"為上一步對工程掃描的檔案清單。第三,如果提示缺少*.lnt檔案,則將對應的檔案拷貝到PCLint安裝路徑下即可。
3. 執行PCLint,會在Output視窗中輸出對應的Info,Warn,Error和Fatal等資訊,這樣根據資訊查看對應的代碼,並進行改正。
3.3 對單個檔案進行檢查
如果僅僅是對單個檔案進行檢查,則不需要配置前兩步即可,但這個步驟僅對於單個檔案執行檢查是有效,不方便配置到Ant任務中。但是相對於整個工程的檢查,效率比較高,所以適合快速檢查檔案,並修改問題,具體配置如下。
1. 選擇工具,然後建立外部擴充工具,這個跟前面相同。
2. 建立外部工具,名稱PCLintCheckItem。
參數如下:
Title:PCLintCheckItem
Command:D:\lint\lint-nt.exe
Arguments:-i"D:\lint"std.lnt env-vc12.lnt "$(ItemFileName)$(ItemExt)"
Initial directory:$(ItemDir)
3. 執行PCLint,會對當前檔案進行檢查,並輸出結果到Output視窗中,例如:
當然,由於使用的是Visual Studio 2013作為執行個體,導致執行失敗。這個在Visual Studio 2012上執行是沒有問題的。
4 進一步思考
寫到最後,卻發現這篇文章寫得有點潦草了,實在是不應該。可惜PCLint跟不上C++ 11的腳步,也跟不上Visual Studio的發展腳步。願PCLint的開發商更加進一步,不斷更新這個優秀的工具。
當然,工具只是一部分,萬萬不要將所有一切壓在工具身上。實際上,只要遵守良好的代碼規範,犯錯誤的機會將會減到最低,PCLint也僅僅是一個指導作用而已,這也是我對這個工具的理解。
還是寧願做一個苦行僧,適應了艱苦卓絕的環境,在回來看看這些Warning,Error或者Fatal,簡直是貽笑大方,建議大家有時間讀一下Matthew Wilson的《Inperfect C++》一書,相信您也會贊同我的觀點,即作者的觀點。當然,正如作者所言,假設您已經對《Effective C++》和《Exceptional C++》系列有一定的瞭解,也已經有TCPL聖經在手,另外對模板有了一定的瞭解,那這本書不會讓你失望。嗯,至少我讀了此書之後,再看看我寫的Perfect C++,額,不忍直視。
激動的心情還是不能平靜下來,打算把這幾篇文章移除《Perfect C++》的系列,放到QA系列之內,也算是一個總結吧。
另外,最近對自然語言處理有了一定的研究和成果,雖然大部分都是參考前人的觀點,但是也想對自己這部分研究進行總結分享一下,藉此機會加深對這部分知識的理解,也希望各路大神能夠互相討論學習,共同提升!