lint

lint

lint是最著名的C語言工具之一,是由貝爾實驗室SteveJohnson於1979在PCC(PortableC Compiler)基礎上開發的靜態代碼分析,一般由UNIX系統提供。

工具介紹


與大多數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


簡介

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
lint
C/C++語言的語法擁有其它語言所沒有的靈活性,這種靈活性帶來了代碼效率的提升,但相應也使得代碼編寫具有很大的隨意性,另外C/C++編譯器不進行強制類型檢查,也不做任何邊界檢查,這就增加了代碼中存在隱患的可能性。如果能夠在代碼提交測試之前發現這些潛在的錯誤,就能夠極大地減輕測試人員的壓力,減少軟體項目的除錯成本,可是傳統的C/C++編譯器對此已經無能為力,這個任務只能由專用的代碼檢查工具完成。而PC-Lint就是這樣的代碼檢查工具。PC-Lint不僅能夠對程序進行全局分析,識別沒有被適當檢驗的數組下標,報告未被初始化的變數,警告使用空指針以及冗餘的代碼,還能夠有效地幫你提出許多程序在空間利用、運行效率上的改進點。在代碼走讀和單元測試之前使用PC-Lint可以提前發現程序中的隱藏錯誤,提高代碼質量,節省測試時間;並提供編碼規則檢查,規範軟體開發人員的編碼行為。

作用

PC-Lint的作用廣泛,單單控制選項就300多個,涉及程序編譯及語法使用中大方方面面。具體如下
1.PC-Lint是一種靜態代碼檢測工具,是一種更加嚴格的編譯器,不僅可以檢查出一般的語法錯誤,還可以檢查出雖然完全符合要求,但是卻可能存在潛在的,不易發現的錯誤
2.PC-lint不僅可以檢測單個文件,也可以從整個項目的角度來檢測問題,因為C語言編譯器固有的單個編譯,這些問題在編譯器環境下很難被檢測,而PC-Lint在檢查當前文件的同時還會檢查所有與之相關的文件,可想而知,它會對我們有很大的幫助。
3.PC-lint支持幾乎所有流行的編輯環境和編譯器,比如BorlandC++從1.x到5.x各個版本、Borland C++ Build、GCCVC、watcom C/C++、Source insight、intel C/C++等等,也支持16/32/64的平台環境。支持Scott Meyes的名著(Effective C++/More Effective C++)中說描述的各種提高效率和防止錯誤的方法。

告警消息分類

錯誤說明CC++告警級別
1-1991001-11991
語法錯誤200-299
致命錯誤300-399
告警400-6991400-16992
消息700-8001700-18993
可選信息900-9991900-19994
代碼檢查告警級別
w0 不產生信息(除了遇到致命的錯誤)
w1 只生成錯誤信息-- 沒有告警信息和其它提示信息
w2 只有錯誤和告警信息
w3 生成錯誤、告警和其它提示信息(這是默認設置)
w4 生成所有信息
函數庫頭文件的告警級別
wlib(0) 不生成任何庫信息
wlib(1) 只生成錯誤信息(當處理庫的源代碼時)
wlib(2) 生成錯誤和告警信息
wlib(3) 生成錯誤、告警和其它信息(這是默認設置)
wlib(4) 產生所有信息
一般代碼檢查功能
PC Lint能檢查出代碼的語法錯誤和可能引起程序異常執行的邏輯告警。但它更側重於後者的檢查,因為這類問題更容易被人忽略(前者通過平台編譯器去發現)。所以它的代碼檢查功能通常表現在下面幾方面:
強類型檢查:強類型檢查選項“-strong”和它的輔助(補充)選項“-index”可以對typedef定義的數據類型進行強類型檢查,以保證只有相同類型之間的變數才能互相賦值
變數值跟蹤:包括對變數值初始化,變數值,函數內變數這些情況進行跟蹤,發現其中不符合語法規範的告警
賦值順序檢查:檢查當一個表達式的值依賴於賦值的順序時,是否會出問題
弱定義檢查:檢查當宏定義、typedef名字、聲明、結構、聯合和枚舉類型這些東西可能在模塊中被過多定義且不被使用的情況。
格式檢查:檢查printf和scanf(及其家族)中的格式衝突告警
縮進檢查:檢查代碼中的縮進問題是為避免出現代碼結構不良或者大括弧的遺漏等問題
const變數檢查
volatile變數檢查