靜態程式碼檢查工具的使用
摘要:C/C++語言的語法擁有其他語言所沒有的靈活性,這種靈活性帶來了程式碼效率的提升,但相應增加了程式碼中存在隱患的可能性。靜態程式碼檢查工具PC-Lint則偏重於程式碼的邏輯分析,它能夠發現程式碼中潛在的錯誤,比如陣列訪問越界、記憶體洩漏、使用未初始化變數等。本文將介紹如何安裝和配置PC-Lint程式碼檢查工具以及如何將PC-Lint與常見的程式碼編輯軟體集成。


關鍵字:程式碼檢查 PC-Lint 規則 選項


           
   
1  
2 PC-Lint介紹
3 PC-Lint的程式碼檢查功能
  3.1 強類型檢查
  3.2 變數值跟蹤
  3.3 賦值順序檢查
  3.4 弱定義檢查
  3.5 格式檢查
  3.6 縮進檢查
  3.7 const變數檢查
  3.8 volatile變數檢查
4 PC-Lint軟體使用方法
  4.1 安裝與配置
  4.2 PC-Lint與常用開發工具的集成(Visual C++,Source Insight,UEdit)
5 總結
參考文獻
附錄一  PC-Lint 重要文件說明
附錄二  錯誤資訊禁止選項說明
附錄三  PC-Lint檢測中的常見錯誤


引言


    C/C++語言的語法擁有其他語言所沒有的靈活性,這種靈活性帶來了程式碼效率的提升,但相應也使得程式碼編寫具有很大的隨意性,另外C/C++編譯器不進行 強制類型檢查,也不做任何邊界檢查,這就增加了程式碼中存在隱患的可能性。如果能夠在程式碼提交測試之前發現這些潛在的錯誤,就能夠極大地減輕測試人員的壓 力,減少軟體專案的除錯成本,可是傳統的C/C++編譯器對此已經無能為力,這個任務只能由專用的程式碼檢查工具完成。目前有很多C/C++靜態程式碼檢查工 具,其中LoGIScope RuleCheckerPC-Lint是目前應用比較廣泛的兩個工具。這兩個檢查工具各有特色,Logiscope RuleChecker傾向於程式碼編碼規範的檢查,比如程式碼縮進格式、case語句書寫規範、函數聲明和布林運算式的編寫規則等,而PC-Lint則偏重 於程式碼的邏輯分析,它能夠發現程式碼中潛在的錯誤,比如陣列訪問越界、記憶體洩漏、使用未初始化變數等。本文將介紹如何安裝和配置PC-Lint程式碼檢查工具 以及將PC-Lint與常見的程式碼編輯軟體,如Visual C++Source Insight集成的方法,同時還將簡要介紹一些PC-Lint常用的程式碼檢查選項。


PC-Lint介紹


    PC-LintGIMPEL SOFTWARE公司開發的C/C++軟體程式碼靜態分析工具,它的全稱是PC-Lint/FlexeLint for C/C++PC-Lint能夠在WindowsMS-DOSOS/2平臺上使用,以二進位可執行檔的形式發佈,而FlexeLint 運行於其他平臺,以源程式碼的形式發佈。PC-lint在全球擁有廣泛的客戶群,許多大型的軟體發展組織都把PC-Lint檢查作為程式碼走查的第一道工序。PC-Lint不僅能夠對程式進行全局分析,識別沒有被適當檢驗的陣列下標,報告未被初始化的變數,警告使用空指標以及冗餘的程式碼,還能夠有效地幫你提出許多程式在空間利用、運行效率上的改進點。
    通過下面的例子就可以看出PC-Lint工具的強大功能:
1
2char *report( int m, int n, char *p )
3{
4 int result;
5 char *temp;
6 long nm;
7 int i, k, kk;
8 char name[11] = "Joe Jakeson";
9
10 nm = n * m;
11 temp = p == "" ? "null" : p;
12 for( i = 0; i
14 k++;
15 kk = i;
16 }
17
18 if( k== 1 ) result = nm;
19 else if( kk > 0 ) result = 1;
20 else if( kk < 0 ) result = -1;
21
22 if( m == result ) return( temp );
23 else return( name );
24}

