lint
lint
與大多數C語言編譯器相比,lint可以對程序進行更加廣泛的錯誤分析,是一種更加嚴密的編譯工具。最初,lint這個工具用來掃描C源文件並對源程序中不可移植的代碼提出警告。但是現在大多數lint實用程序已經變得更加嚴密,它不但可以檢查出可移植性問題,而且可以檢查出那些雖然可移植並且完全合乎語法但卻很可能是錯誤的特性。
隨著歷史的推移,Lint後來形成了一系列的工具,包括PC-Lint/FlexeLint(Gimpel),LintPlus(Cleanscape)以及Splint。
lint檢查C程序中潛在的錯誤,包括(但不限於)可疑的類型組合、未使用的變數、不可達的代碼以及不可移植的代碼。lint會產生一系列程序員有必要從頭到尾仔細閱讀的診斷信息。使用lint的好處是:1.它可以檢查出被編譯器漏掉的錯誤; 2.可以關聯很多文件進行錯誤的檢查和代碼分析,具有較強大靈活性.lint可以檢查的錯誤類型大體如下:
• 可能的空指針
• 在釋放內存后使用了指向該內存的指針
• 賦值次序問題
• 拼寫錯誤
• 被0除
• 失敗的case語句(遺漏了break語句)
• 不可移植的代碼(依賴了特定的機器實現)
• 宏參數沒有使用圓括弧
• 符號的丟失
• 異常的表達式
• 變數沒有初始化
• 可疑的判斷語句(例如,if(x=0))
• printf/scanf的格式檢查
UNIX系統 在UNIX系統中,可自動獲得lint,它是一個標準的UNIX工具。
Linux系統 在Linux各種發行版中,使用lint的版本是GNU下的Splint(前身是LClint)
Windows 在Windows系統中,從第三方獲得的lint工具的名稱是PC lint以及Splint
PC-Lint是GIMPEL SOFTWARE公司開發的C/C++軟體代碼靜態分析工具,是一個歷史悠久(30年之久)且功能異常強大的靜態代碼檢測工具,它的全稱是PC-Lint/FlexeLint for C/C++。PC-Lint能夠在Windows、MS-DOS和OS/2平台上使用,以二進位可執行文件的形式發布,而FlexeLint運行於其它平台,以源代碼的形式發布。PC-lint在全球擁有廣泛的客戶群,許多大型的軟體開發組織(比如Miscrosoft )都把PC-Lint檢查作為代碼走查的第一道工序。對小公司和個人開發者而言,PC-Lint也非常的重要。小公司往往受到開發成本的考慮,不能對代碼進行全面的測試。此時利用PC-Lint的強勁的功能可以很好的提高代碼的質量。
lint
PC-Lint的作用廣泛,單單控制選項就300多個,涉及程序編譯及語法使用中大方方面面。具體如下
1.PC-Lint是一種靜態代碼檢測工具,是一種更加嚴格的編譯器,不僅可以檢查出一般的語法錯誤,還可以檢查出雖然完全符合要求,但是卻可能存在潛在的,不易發現的錯誤
2.PC-lint不僅可以檢測單個文件,也可以從整個項目的角度來檢測問題,因為C語言編譯器固有的單個編譯,這些問題在編譯器環境下很難被檢測,而PC-Lint在檢查當前文件的同時還會檢查所有與之相關的文件,可想而知,它會對我們有很大的幫助。
3.PC-lint支持幾乎所有流行的編輯環境和編譯器,比如BorlandC++從1.x到5.x各個版本、Borland C++ Build、GCC、VC、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台環境。支持Scott Meyes的名著(Effective C++/More Effective C++)中說描述的各種提高效率和防止錯誤的方法。
錯誤說明 | C | C++ | 告警級別 |
1-199 | 1001-1199 | 1 | |
語法錯誤 | 200-299 | ||
致命錯誤 | 300-399 | ||
告警 | 400-699 | 1400-1699 | 2 |
消息 | 700-800 | 1700-1899 | 3 |
可選信息 | 900-999 | 1900-1999 | 4 |
代碼檢查告警級別
w0 不產生信息(除了遇到致命的錯誤)
w1 只生成錯誤信息-- 沒有告警信息和其它提示信息
w2 只有錯誤和告警信息
w3 生成錯誤、告警和其它提示信息(這是默認設置)
w4 生成所有信息
函數庫頭文件的告警級別
wlib(0) 不生成任何庫信息
wlib(1) 只生成錯誤信息(當處理庫的源代碼時)
wlib(2) 生成錯誤和告警信息
wlib(3) 生成錯誤、告警和其它信息(這是默認設置)
wlib(4) 產生所有信息
一般代碼檢查功能
變數值跟蹤:包括對變數值初始化,變數值,函數內變數這些情況進行跟蹤,發現其中不符合語法規範的告警
賦值順序檢查:檢查當一個表達式的值依賴於賦值的順序時,是否會出問題
弱定義檢查:檢查當宏定義、typedef名字、聲明、結構、聯合和枚舉類型這些東西可能在模塊中被過多定義且不被使用的情況。
格式檢查:檢查printf和scanf(及其家族)中的格式衝突告警
縮進檢查:檢查代碼中的縮進問題是為避免出現代碼結構不良或者大括弧的遺漏等問題
const變數檢查
volatile變數檢查