目 錄
18 9.1 Source Insight的正規表達式 ........................................ ..........
18 9 附錄:PCLint在Source Insight中的使用 ................................... ..........
17 8.6 使告警最大化 .................................................... ..........
17 8.5 選項的處理順序 .................................................. ..........
17 8.4 PCLint的預處理符 ................................................ ..........
15 8.3 強類型 .......................................................... ..........
15 8.2 匯編(非C、C++)文件的處理 ..................................... ..........
14 8.1 庫模塊文件的使用 ................................................ ..........
14 8 各種使用說明 ......................................................... ..........
13 7 編譯器相關選項 ....................................................... ..........
9 6 其它選項 ............................................................. ...........
8 5 格式輸出選項 ......................................................... ...........
5 4 標志選項 ............................................................. ...........
5 3 冗余信息選項 ......................................................... ...........
4 2 變量類型大小選項 ..................................................... ...........
3 1 錯誤信息禁止選項 ..................................................... ...........
PCLint選項詳解
第2頁,共19頁以下為PC-lint for C/C++ (NT) Ver. 7.50v版本配置參數的詳細解釋及用法舉例。
LINT選項可以放在注釋中,例如:
/*lint option1 option2 ... optional commentary */ 選項可以有多行
//lint option1 option2 ... optional commentary 選項僅為一行
選項間要以空格分開,lint命令一定要小寫,並且緊跟在/*或//后面,不能有空格。如果選項由
類似於操作符和操作數的部分組成,例如-esym(534, printf, scanf, operator new),其中最后一個選
項是operator new,那么在operator和new中間只能有一個空格。
選項還可以放在宏定義中,當宏被展開時選項才生效。例如:
#define DIVZERO(x) /*lint -save -e54 */ ((x) /0) /*lint -restore */ 允許除數為0而不告警
LINT的選項很多共有300多種,大體可分為以下幾類:
1 錯誤信息禁止選項
說明: “-” : 表示禁止輸出相應的錯誤消息
“+” : 表示允許輸出相應的錯誤消息
“#” : 允許使用通配符“?”和“*”
除了900級別(900-999)和1900(1900-1999)級別的告警消息缺省是關閉的外,其它的告
警消息缺省均是打開的。
-e# : 禁止輸出告警號為#的消息
-e(#) : 對於下一個表達式禁止輸出告警號為#的消息
!e# : 在本行禁止輸出告警號為#的消息
--e(#) : 對當前的整個表達式禁止輸出告警號為#的消息
-eai : 整型數子類參數不一致,如:char/short vs. int
-ean : 名義上的參數不一致,如:字節數相同(都是32位)的int和long等
-eas : 參數大小相同,如:如果int和pointer字節數相同,那么如果f()的參數應該
是pointer的話,用f(3)整型數調用就會報錯,設置此項可以關閉告警
-eau : 參數類型一致,但是符號類型不一致,如:unsigned int和int
以上四個選項主要用於非原型的舊風格的C語言程序。其中eas涵蓋了ean和eau。
-efile(#,<File>) 對指定文件禁止輸出告警號為#的消息
-efunc(#,<Func>) 對於函數Func,禁止輸出告警號為#的消息
-elib(#) : 對於庫頭文件禁止輸出告警號為#的消息
-elibsym(#): 對於所有庫頭文件中的符號禁止輸出告警號為#的消息,此告警不同於
elib之處在於-elib(#)僅僅當分析頭文件時不輸出相應的告警,如果你在源程
序中使用了會導致告警#的變量等,在分析源程序時還是會告警的,因此要
想完全的關閉該告警,使其在頭文件和源文件中均不出現,請使用本選項
PCLint選項詳解
第3頁,共19頁-emacro(#,Symbol) 對於宏Symbol,當其展開時禁止輸出告警號為#的消息
-emacro((#),Symbol)對於宏Symbol,當其展開時禁止輸出告警號為#的消息,與上一個選項的
區別是它會先將宏加上一對括號再判斷,如:#define DIVIDE( n , m ) n / m
那么它會在宏展開時將n / m看作( n / m )來處理。用處不是很大。
-epn : 名義上的指針不一致,如:對於指向字節數大小相同的變量的指針
-eps : 指針指向的類型不同,但大小字節數相同
-epu : 指針指向的類型僅僅符號不一致
-epp : 指針指向的類型不確定
-epuc : 指針指向的字符串類型,其符號不一致
-epnc : 指針指向的字符串類型,僅僅名義上不同
-esym(#,Symbol) 對於指定的符號Symbol(可以是變量名、函數名等),禁止輸出告警號為
#的消息,符號Symbol中可以使用通配符*和?。-e#的級別比較高,因此對
於-e714 +esym( 714,alpha ),后一個選項將不起作用
-etd(<TypeDiff>) 對於TypeDiff類型,忽略不同地方對其的類型定義不同,用於舊風格C
-w<Lev> : 設置告警級別(0,1,2,3,4),0表示不打印任何告警消息,用於先關閉所有告
警,然后打開部分告警
-wlib(<Lev>) 對庫(文件)設置告警級別
2 變量類型大小選項
說明:不同的目標機、編譯系統變量類型的的大小(如短整型變量、整型變量等)會有所不
同,該類選項用於為目標機設置變量類型的大小。
-sb# : 設置一個字節的比特數,缺省值為8
-sc# : sizeof(char),缺省值為1
-slc# : sizeof(long char),缺省值為2
-ss# : sizeof(short),缺省值為2
-si# : sizeof(int),缺省值為4
-sl# : sizeof(long),缺省值為4
-sll# : sizeof(long long),缺省值為8
-sf# : sizeof(float),缺省值為4
-sd# : sizeof(double),缺省值為8
-sld# : sizeof(long double),缺省值為16
-sp# : sizeof(all pointers),缺省值為4和6
-spN# : size of near ptrs,缺省值為4
-spF# : size of far ptrs ,缺省值為6
-spND# : size of near data pointer,缺省值為4
-spNP# : size of near prog pointer,缺省值為4
PCLint選項詳解
第4頁,共19頁-spFD# : size of far data pointer,缺省值為6
-spFP# : size of far prog pointer,缺省值為6
-spD# : size of data ptrs,缺省值為4和6
-spP# : size of program ptrs,缺省值為4和6,near為4,far為6
-smp# : size of all member ptrs,缺省值為4
-smpD# : size of member ptr (data),缺省值為4
-smpP# : size of member ptrs (prog),缺省值為4
-smpNP# : size of member ptr (Near Prog),缺省值為4
-smpFP# : size of member ptr (Far Prog),缺省值為4
-sw# : size of wide char,缺省值為2
3 冗余信息選項
說明: “-” : 表示僅輸出到文件stdout
“+” : 表示同時輸出到文件stdout和stderr
使用格式 : {-+}v[oish#][mf<int>]
冗余信息指的是LINT過程中產生的一些與編譯過程有關的信息,而不是指真正的告警信息、
錯誤信息等。是否生成這些信息可以通過-v和+v選項來決定。+v是生成這些信息,-v是關閉這些信
息,這組選項中除+v外,其它所有選項都可以關閉+v選項。
以下選項可以出現0或多個:
o : 輸出命令行和注釋行中包含的配置
i : 輸出所使用的配置文件名(lnt文件)
s : 輸出內存消耗數量
h : 輸出嚴格的類型層次圖(輸出結果類似於DOS命令tree的結果)
# : 附加文件ID,用於判斷文件是否相同
以下選項一次只能出現一個:
m : 輸出模塊名(缺省就是輸出模塊名)
f : 輸出所有文件名(此選項包含m選項)
<int> : 每條消息打印為int行(此選項包含f選項)
4 標志選項
說明: “+” : 表示打開該開關(即設置標志為1)
“-” : 表示關閉該開關(即設置標志為0)
“++” : 表示增1
“--” : 表示減1
標志選項用於打開或關閉對某類語法情況的處理。后面兩個選項(++和--)用於你想在局部改
變開關取值,而不影響全局設置的情況。
PCLint選項詳解
第5頁,共19頁例如你可以這樣使用:
/*lint ++flb */
int printf( );
/*lint --flb */
fab : 支持縮略式結構,如:s.a.b如果不會引起歧義的話,可以縮寫為s.b。很少
有編譯器支持這種功能。缺省值為OFF
fai : 指針參數是否初始化(不初始化將告警),缺省值為ON
fan : 是否支持匿名聯合,用於結構變量的說明,對C缺省值為OFF,C++為ON
fas : 是否支持匿名結構,類似於fan,缺省值同上
fba : Bit位尋址能力(可訪問性),缺省值為OFF
fbc : 是否支持布爾類型常量0b...,缺省值為OFF
fbo : 是否允許bool, true, false關鍵字,缺省值為ON
fbu : 是否強制比特位域為無符號數,缺省值為OFF
fcd : 是否區分cdecl說明符,缺省值為OFF
fce : 遇到#error時是否繼續運行,缺省值為OFF
fcp : 強制使用C++處理方式,缺省值為OFF
+fcp表示其后的模塊文件將被強制作為C++程序對待處理。-fcp表示按照擴展名使用缺省的處
理方式。例如:lin +fcp a1.c a2.c a3.c -fcp a4.c a5.cpp,其中a1.c、a2.c和a3.c將被作為C++程序進
行Lint,而a4.c和a5.cpp按照缺省的方式(C和C++)進行Lint。
fct : 生成標簽(說明:結構名、枚舉名就是一種標簽 Tag),缺省值為OFF
fcu : char型總是作為unsigned,缺省值為OFF
fdc : C++中是否區分char、unsigned char、signed char,缺省值為ON
fdh : 是否為頭文件名附加'.h',缺省值為OFF
fdi : 是否從頭文件目錄(而非當前目錄)開始搜索頭文件,缺省值為OFF
fdl : 是否指針之差為long型數,缺省值為OFF,即int型數
fdr : 檢查函數的返回模式(返回值是否被使用等,舊風格的C),缺省值為OFF
feb : 是否允許枚舉類型做位域,缺省值為ON
fem : 是否支持非緊靠式修飾符,如:pascal int f();和int pascal f();對於某些編譯
器只支持后一種緊靠式說明,缺省值為OFF
ffb : For語句生成代碼塊(Block),缺省值為ON
ffd : 是否使float拓寬為等於double,缺省值為OFF
ffn : 輸出文件的全路徑名,缺省值為OFF
ffo : 在生成每條告警后是否調用fflush()立即存入文件,缺省值為ON
fhd : 是否采用增強型類型定義層次判斷,缺省值為ON
fhg : 是使用圖形字符(ON)還是ASCII字符(OFF)來顯示類型層次圖,缺省
值為ON
PCLint選項詳解
第6頁,共19頁fhs : 是否自動將基於typedef的強類型形成類型層次,缺省值為ON
fhx : 強索引類型是否通過類型層次相關,缺省值為ON
fie : 等同枚舉類型和整型,缺省值為OFF
fil : 是否對標號進行縮排檢查,缺省值為OFF
fim : 能否使用-i包含多個包含路徑,缺省值為ON
fiq : 忽略缺省的限定詞,如Large模式下的far就是可忽略的,缺省值為OFF
fis : 整型常量是否有符號,如對常量0xFFFF,此標志為On時解釋為負數,
Off時解釋為正數,缺省值為OFF
fkp : 是否使用K&R預處理方式(非ANSI的C標准),缺省值為OFF
flb : 是否強制將其作為庫程序代碼對待,缺省值為OFF
flc : 是否允許使用long char類型變量,缺省值為OFF
flf : 是否分析庫函數定義(C++),缺省值為OFF
fll : 是否允許使用long long int類型變量,缺省值為OFF
fln : 是否不忽略#line命令,缺省值為ON
fmd : 是否允許多次重復定義,缺省值為OFF
fna : (C++)是否允許使用操作符new[],缺省值為ON
fnc : 是否允許使用嵌套注釋,缺省值為OFF
fnt : (C++)class類中是否允許嵌套使用struct,union等,缺省值為ON
fod : 生成Lob文件時是否輸出所有對象聲明用於模塊間檢查,缺省值為OFF
fol : 生成Lob文件時是否輸出所有庫中對象,缺省值為OFF
fpa : 退出前是否暫停,缺省值為OFF
fpc : 指針強制類型轉換后是否保留左值特性,缺省值為OFF
例如:使int指針pi指向下一個字節的地址,標准用法是( * ( char ** ) &pi ) ++;一種普遍的簡化
方法是(( char * ) pi ) ++;但是后面一種用法對於標准C來說強制類型轉化使pi失去了左值特性,因此
無法對其進行++操作,如果你的編譯器支持后一種寫法,請將本開關置為ON。
fpm : 是否抑止“缺失精度”告警,缺省值為OFF
fpn : 是否假定所有指針均有可能為NULL,因此如果使用指針前不判斷是否為
NULL的話就會告警,缺省值為OFF
fps : 宏參數是否能在字符串內進行替換,用於非ANSI程序,對於ANSI標准有
#連字符可以完成同樣功能,缺省值為OFF
frb : 是否自動為fopen調用增加參數"rb",缺省值為OFF
fsa : 是否允許結構賦值,缺省值為ON
fsc : 是否將字符串作為const char *類型,缺省值為OFF
fsh : 是否使用共享式讀文件打開,缺省值為OFF
fsu : 是否將字符串作為unsigned類型,缺省值為OFF
ftf : 是否處理未加工的模板函數,缺省值為OFF
PCLint選項詳解
第7頁,共19頁ftr : 是否將文件名截斷為8.3格式,缺省值為OFF
ful : 是否支持unsigned long類型,缺省值為ON
fva : 是否將函數當作可變長參數函數處理,缺省值為OFF,
此參數為ON時表示不對該函數進行參數檢查,這對於printf(),fprintf()等函數可以抑止參數告
警(如515、516告警)
fvo : 是否支持void類型,缺省值為ON
fvr : 返回方式是否可變(如不使用返回值等),缺省值為OFF
fwc : 是否將wchar_t作為標准類型,缺省值為OFF
fwu : 將wchar_t當作unsigned類型,缺省值為OFF,此選項設為ON將導致+fwc
fxa : 嚴格的數組類型檢查,即對於數組參數只能傳類型相同的數組實參,缺省
值為OFF
fxc : 嚴格的字符類型檢查,即對於char不能轉化為int去匹配,缺省值為OFF
fxf : 嚴格的float類型檢查,即對於float不能轉化為double去匹配,缺省值為OFF
fxs : 嚴格的short類型檢查,即對於short不能轉化為int去匹配,缺省值為OFF
以上四個選項只用於非原型類的舊風格函數。
fzl : 定義sizeof()返回值為long,缺省值為OFF
fzu : 定義sizeof()返回值為unsigned,缺省值為ON
5 輸出格式選項
1.控制消息高度,使用格式為:-h[abfFrsm/<M>/]<I>]<ht>(缺省值為 -ha_3)
<ht> : 為消息高度,取值范圍為1-4
<I> : 為每條消息的位置指示符,如果<ht>為2,該指示符將與消息同行顯示,如
果<ht>大於2,該符號將單獨在一行顯示
a : 表示將位置指示符放在源程序中錯誤行的前一行(<ht>必須為3或4才行)
b : 表示將位置指示符放在源程序中錯誤行的下一行(<ht>必須為3或4才行)
f : 消息中總是包含文件信息
F : 消息中總是包含文件信息,對於無法定位的行號使用MaxLine+1
r : 對於針對源文件中同一行的多個錯誤消息,每個都重復顯示行號
s : 消息間空一行顯示
m/<M>/ : 恢復對宏定義的顯示,<M>為宏定義的指示符,缺省為“#”
mn : 對於源文件中由宏使用產生的錯誤,不顯示該宏的定義
2.控制消息寬度,使用格式為:-width(<Width>,<Indent>)(缺省值為 -width(79,4))
3.控制消息格式,使用格式為:-format=...(對於消息高度為4的情況,此選項無用。應該使用
-format4a和-format4b)
%f : 文件名
PCLint選項詳解
第8頁,共19頁%m : 告警消息文本
%n : 告警號
%t : 消息類型(Error,Warning等)
%l : 行號
%c : 列號
%C : 列號+1
%(...%) : 如果錯誤發生在一個文件內,那么包含...信息
\n : 回車
\t : Tab鍵
\s : 空格鍵
\a : 告警(ASCII 7)
\q : 引號(“”)
\\ : 反斜線(' \ ')
6 其它選項
-A : 嚴格使用ANSI C/C++處理方式
-/+b : 抑止/重定向標語行(包括PCLint的版本號和Copyright信息)到stdout,此
選項必須放在命令行而不能放在配置文件中
-c<code> : 指定一個特定的編譯器,如果你使用一個編譯器的配置文件如co-code.lnt
,那么與該編譯器相關的-c<code>選項會自動設置上
-/+cpp(extension) 減少/增加以 .ext 作為擴展名的文件作為C++文件進行Lint處理。例如:
+cpp(cc)表示以cc為擴展名的文件(如a.cc)將被作為C++文件對待
-d<name>[=<value>]
定義預處理用的宏,這些宏將在當前模塊及其后續模塊中有效。如果沒有=value,將缺省為其
賦值為1,如果只是沒有value而有=的話,將缺省賦值為空。例如:
-dDOS
-dalpha=0
-dX=
等同於如下定義:
#define DOS 1
#define alpha 0
#define X
-D<nm>[=<val>][;<nm>[=<val>]]...
定義宏標號集合,此選項一次可以定義多個宏,其余同上。使用+d... 或 +D...是同樣的意思,
而且定義更精確。(原文:except it locks in definitions)
PCLint選項詳解
第9頁,共19頁+ext(ext[,ext]...)
指定PCLint能夠處理的文件擴展名及處理順序。缺省值為 +ext(lnt,cpp,c)。就是說對於沒有帶
擴展名的文件將按照這個順序進行查找匹配。如:lint alpha,將順序查找alpha.lnt、alpha.cpp、
alpha.c。注意Unix下,擴展名是區分大小寫的。
-father(Parent,Children)
-parent選項的更嚴格的形式。即對於強類型,Child類型可以賦值給Parent類型,但是反過來不
行。其它的作用與-parent參數一樣。
-function(f0,f1[,f2]...)
使函數f1 (, f2 ...)象f0一樣。由於PCLint對於一些系統調用的函數有特殊處理,如對於fopen函
數會檢查其兩個參數是否為NULL。而這個選項的目的是讓你的函數象這些系統函數一樣,接受這
些特殊的檢查。具體可參看隨盤的手冊。
-header(file) 強制PCLint在每個模塊的開始讀入頭文件file
-i<directory> 指定包含文件的路徑,-i-用於取消以前用-i建立的所有包含路徑
-ident(<chars>) 增加可以作為標志符的字符
-idlen(<n>[,opt])
報告兩個標志符前n個字符相同,其它不同的情況。一般對於linker程序,預處理程序和編譯器
程序,能識別的標志符的長度都是有限的。因此用該選項可以找出那些在可識別的范圍內(如標志
符最長只能為8個字符)其實是同名的標志符。opt可以取值為x、p和c。x表示external,用於
linker時模塊間的符號;p表示preprocessor,用於預處理時使用的符號;c表示compiler,用於編譯時
的符號。如果省略opt參數,表示對所有符號進行檢查。
-incvar(name) 改變INCLUDE環境變量的名字為name
-index(flags,ixtype,type(s))
此選項是對-strong選項的補充,並與該選項聯合使用。它指定ixtype為type類型數組或指針唯
一合法的索引(下標)類型。ixtype和type都是用typedef定義的類型。flags取值為c或d。
c 表示除了ixtype還允許常量作為索引(下標)
d 表示允許不用ixtype來指定數組的維數(大小)
+libclass([all,angle,ansi,foreign]...) 設定頭文件作為庫頭文件的判定條件
angle 所有用“<>”括起來的頭文件是庫頭文件
foreign 所有在非當前目錄的頭文件是庫頭文件,注意:如果#include包含了一個完整的路
徑名,那么此頭文件將不屬於foreign類型。如果你想將此頭文件當作庫頭文件處
理,可以使用<>或者用+libh
ansi 標准的ANSI C/C++庫頭文件,這些頭文件作為庫頭文件,包括:
PCLint選項詳解
第10頁,共19頁assert.h limits.h stddef.h ctype.h locale.h
stdio.h errno.h math.h stdlib.h float.h
setjmp.h string.h fstream.h signal.h strsteam.h
iostream.h stdarg.h time.h
all 所有頭文件都作為庫頭文件處理
缺省值為+libclass( angle , foreign ),注意這個選項不能積累,即只有最后一個才生效。
-/+libdir(directory[,...]) 減少或增加庫路徑,其中的所有頭文件都不是或是庫頭文件。注
意:即使+libdir(c:\compiler),對於#include "C:\compiler\i.h",仍然不當作庫頭文件處理,因為這里
用了全路徑名,沒有進行搜索。此時只有對在Include目錄中搜索出來的頭文件才算是庫頭文件。
-/+libh(header[,...]) 減少或增加庫頭文件,此選項是可以積累的。
-library 設置庫源程序標志,例如:在開始部分用/*lint -library */說明的源
程序(Module),將被當作庫源程序(Library Module)
-limit(<n>) 設置告警消息條數的上限(n<64000),缺省沒有限制
-/+lnt(ext) 減少或增加以ext為擴展名的文件作為lnt文件對待處理
-lobbase(filename) 建立Lob的基本文件用以在頭文件很大時節省Lob文件的空間
例如:c1.cpp和c2.cpp都是比較小的,但是都包含了頭文件gui.h,而gui.h文件很大,那么我們
可以用如下命令:
lint -u c1.cpp -oo
lint -u -lobbase(c1.lob) c2.cpp -oo
這樣,c2.lob文件中就只保存c1.lob中沒有的東西,可以節省很多的硬盤空間。
-/+macros
增大宏的存儲空間,一般情況下宏的最大存儲空間為4096字節,每使用一次+macros將此上限
乘以2,而使用一次-macros將使此上限除以2。這個選項必須在分析第一個模塊文件時就進行設
置,否則如果設置得太晚的話,將會導致設置無效。
-maxopen(<n>) 設定文件可打開的最大次數
-mS -mD -mL -mP (內存)小模式,僅大數據,大數據和程序,僅大程序
-od[options](filename) 輸出聲明(包括原型)到文件filename,+od表示append方式
options可以取值為:
f : 僅僅輸出函數
i : 包括內部函數
s : 包括結構定義
<width> : 指定最大顯示寬度
PCLint選項詳解
第11頁,共19頁-oe(filename) 重定向stderr到文件filename,+oe表示append方式,可用於查看Help
-ol(filename) 輸出庫信息到文件filename
-oo[(filename)] 輸出到LOB文件
-os(filename) 重定向stdout到文件filename,+os表示append方式,確保-os參數在要Lint的
文件之前,否則會丟失Lint信息
-p[(n)] 僅進行預處理,可用於調試PCLint的預處理是否與預期一致,n表示最大輸
出寬度
-parent(Parent,Children) 增加一個父子關系到強類型層次樹,其中父類和子類可以不是從同
一個基本類型派生出來的。但是層次樹中不允許出現循環。
-/+ppw(word[,...]) 減少或增加預處理的命令字,如+ppw(ident)將導致PCLint將#ident作為一個
預處理命令字識別,並忽略該行而不報錯(不認識)
+pragma(name,action) 聯系 action 和 name,用法及含義不祥
-printf(#,id[,...]) 指定id等函數類似於printf函數,#為數值時表示該函數的格式在第#個參數
中說明,第#個參數之后的參數被期望為在大小和類型上符合格式中的說
明,同時,#中可以使用字符“w”,表示指針參數必須為far類型。如:
-printf( w2 , wsprintf)
-restore 恢復錯誤禁止狀態
-/+rw(word[,...])
去掉或增加保留字,對於某些編譯器特有的保留字,可以使用此選項讓PCLint忽略該字。否
則,PCLint會無法正確分析。(*ms)表示所有微軟的關鍵字。例如:
unsigned char *restrict pch;其中restrict為某編譯器特有的保留字。如果不做處理的話,
PCLint將不能正確識別,告警pch沒有定義。使用參數+rw(restrict)之后,PCLint能夠正確忽略保留
字並完成對變量pch的說明處理。
-save 保存當前的錯誤禁止設置
-scanf(#,id[,...]) 指定id等函數類似於scanf函數,其格式在第#個參數中說明,對這樣的函
數,第#個參數之后的參數要在類型和大小上與格式一致。
-sem(name,sem[,sem]...) 將一個語義集與函數聯合起來
-size(flags,amount) 報告大集合體,flags為 a 表示auto變量,為 s 表示static變量
-strong(Flags,Type(s))
每個Type類型作為一個帶有Flags特性的強類型。注意,此選項必須在typedef之前生效。注
意:強類型必須是用typedef定義的類型。Flags取值為:
A 在賦值給強類型時(賦值、返回值、參數傳遞和初始化)發出告警
i 忽略初始化
r 忽略Return語句
p 忽略參數傳遞
PCLint選項詳解
第12頁,共19頁a 忽略賦值操作
c 忽略將常量賦值(包括整數常量、常量字符串等)給強類型的情況
z 忽略Zero賦值,Zero定義為任何非強制轉換為強類型的0常量。例如:0L和(int)0都
是Zero,但是(HANDLE)0當HANDLE是一個強類型的時候就不是Zero。(HANDLE *)0也不是。
J 當強類型與其它類型進行如下的二進制操作時進行檢查
e 忽略==、!=和?:操作符
r 忽略>、>=、<和<=
o 忽略+、-、*、/、%、|、&和^
c 忽略該強類型與常量進行以上操作時的檢查
z 忽略該強類型與Zero進行以上操作時的檢查
X 當一個強類型的值被賦值給其它類型時發出告警
B 假定每一個Bolean類操作符都將返回一個與Type類型兼容的返回值,在所有需要判斷
Bolean值如if語句的地方都要檢查結果是否符合這個強類型,否則告警。對於后半句主要是用於如
下情況,if(a)...當a為int時,將產生告警,因為int與Bolean類不兼容,所以必須改為if(a != 0)...。
b 僅僅假定每一個Bolean類操作符都將返回一個與Type類型兼容的返回值
l 庫標志,當強類型的值作為參數傳遞給庫函數等情況下,不發告警
f 與B或b連用,表示抑止對1bit長度的位域是Boolean類型的假定,如果不選該項表示1bit長度
的位域被缺省假定為Boolean類型。
如果Flags部分為空,表示所有Types都是強類型,但是除了對聲明進行檢查之外,不指定任何
其它的檢查。如果Types部分為空,表示除了用別的-strong選項說明的強類型之外的所有用
typedef定義的類型都是強類型,且具有Flags屬性。例如:
-strong(A) -strong(Ac,Count)或-strong(Ac,Count) -strong(A)都是表示對Count類型不做強類型檢
查,但是對於其它用typedef定義的類型都是強類型並進行賦值檢查。
-t# 設置Tab鍵的大小為#,缺省值為8
-u 單元檢查,抑止許多模塊間問題告警,如526、552等
-unreachable
表明程序中的一個點是不可達的,用於抑止某些告警,如:
int f(n)
{
if (n) return n;
exit(1);
//lint -unreachable
}
此處用以防止PCLint認為exit語句后執行了一個隱含的return,而隱含的return一般是不返回值
的,這就會出問題,因為聲明要返回值int。所以使用此選項抑止此告警。
PCLint選項詳解
第13頁,共19頁-u<name> 取消對name的定義,對后續的模塊文件生效
--u<name> 忽略以前及以后對name的定義
-w<level> 設置告警級別,取值范圍(0,1,2,3,4)
-w0 無任何消息(致命錯誤Fatal Errors除外)
-w1 僅錯誤消息(Errors),無告警(Warnings)和提示(Informationals)
-w2 僅錯誤消息和告警消息
-w3 錯誤、告警和提示消息(這是缺省值)
-w4 所有消息
-wlib(<level>) 設置對庫文件的告警級別,取值范圍及含義同上,缺省級別為4
-wprintf(#,id[,...]) -printf選項的寬字符(wide char)版本
-wscanf(#,id[,...]) -scanf選項的寬字符(wide char)版本
-zero[(#)] 對於所有錯誤號大於#的,都設置退出碼為0,這在用make文件時很有用
-$ 允許標志符中使用$作為標志符的一部分
7 編譯器相關選項
-a#<predicate>(tokens) 使 #predicate (tokens)為True,用於Unix
-d<name>()[=<value>] 用於定義類似於函數的宏
-#d<name>[=<value>] 定義標號,僅用於 #include
舉例如下:
-#dtime=Filename 不會影響time在非Include以外的地方作為標志符使用
#include time 某些VAX-11 C可以這樣使用Include
-overload(X) X為16進制常數,用於設置標志位,缺省值為7
bit 1 內存模式滿足優先於ANSI標准滿足。例如:int n; f(&n);將選擇void f(int const *)而
不選擇void f(int far *),因為內存模式far不滿足。
bit 2 內存模式及ANSI標准同時滿足優先於單個滿足。
bit 4 內存模式對於引用參數(&)有意義。
設置時,如果要設置哪幾個位,X就等於位數和。如:7 = 1 + 2 + 4,表示同時置為bit 1、2和
4。其余依此類推。此選項影響函數重載(Overload)的選擇。
-plus(Char) 將字符Char作為“+”對待,用於解決某些操作系統上不方便使用+的替代
-template(X) X為16進制常數,用於設置對模板處理的標志位
bit 1 當前只有這一個標志位,缺省是關的。表示對於模板基類采用積極的處理方式。一
般來說,模板基類直到實例化的時候才進行處理。但是對於某些庫,尤其是STL庫,基類必須采用
積極的處理方式。因為它們提供了模板處理時需要的名字。
_bit 1個bit寬的數據類型,使用+rw(_bit)激活
_gobble 用於忽略它本身和其后的下一個單詞,使用+rw(_gobble)激活
PCLint選項詳解
第14頁,共19頁_to_brackets 用於忽略它本身和其后用各種括號(()、[]和{})括起來的部分,使用
+rw(_to_brackets)激活
_to_semi 用於忽略它本身及其后的所有東西直到遇到分號(;)為止(包括分號),
使用+rw(_to_semi)激活
以上的三個選項,其用法相似,舉例如下:
-dinterrupt=_to_brackets //令interrupt等同於_to_brackets
+rw(_to_brackets) //將_to_brackets作為關鍵字激活,而interrupt是等同於該關鍵字的,
將導致interrupt及其后用括號括起來的部分Lint時被忽略
結果如下,將導致下面的語句被忽略:
interrupt(3)
interrupt[5,5]
interrupt{x,x}
8 各種使用說明
8.1 庫模塊文件的使用(Library Modules)
庫模塊文件用來描述函數(非原型)的參數列表,對於庫模塊文件中聲明的任何對象(不是
指C++的對象,包括結構等)都不需要在其它地方定義和使用,這一點和庫頭文件一樣。它的目的
是為了使Lint能夠處理源程序所包含的非原型的庫函數。即使對於ANSI標准的編譯器,有時候我們
也會使用到非原型的庫,這時就需要使用庫模塊文件了。舉例如下:
假設你被提供了一個圖形庫的目標文件g.lib和頭文件g.h。如果g.h包含原型,你不需要使用庫
模塊文件。如果g.h不包括原型,而你又有該庫的源程序g1.c-g25.c的話,你可以用如下命令生成
原型描述。
lint -u g*.c -od(gproto.h)
這個命令將生成所有函數和數據對象的原型到文件gproto.h中,其中不包括結構定義,如果你
的g.h文件中沒有結構定義的原型,你還需要使用-ods命令將結構定義也生成原型。然后你可以定
義你的庫模塊文件如下:
glib.c:
/*lint -library */
#include "g.h"
#include"gproto.h"
接下來你就可以用它來Lint包含該庫的源程序program了,命令如下:
lint co glib program //co為編譯器的配置文件(lnt)
為了減少處理時間,你還可以先將glib.c生成為LOB文件以加快處理。如下:
lint -u co glib -oo(glib.lob)
lint co glib.lob program
PCLint選項詳解
第15頁,共19頁8.2 匯編(非C、C++)文件的處理
如果你的工程中包含匯編代碼或其它非C、C++代碼,你必須如下處理以使得Lint不會因為這
些缺失的代碼產生誤告警。最常用的方法是創建一個頭文件來描述匯編部分的代碼,這個頭文件必
須被當作庫頭文件處理,以免PClint對其中的聲明產生告警(因為無法得到聲明的定義和使用部分
的代碼)。因此我們必須這樣使用:+libh(asm.h)。
另外如果一個變量alpha僅在匯編代碼部分被使用,Lint時會告警552,我們可以使用如下命令
抑止該告警:-esym(552,alpha)。需要說明的是,這個選項不能放在asm.h文件中,因為庫頭文件中
的選項只有在第一次該頭文件被包含時才會生效,那么這個選項對於前面處理過的源文件就是無效
的。所以該命令應該包含到配置文件中。
8.3 強類型
8.3.1應用舉例:
例一:
//lint -strong( AJXb , Bool ) //由於沒有選擇f,因此1bit字位缺省為Boolean類型
//lint -strong( AJX , BitField )
typedef int Bool;
typedef unsigned BitField;
struct foo
{
unsigned a:1 , b:2 ; //成員a和c都被缺省假定為Bool類型,b不是強類型
BitField c:1 , d:2 , e:3; //成員d和e都是BitField類型
}x; //這個例子也說明了一個變量只能是一種強類型,如c。
void f()
{
x.a = (Bool) 1; //OK,同一類型賦值
x.b = (Bool) 0; //NO,違反X規則
x.a = 0; //NO,違反A規則
x.b = 2; //OK,b不是強類型
x.c = x.a; //OK,同一類型賦值
x.e = 1; //NO,違反A規則
x.e = x.d; //OK,同一類型賦值
}
例二:
//lint -index( d , Count , Temperature )
typedef float Temperature;
PCLint選項詳解
第16頁,共19頁typedef int Count;
Temperature t[100]; //OK,因為d允許使用非Count類型說明數組大小
Temperature *pt = t ;
Count i;
t[0] = t[1]; //NO,因為沒有c,所以不允許使用常數作為下標
for( i=0 ; i<100 ; i++)
t[i] = 0.0; //OK,i是Count類型
pt[1] = 2.0; //NO,因為沒有c,所以不允許使用常數作為下標
i = pt - t ; //OK,pt - t 的結果是Count類型
說明:如果要對多維數組進行強索引類型檢查,應該使用遞歸式定義數組方式,以二位數組
Screen[25][80]的定義方式舉例如下:
/*lint -index( d , Row_Ix , Row )
-index( d , Col_Ix , Att_Char) */
typedef unsigned short Att_Char;
typedef Att_Char Row[80];//Row是一個有80個元素的數組,每個元素類型為Att_Char
typedef Row Screen[25];
typedef int Row_Ix;
typedef int Col_Ix;
8.3.2類型層次
由於一些函數需要處理一類數據類型,因此為了方便處理需要提出類型層次的概念。在類型
層次中,父類型和子類型可以相互賦值。這樣,我們處理一類相似的子類型時可以用父類型進行聲
明,這是很方便的。編程人員也是這么做的。請看windows.h中的WORD、HANDLE等聲明。類型
層次可以有任意多層。請看下面的例子:
//lint -strong(AJX)
typedef unsigned Flags; //父類
typedef Flags Flags1; //子類
typedef Flags Flags2;
#define FZERO (Flags) 0
#define F_ONE (Flags) 1
void m()
{
Flags1 f1 = FZERO; //OK,父類可以賦值給子類
Flags2 fs;
f2 = f1; //NO,兩個子類之間不能互相賦值,AX
PCLint選項詳解
第17頁,共19頁if( f1 & f2 ) //NO,兩個子類之間不能進行邏輯操作,J
f2 = f2 | F_ONE; //OK,父類和子類可以進行邏輯操作
f2 = F_ONE | f2; //OK,且父類和子類邏輯操作的結果為子類類型
f2 = F_ONE | f1; //NO,見上一個說明
}
注意:強類型檢查並不會抑止其它的檢查,如缺失精度等。一旦一個類型被說明為強類型,
就無法再改變它的強類型屬性,也不能變成非強類型。
8.4 PCLint的預處理符
_lint Lint過程中,_lint為真。可以用其使某段代碼不被Lint。可能是因為你不想Lint該段
代碼,也可能該段代碼是用匯編等其它語言編寫的,無法Lint。使用方式如下:
#ifndef _lint
...........
#endif
8.5 選項的處理順序
命令行中的選項是從左到右順序處理的,如:
lint alpha beta -idirectory
那么在Lint文件alpha和beta時並沒有包含directory目錄,因為-i命令在最后才會處理。
8.6 使告警最大化
如果我們定期的對新程序進行Lint,並且對於每次Lint的結果修改錯誤,以使告警不再出現。
那么,我們就可以使用以下措施,使告警盡可能的多,以保證代碼質量盡可能的好。
+fsc +fxa +fxc +fxf +fxs +fpn -strong(AJX) -w4
9 附錄:PCLint在Source Insight中的使用
如果你在Source Insight打開上次保存的Lint結果文件,那么如何使其與源文件鏈接起來以方便
使用呢?可以使用“Search->Parse Source Links”建立Lint結果文件與源程序的鏈接。當然你應該
首先打開相應的工程。一般在Pattern編輯框中輸入:^
\w .*,然后選擇
“File,then Line”即可完成源文件鏈接功能。對於無法鏈接的情況,可以根據你的Lint結果文件的格
式,按照下面的規則修改Pattern即可。
9.1 Source Insight的正規表達式
字符 匹配
^ (僅用於開頭) 一行的開始
. 任何單個字符
[abc] 集合abc中的任何單個字符
[^abc] 任何不屬於集合abc的單個字符,^的作用域為[]之間所有
PCLint選項詳解
第18頁,共19頁* 前面字符的0次或多次重復
+ 前面字符的1次或多次重復
\t Tab字符
\s 空格字符(Space字符)
\w 空白字符(Tab或Space字符)
$ 一行的結束
\ 恢復此表中特殊字符的原意,如:a\*b,表示匹配字符串
a*b,而不是匹配0或多個a后接一個b
它們包含的部分將作為一個組,一個正規表達式中的每個
組將有一個編號,從1開始。主要用於替換操作
以下是集合的使用及含義:
集合類型 例子 含義
[<character list>] eg. [abcde] 匹配集合內的任一字符,集合長度不限
[x-y] eg. [a-z] 匹配x到y之間(包含x和y)的任一字符,
x<y
組合使用方式 eg. [WXYa-z0-9]
PCLint選項詳解
第19頁,共19頁