這是一段C程式碼,可以通過大多數常見的C語言編譯器的檢查,但是PC-Lint能夠發現其中的錯誤和潛在的問題:第 8行向name陣列賦值時丟掉了結尾的nul字元,第10行的乘法精度會失准,即使考慮到longint的字長更長,由於符號位元的原因仍然會造成精度失 准,第11行的比較有問題,第14行的變數k沒有初始化,第15行的kk可能沒有被初始化,第22行的result也有可能沒有被初始化,第23行返回的 是一個局部物件的位址。
    隨著C++語言的出現,C/C++編譯器有了更嚴格的語法檢查,但是仍然不能避免出現有BUG的程式。C++的類型檢查依然不如Pascal那麼嚴格。對 於一個小程式,多數程式師都能夠及時發現上面出現的錯誤,但是從一個擁有成千上萬行程式碼的大型軟體中找出這些瑕疵將是一項煩瑣的工作,而且沒有人可以保證 能找出所有的這類問題。如果使用PC-Lint,只需通過一次簡單的編譯就可以檢查出這些錯誤,這將節省了大量的開發時間。從某種意義上說。PC- Lint是一種更加嚴格的編譯器,它除了可以檢查出一般的語法錯誤外,還可以檢查出那些雖然符合語法要求,但很可能是潛在的、不易發現的錯誤。


PC-Lint的程式碼檢查功能


    PC-Lint能夠檢查出很多語法錯誤和語法上正確的邏輯錯誤,PC-Lint為大部分錯誤消息都分配了一個錯誤號,編號小於1000的錯誤號是分配給C 語言的,編號大於1000的錯誤號則用來說明C++的錯誤消息。表 1 列出了PC-Lint警告消息的詳細分類:









































1 列出了PC-Lint警告消息分類



錯誤說明



C



C++



警告級別



語法錯誤



1-199



1001-1199



1



內部錯誤



200-299



 



0



致命錯誤



300-399



 



0



警告



400-699



1400-1699



2



消息



700-800



1700-1899



3



可選信息



900-999



1900-1999



4




 


 


 


 


 


C語言為例,其中的編號1-199指的是一般編譯器也會產生的語法錯誤;編號200-299PC-Lint程式內部的錯誤,這類錯誤不會出現在 程式碼中的;編號300-399指的是由於記憶體限制等導致的系統致命錯誤。編號400-999中出現的提示資訊,是根據隱藏程式碼問題的可能性進行分類的:其 中編號400-699指的是被檢查程式碼中很可能存在問題而產生的警告資訊;編號700-899中出現的資訊,產生錯誤的可能性相比警告資訊來說級別要低, 但仍然可能是因為程式碼問題導致的問題。編號900-999是可選資訊,他們不會被默認檢查,除非你在選項中指定檢查他們。
    PC-Lint/FelexLint提供了和許多編譯器類似的警告級別設置選項-wLevel,它的警告級別分為以下幾個級別,缺省警告級別為3級:
-w0 不產生資訊(除了遇到致命的錯誤)
-w1 只生成錯誤資訊 -- 沒有警告資訊和其他提示資訊
-w2 只有錯誤和警告資訊
-w3 生成錯誤、警告和其他提示資訊(這是默認設置)
-w4 生成所有資訊
PC-Lint/FelexLint還提供了用於處理函數庫的頭檔的警告級別設置選項-wlib(Level),這個選項不會影響處理C/C++源程式碼模組的警告級別。它有和-wLevel相同的警告級別,缺省警告級別為3級:
-wlib(0) 不生成任何庫資訊
-wlib(1) 只生成錯誤資訊(當處理庫的源程式碼時)
-wlib(2) 生成錯誤和警告資訊
-wlib(3) 生成錯誤、警告和其他資訊(這是默認設置)
-wlib(4) 產生所有資訊
    PC-Lint的檢查分很多種類,有強類型檢查、變數值跟蹤、語義資訊、賦值順序檢查、弱定義檢查、格式檢查、縮進檢查、const變數檢查和 volatile變數檢查等等。對每一種檢查類型,PC-Lint都有很多詳細的選項,用以控制PC-Lint的檢查效果。PC-Lint的選項有300 多種,這些選項可以放在注釋中(以注釋的形式插入程式碼中),例如:
/*lint option1 option2 ... optional commentary */     選項可以有多行
//lint option1 option2 ... optional commentary        選項僅為一行(適用於C++
項間要以空格分開,lint命令一定要小寫,並且緊跟在/*//後面,不能有空格。如果選項由類似於操作符和運算元的部分組成,例如 -esym(534, printf, scanf, operator new),其中最後一個選項是operator new,那麼在operatornew中間只能有一個空格。PC-Lint的選項還可以放在巨集定義中,當巨集被展開時選項才生效。例如:
#define DIVZERO(x) /*lint -save -e54 */ ((x) /0) /*lint -restore */ 允許除數為0而不警告
    下面將分別介紹PC-Lint常用的,也是比較重要的程式碼檢查類型,並舉例介紹了各個檢查類型下可能出現的警告資訊以及常用選項的用法:


    全站熱搜

    立你斯 發表在 痞客邦 留言(0) 人氣()