




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PAGEPAGE5第頁共234頁基本概念手冊描述的軟件有兩種方式。對于PC市場(Windows、MS-DOS、OS/2),產(chǎn)品是二進制可執(zhí)行文件格式。對于其它平臺,是C源代碼形式,名字是FlexeLint。我們在手冊的全部部分使用術(shù)語PC-lint/FlexeLint標(biāo)識所有平臺公共的行為。PC-lint/FlexeLint是一個發(fā)現(xiàn)一個模塊或多個模塊的C和C++程序的勘誤表的軟件包。它使用K&R和ANSI作為K&RC的標(biāo)準(zhǔn);它使用ANSI/ISO委員會文檔作為C++的標(biāo)準(zhǔn);很多C’99標(biāo)準(zhǔn)的特性集成到這個產(chǎn)品中,但是目前沒有支持所有的C’99標(biāo)準(zhǔn)。根據(jù)用戶程序的大小來決定總共的需要的內(nèi)存大小。尤其是,存儲的需求依賴于頭文件的大小。粗略估計,每2000行頭文件需要的內(nèi)存存儲量大約是1Mb。PC-lint包包含三個可執(zhí)行文件:一個Windows可執(zhí)行文件、一個DOS-extended可執(zhí)行文件和一個OS/232位可執(zhí)行文件。Windows可執(zhí)行文件運行在一個Windows環(huán)境下的32位控制臺應(yīng)用環(huán)境下。DOS擴展的可執(zhí)行程序運行在MS-DOS環(huán)境下,使用80386DOS擴展技術(shù)來訪問所有的存在的擴展內(nèi)存。OS/232位可執(zhí)行程序只運行在OS/2環(huán)境下。FlexeLint包主要由C源代碼組成,可以被編譯到任何系統(tǒng)。FlexeLint安裝的詳細信息可在FlexeLint包中的"FlexeLintInstallationGuide"找到。簡介PC-lint/FlexeLint發(fā)現(xiàn)C和C++程序中的怪癖、異質(zhì)、失靈和臭蟲。這樣分析的目的是發(fā)現(xiàn)這些程序中的在集成前的潛在的問題,揭示可能包含敏感的、未檢測到的錯誤的不尋常的結(jié)構(gòu)。因為它尋找?guī)讉€模塊而不僅僅是一個,它可以發(fā)現(xiàn)編譯器不能發(fā)現(xiàn)的事情。它通常比編譯關(guān)于很多細節(jié)更愛挑剔。一個例子考慮下面的C/C++程序(我們故意使這個例子小巧和可理解):1:2:char*report(shortm,shortn,char*p)3:{4: intresult;5: char*temp;6: longnm;7: inti,k,kk;8: charname[11]="JoeJakeson";9:10: nm=n*m;11: temp=p==""?"null":p;12: for(i=0;i<m;i++)13: {k++;kk=i;}14: if(k==1)result=nm;15: elseif(kk>0)result=1;16: elseif(kk<0)result=-1;17: if(m==result)returntemp;18: elsereturnname;19:}對于大多數(shù)的編譯器來說,它是一個有效的C(或C++)程序。但是,PC-Lint將會報告很多精細的錯誤。在第8行分配給name[11]字符串覆蓋null字符;在第10行的乘法丟失精度,盡管long比int長;第11行的比較是有缺陷的;第12行的變量kI沒有被初始化;第15行的變量kk沒有被令人信服地初始化;第17行的變量result可能未初始化;第18行,可能返回一個auto的地址;在小程序中大多數(shù)程序者可以容易地標(biāo)識出這些問題,但是如果程序是幾萬行、幾百萬行,這種工作對于機器來說更合適,而不是人。對C++的lintC++是一個非常特別的語言。不僅是計算機作者的RayDuncan稱這種語言:“是創(chuàng)建的最神秘和最奇異的語言之一”。雖然如此,如果C++不存在,它將被創(chuàng)造出來。盡管C是一個非常強大的系統(tǒng)程序語言,但是它沒有象Fortran般復(fù)雜的數(shù)字,象Basic般復(fù)雜的字符串,象Smalltalk的對象或Pascal般的邊界檢查。對于C++,你也沒有這些但是你有更重要的事情...有能力創(chuàng)建這些,并且可能需要的特殊的問題域的許多其它程序結(jié)構(gòu)。有了這些力量,將有一些混亂、不計后果的騙局、悲傷的失望、言過其實的要求、總體的拒絕和極端的精神歡快。作者相信,及時地,語言和它的能力將能被更好理解,它的陷井和缺陷將更容易被識別。我們希望PC-lint/FlexeLint能對這些做出貢獻,尤其是后者。Lint的最初理由是松散地相關(guān)的K&RC語言檢查和通過提供模塊內(nèi)的嚴(yán)格類型檢查和幾個模塊間的交叉檢查滿足這兩個需要的多模塊(獨立編譯的)的大型語言的檢查。ANSIC,某些擴展,和C++,更多的擴展,提供嚴(yán)格的類型檢查。指針不能再化裝成int或其它指向的類型;enum不能自由地混合int;函數(shù)需要原型,通過名稱毀壞,原型必須模塊間一致。甚至寬松的類型printf()和scanf()能能被它們安全的類型iostream.h中的cout和cin代替。那么lint要做什么呢?當(dāng)編譯器技術(shù)進化到能保證發(fā)現(xiàn)lint十年前能夠發(fā)現(xiàn)的那種錯誤時,lint工具也在進化。粗略的估計,1985年的PC-lint版本可以發(fā)現(xiàn)27個警告和9和提示信息進化到目前的版本,可以發(fā)現(xiàn)229個警告和162個提示信息。雖然幾個信息不再和C++代碼相關(guān),但是大多數(shù)仍然相關(guān)。例如,表達式分析,包括尋找不經(jīng)常使用的聯(lián)合操作符,賦值問題的順序,丟失精度,有符號/無符號不匹配,不尋常的常量,可疑的比較,不尋常的縮排,可疑的截斷,非故意的名稱隱藏,可疑的初始化,不適當(dāng)?shù)氖褂弥赶蜃詣幼兞亢蜔o規(guī)則宏的指針。盡管C++的很多復(fù)雜的特性,它仍然能產(chǎn)生多蟲的的程序。C++的類型檢查仍然沒有Pascal嚴(yán)格,但是使用PC-lint/FlexeLint的嚴(yán)格的類型檢查選項(見章節(jié)8.嚴(yán)格的類型)可以做到任意的嚴(yán)格。未初始化變量仍然是C++的一個問題。我們最初地對初始化變量簡單掃描,被替換為復(fù)雜地對數(shù)據(jù)流的分析,目標(biāo)是發(fā)現(xiàn)未覆蓋的路徑,導(dǎo)致變量使用前沒有初始化。見章節(jié)9.1初始化跟蹤.。用我們介紹的7.00版本,內(nèi)部語句的數(shù)值跟蹤,變量值和成員值能被記住和推論出來。如果以后,這些值對于特定的上下文是不合適的,例如,它們能導(dǎo)致超出范圍的下標(biāo)或訪問一個NULL指針,給出一個適當(dāng)?shù)男畔?。見章?jié)9.2數(shù)值跟蹤。作為一個啟動技術(shù),數(shù)值跟蹤被用來檢查到大量標(biāo)準(zhǔn)庫函數(shù)的調(diào)用。附加地,這些檢查可以轉(zhuǎn)移到用戶函數(shù)。見章節(jié)10.1函數(shù)模仿(-function)。PC-lint/FlexeLint能檢查多個模塊。甚至將導(dǎo)致程序神秘的行為的模塊間的所有函數(shù)的原型和聲明不匹配。全局?jǐn)?shù)據(jù)可能被初始化或沒有被訪問;原型可能被不曾預(yù)料到的轉(zhuǎn)換;等等。至少,宏、枚舉常量、聲明等等,可能仍未使用或多于地聲明。通常這些不一致將被警告到一個更嚴(yán)重的問題。一些C++的特性導(dǎo)致它們的一些靜態(tài)分析可能C沒有。數(shù)據(jù)成員的值可以被跟蹤,最少在成員函數(shù)內(nèi)是這樣。構(gòu)造器能被假定原始的數(shù)據(jù)允許我們報告使用沒有初始化的數(shù)據(jù)成員。析構(gòu)器允許我們報告沒有刪除的指針。最后,C++提供足夠復(fù)雜的(某些保守的情況下)設(shè)備容易的被獲得,尤其對于初學(xué)者來說。斷言用戶正常使用存在文獻[12,13,17,19,20,21,22],很多這些該和不該的集成到這個包中。簡單的測試決定是否這個lint或任何其它lint是有用的,僅僅用于你的程序,并看看發(fā)生了什么。語言定義Kernighan&Ritchie(K&R)描述了C程序語言作為早期的事實標(biāo)準(zhǔn)。由Harbison&Steele提供了這個杰出的標(biāo)準(zhǔn)說明和現(xiàn)有實踐。在19世紀(jì)八十年代,ANSIC委員會(X3J11)開發(fā)了一個C標(biāo)準(zhǔn),向上支持K&R(它的其中一個原則是“不要打斷工作代碼”)。大多數(shù)賣主接受了這個標(biāo)準(zhǔn)。ISO接受ANSIC定義和作者K&R、H&S在ANSI標(biāo)準(zhǔn)上做的一些令人尊敬的工作。最近,標(biāo)準(zhǔn)被更改和修正,名字為C99。和C標(biāo)準(zhǔn)的努力齊頭并進,BjarneStroustrup和其它人“加上封裝”加強了C語言,尤其在抽象類型和面向?qū)ο蟮某绦蚍矫?。這個加強的版本,名為C++,得到C的在1991年開始的ANSI(X3J16)和ISO(WG21)團體和標(biāo)準(zhǔn)的廣泛的支持。對于標(biāo)準(zhǔn)的基礎(chǔ)文檔的努力是ANSIC標(biāo)準(zhǔn)和有注解的C++引用手冊(ARM).這些努力導(dǎo)致對于C++國際的標(biāo)準(zhǔn)。對于C模塊,PC-lint/FlexeLint支持C的C89定義和支持和C89不沖突的K&R定義。它也支持對于特定編譯器的通用擴展。見章節(jié)12.非標(biāo)準(zhǔn)擴展,章節(jié)5.8編譯器適應(yīng)和章節(jié)13.預(yù)處理器。為在通用擴充的更多的信息。我們逐漸地合成C99的大部分標(biāo)準(zhǔn)作為需要的基礎(chǔ)。對于C++,PC-lint/FlexeLint完全支持國際標(biāo)準(zhǔn)。PC-LINT開始FlexeLint用戶:開始和使用FlexeLint依賴于你的操作系統(tǒng)和編譯器。請看伴隨這個文檔的FlexeLint的安裝注意事項。安裝這一部分適合于Windows95、Windows98、WindowsME、WindowsNT和Windows2000。對于其它操作系統(tǒng)見章節(jié)3.7其它操作系統(tǒng)。SETUP是一個傳統(tǒng)的setup/installation程序,將確定目標(biāo)驅(qū)動器是否是有足夠的空間,并把文件copy到你選擇的驅(qū)動器。我們將把這個目錄作為安裝目錄。安裝后,將會有下列部分:lint-nt.exe――PC-lint可執(zhí)行文件;config.exe――PC-lint的配置文件;readme.txt――手冊的附錄;pc-lint.pdf――輕便數(shù)據(jù)格式的操作手冊;pr.exe――一個方便的打印工具;msg.txt――我們消息描述的ASCII翻譯;unwise.exe――一個卸載程序;install.log――一個安裝日志;Lnt\――一個子目錄,包含...co-lnt――對特定編譯器的編譯選項文件;co.lnt――一個通用的編譯器選項文件;sl-c――對non-ANSI編譯器的標(biāo)準(zhǔn)庫模塊;sl.c――對non-ANSI編譯器的通用的標(biāo)準(zhǔn)庫模塊;env-lnt――對不同環(huán)境下(包括Microsoft'sVisualStudio和不同的編輯器)的選項文件;lib-lnt――對特別的庫的選項文件;au-lnt――對作者推薦的檢查的選項文件;Test\――一個包含不同的測試文件的子目錄。見章節(jié)3.3運行測試程序;安裝后,你將得到信息“IwanttostarttheCONFIG.exefilenow”。你應(yīng)該回答“Yes”,配置你對編譯器和庫的合適的選項。配置配置程序(config.exe),也就是我們談到的配置wizard,有兩個基本的操作模式:(i)作為一個wizard幫助你對你的編譯器、庫和個人的參數(shù)選擇合適的選項。這個模式在初始化安裝后使用,也可以在后來當(dāng)配置變化時使用;(ii)作為一個程序以后運行,允許你方便的在以前的配置間切換。無論怎樣,我們需要區(qū)別兩個目錄(可能事實上是同一個):安裝目錄:安裝PC-lint的目錄;配置目錄:存儲配置信息的目錄;在一個如果你的安裝目錄是可寫的,安裝目錄和配置目錄可以相同;如果PC-lint被安裝在一個只讀的文件服務(wù)器,配置目錄和安裝目錄必須是不同的。PC-lint沒有一個可視的前端。它可以運行在命令行、在一個集成開發(fā)環(huán)境中或在一個智能編輯器中(見章節(jié)3.5集成在你的環(huán)境)。wizard將創(chuàng)建一個文件lin.bat,你可以lintC和C++文件使用命令:linoptionsfile1file2...lin.bat將包含一個命令類似這樣的形式:InstDir\lint-nt-iConfDirstd.lnt&1&2...這里InstDir是安裝目錄,ConfDir是配置目錄,std.lnt將包含合適的選項來lint。-i選項(完整的描述見章節(jié)5.7其它選項)如此命名是因為它能確定include目錄和管理尋找。文件的尋找不僅僅是尋找頭文件。特別的,std.lnt,被放置在你的配置目錄。但是注意,std.lnt也可以放置在你的當(dāng)前目錄,而且有優(yōu)先級,這也有它的作用。std.lnt將混合一個編譯器選項文件、一個或多個庫選項文件、大小選項和一個options.lnt(影響你長期的錯誤抑制策略的文件)。見章節(jié)14.2建議的安裝總結(jié)一下,wizard將創(chuàng)建下列文件:LIN.BAT――一個批處理文件,可以被copy到你的PATH目錄下,里面包含一個參考文件STD.LNT;STD.LNT――一個間接lint文件,內(nèi)容包括一個編譯器選項文件、一個選項文件和隨意的其它選項和文件;STD_...LNT――一系列不同版本的STD.LNT,wizard能夠以后從中選擇;Options.lnt――一個方便的中心本地選項文件,你的大部分的lint選項都寫在里面;.LSET.BAT――一個批處理文件,可被用于放置你的PC-lint可執(zhí)行文件到你的PATH目錄中;使用這些文件可以參考章節(jié)3.4Lint你的程序和章節(jié)14.2建議的安裝Setup。Wizard將copy一些文件從安裝目錄(或它的子目錄)到配置目錄。以下是這些文件:co-lnt――編譯器選項文件;env-lnt――環(huán)境選項文件;lib-lnt――庫選項文件;lib-h――lib-lnt參考的頭文件;au-lnt――作者建議檢查的選項文件;file?.cpp――在下一章節(jié)描述的一對測試程序;運行測試程序?qū)C-lint,在你完成安裝和配置后,在以前的事件中,PC-lint可執(zhí)行文件是lint-nt.exe,在以后的事件中,它可能是lint.exe或lint-os2.exe。I在我們的例子中,我們將使用lin.bat,巧妙地配置,包含合適的可執(zhí)行文件。對FlexeLint,你將創(chuàng)建一個類似的Shell腳本(或類似的命令行腳本),為了表達方便的目的,我們假定名字是lin。在這個章節(jié),要描述產(chǎn)品的基本操作,我們假定以下定義兩個小文件filea.cpp和fileb.cpp,這些可以在目錄dos-ins\test中找到。從你的配置目錄linfileafileb例子文件filea.cpp和fileb.cpps顯示如下:filea.cpp://lint-w2reducethewarninglevelto2classX{staticinta;};fileb.cpp:classX{inta;};你將在你的屏幕上見到下列信息:PC-lintforC/C++(NT)Vers.8.00,Copyright...Module:filea.cppModule:fileb.cpp_};fileb.cpp4Warning631:tagXdefineddifferentlyatline3,filefilea.cppGlobalWrap-upWarning1527:staticmemberX::a(line5,filefilea.cpp)notdefined并不是你見到的所有信息都是錯誤信息。第一行標(biāo)識出PC-lint的版本;第二行和第三行是過程進行的信息,正常顯示被處理的模塊名稱信息。你可以關(guān)閉這些'verbosity'信息或增加它們的詳細程度,使用-v...選項;第四行開始顯示錯誤信息。Lint你的程序要lint你自己的程序,輸入一個目錄包含你的C和C++模塊,我們假定lin.bat(或在主機的操作系統(tǒng)的相似的shell腳本)可以在任何目錄運行(例如,已經(jīng)被放置在你的PATH目錄中)。這樣做的好處是可以簡單的表達和簡單的打印。假定你的程序由下列模塊組成:alpha.cppbeta.cgamma.c我們可以lint整個程序使用以下方式:linalpha.cppbeta.cgamma.c注意:擴展名.cpp(就象.cxx)表明是一個C++模塊,擴展名.lnt表明一個間接文件(命令行擴展),其它的擴展名表明是C模塊。通常最好首先做一個單獨的模塊的單元檢查(使用-u選項)。例如:lin-ualpha.cpp對模塊alpha.cpp.做一個單元檢查(你的文件的任何子集隸屬于單元檢查)。當(dāng)做一個單元檢查,特定的信息被禁止顯示(例如"functionnotused").對C++模塊的擴展不考慮擴展的默認處理,你可以使用+fcpflag。這指出下一個模塊將是一個C++模塊。這將一直起作用,指定用-fcp關(guān)閉lin+fcpa1.ca2.ca3.c-fcpa4.ca5.cpp將對待a1.c、a2.c和a3.c作為C++模塊,a4.c作為C模塊,a5.cpp作為一個C++模塊。選項+cpp(擴展名)將被用于加到C++擴展名的列表。因此lin+cpp(cc)a1.cca2.cca3.ca4.cpp將處理a1.cc,a2.cc和a4.cpp作為C++模塊,a3.c作為C模塊。選項嚴(yán)格按照順序的。控制消息對于以前沒有l(wèi)int的代碼,你將得到大量的信息。默認的告警級別是3,意味著你將見到所有的錯誤告警和情報信息。要抑制情報信息,降低告警級別到2,使用-w2:lin-u-w2alpha(假定擴展名是.cpp)。你也可以使用信息號來抑制信息。例如,要抑制告警547號信息,你可以使用選項-e547:lin-u-e547gamma.c無論如何,不要氣餒。有大量的錯誤抑制選項(見章節(jié)5.2錯誤抑制選項).建議建立一個錯誤抑制制度,見章節(jié)14.靈活使用LINT.選項萬一你沒有注意到,有大量的選項,可以參考章節(jié)5.選項。要得到選項的總結(jié)lin?命令行的擴展對于多于一個模塊的project,你發(fā)現(xiàn)把所有模塊的名字放到一個lint間接的文件是非常方便的。假定這個project的名字是alphabet,創(chuàng)建一個alphabet.lnt文件包含:alphabet.lnt:alpha.cppbeta.cgamma.c它們使用:linalphabet要lint整個project,你可以把選項放到alphabet.lnt里面,但這是不被推薦的,因為如果你做一個單元模塊檢查,你將沒有得到這些選項的好處。最好,放置與project無關(guān)的選項到一個中心文件options.lnt;與Project有關(guān)的選項可以放置到你的project目錄下的std.lnt文件。更進一步的描述在章節(jié)14.2被推薦的的安裝。集成到你的環(huán)境PC-lint被靈活地設(shè)計,以便于你方便地集成到你喜歡的集成開發(fā)環(huán)境(IDE)或智能編輯器。好處是你可以用最小的鍵擊啟動PC-lint來處理你當(dāng)前的文件或當(dāng)前的project。完成后,而且,你能,在多數(shù)情況下,快速地和自動地從錯誤到錯誤(實際消息到消息)切換,希望用一個單擊你子集的編輯器,適當(dāng)?shù)刂赋鑫募行枰⒁獾奈恢?。我們,?dāng)然,能夠提供我們自己的環(huán)境,但是我們覺得你應(yīng)該可能更好的繼續(xù)使用你自己喜愛的編輯器的現(xiàn)有環(huán)境。特別的,我們的消息格式是非常靈活的(見章節(jié)5.6消息陳述選項。)消息重向不僅是通過命令行的標(biāo)準(zhǔn)重定向符(>),而且是被嵌入的作為選項(見-os(file)在章節(jié)5.7其它選項).標(biāo)語行可以被控制(見–b在章節(jié)5.7其它選項)和它能被安排成至少一條消息總是產(chǎn)生(用選項+e900),對某些環(huán)境是必須的。另外,間接文件(.lnt文件)能包含間接文件。文件擴展名,可以不是.lnt(見+ext在章節(jié)5.7其它選項).間接文件能包含嵌入的環(huán)境變量名(章節(jié)4.1間接(.lnt)文件.)。我們加入一些格式為env-lnt的文件,幫助處理集成到特定的IDE'。包括:env-BC5.lnt――Borland's5.0IDE;env-bwin.lnt――Borland's4.0IDEWindows環(huán)境下;env-cw.lnt――PremiaCodewright;env-pwb.lnt――Microsoft'sProgrammer'sWorkBench;env-si.lnt――SourceInsightEditor;env-sled.lnt――VisualSlickEdit;env-tide.lnt――Turbo/BorlandIDEunderDOS;env-vc.lnt――Microsoft'sVisualC/C++,Version1;env-vc2.lnt――Microsoft'sVisualC/C++,Version2;env-vc4.lnt――Microsoft'sVisualC/C++,Version4;env-vc5.lnt――Microsoft'sVisualC/C++,Version5;這些文件需要時更新。見我們的website(在Version8.00補丁里)。*.dsp處理如果你使用MicrosoftVisualStudio,每個project的概要包含在一個擴展名為.dsp.的文件里。這個文件是ASCII形式,可以用你的編輯器察看。這個文件包含模塊名稱,定義的預(yù)處理變量,包含的路徑。PC-lint/FlexeLint能處理這個文件,展開這些相關(guān)到lint的信息,轉(zhuǎn)換這些信息到lint指示,并輸出結(jié)果到標(biāo)準(zhǔn)的輸出。結(jié)果文件,如果有一個.lnt擴展名,能被用于輸入到PC-lint/FlexeLint。例如,下列從一個.dsp文件產(chǎn)生一個lintproject文件:lint-ntproject.dsp>project.lnt這個.dsp文件,包括內(nèi)容SOURCE=lines.這些行包括不僅模塊名稱(C和C++文件),而且包括頭文件、資源文件、文本文件等等。PC-lint/FlexeLin,當(dāng)然,僅僅需要模塊名稱。默認的,我們選擇任何擴展名是“.c”,和有C++擴展名的文件。默認的,C++擴展名是“.cpp”和“.cxx”,這個擴展名列表可以被-cpp選項控制。要想看看轉(zhuǎn)換是怎么進行的,你可以使用verbosity選項來觸發(fā)一個對每行的信息,例如:lint-nt-v1project.dsp>project.lnt將提供一個一行一行地轉(zhuǎn)換。用.dsp文件,可以支持條件語句,例如:!IF"$(CFG)"=="project-Win32Release"這允許你選擇debug或release變量。變量CFG通常確定.dsp文件內(nèi)最近的配置。你可以改變流提供一個“命令行”選項:+d"CFG=project-Win32Release"這象一個預(yù)處理器定義,除了+d(相對于-d)阻止后來的重新定義.使用引用是必要的,因為定義包含空格。既然有很多種方式解釋命令行參數(shù)(批處理命令、makefile,、命令行),而且處理引用和空格的方式是輕微的區(qū)別,最好把這些選項放置到一個單獨的.lnt文件,例如:release.lnt:+d"CFG=project-Win32Release"然后選擇一個命令行,例如:lint-ntrelease.lntproject.dsp>project.lnt如上所示,輸出文件(這些例子中的project.lnt)將包含有用的模塊列表的選項。對單元檢查,你需要選項列表,而不是模塊列表。為此,使用--u選項(不是-u).例如:lin--uproject.lntalpha.cpp這將使用所有沒有模塊的project.lnt內(nèi)的選項來進行單元檢查,僅僅處理alpha.cpp.其它操作系統(tǒng)我們提供一個安裝程序為OS/2或DOS系統(tǒng)能支持DOS擴展技術(shù)。如果操作系統(tǒng)不是Windows9X、Windows2000、WindowsME和WindowsNT,你將使用FlexeLint。要安裝和開始,見FlexeLint安裝注意事項。要使用安裝程序,放置你的安裝盤到CD-ROM驅(qū)動器,輸入:Drive-letter:\DOS-ins\install按照屏幕上的提示,安裝程序不僅安裝盤復(fù)制文件,而且修改你的環(huán)境變量和AUTOEXEC.BAT或CONFIG.SYS。最好創(chuàng)建批處理文件做這些事情,以這種方式,當(dāng)你復(fù)制文件時你可以看到什么將會發(fā)生的建議,如果發(fā)生什么問題,你將有一個記錄。而且,許多程序員有一套AUTOEXEC.BAT,需要知道怎么修改每一個,不能對目前的一個盲目的修改。創(chuàng)建的批處理文件是LCOPY.BAT,批處理文件從安裝盤復(fù)制LSET.BAT(對OS/2是LSET.CMD)文件到lint目錄。批處理文件設(shè)置環(huán)境變量(僅僅需要時創(chuàng)建)。注意:在DOS下,LCOPY調(diào)用LSETupontermination(如果需要)。安裝程序同樣創(chuàng)建下列文件:LIN.BAT――(對OS/2是lin.cmd),一個批處理文件,安裝程序?qū)?fù)制到你的PATH目錄,并包含一個對STD.LNT的參考。STD.LNT――一個間接文件,將指向一個編譯器選項文件和一個選項文件。STD_...LNT――多個版本的STD.LNT(見章節(jié)3.7.1多重配置)options.lnt――A一個方便的中心放置選項文件,你將趨向于使用你的大多數(shù)的lint。對于這些文件的描述在章節(jié)3.4Lint你的程序和章節(jié)14.2建議的安裝。多重配置對OS/2和DOS的安裝程序為了一個雙重的目的。首先,它提供了從安裝盤到硬盤復(fù)制文件的目的,(SETUP做的對于不同的Windows平臺)。其次,它能創(chuàng)建一個或多個配置(收錄在STD.LNT文件)。對多重配置的設(shè)置(例如,多重編譯器,和/或多重內(nèi)存模式,和/或多重庫)是建立多個候選的STD.LNT和提供一個簡單的方式切換它們。見章節(jié)14.2建議的設(shè)置t來看STD.LNT的中心作用。如果,在你的安裝過程中,你回答“Yes”回答問題:“Areyougoingtosetupmultiplecompilers...”,然后是關(guān)于編譯器、內(nèi)存模式和庫重復(fù)的很多次的問題。這些的答案將放置到這些文件中:STD_A.LNTSTD_B.LNTSTD_C.LNT...等等。要切換不同的配置,我們提供一個批處理文件CONFIG.BAT??梢栽谀愕墓ぷ髂夸浭褂猛暾窂矫\行(不需要參數(shù)),可能看起來象:C:\LINT\CONFIG它提供一個配置選項的菜單。通過選擇合適的字符來選擇一個,這個字符決定是哪個文件STD_x.LNT將替代STD.LNT。你,也可以不用使用這種方式CONFIG。例如,在一個特定目錄,你總是選擇'C'配置(例如STD_C.LNT),你可以在哪個目錄創(chuàng)建一個STD.LNT,包含對下列文件的引用:STD_C.LNT做為選擇,你可以簡單地復(fù)制STD_C.LNT的內(nèi)容到STD.LNTI在給出的目錄.DOS-ins文件DOS混合注意事項命令行PC-lint/FlexeLint的命令行有下列形式:lintoptionfile1[file2file3...]這里命令行名稱lint將根據(jù)依賴于操作系統(tǒng)和安裝的選擇而不同;選項(描述在章節(jié)5.選項)通常處理這里顯式的文件。它們也可以點綴在文件中獲得特殊的效果。如果沒有參數(shù)給PC-lint/FlexeLint或一個?作為一個單獨的參數(shù),那么提供一個簡單的幫助作為輸出。通配符對PC-lint和Unix下的FlexeLint也是適用的。見章節(jié)4.1間接(.lnt)文件.一個模塊被認為是一個C++模塊,如果它的擴展名是.cpp或.cxx或+fcpflag被打開。你也可以加新的擴展名到C++名稱擴展列表,使用+cpp選項(見章節(jié)5.7其它選項.)。間接(.lnt)文件間接文件可以包含注釋;間接文件可以包含環(huán)境變量;例如%SOURCE%\a.c//firstfile%SOURCE%\b.c//secondfile如果一個間接文件在當(dāng)前的目錄沒有發(fā)現(xiàn),將在慣例的地方尋找,例如:lin.bat可能包含C:\lintpp\lint-iC:\lintppstd.lnt%1%2%3%4std.lnt將在目錄C:\lintpp中查找(如果當(dāng)前目錄中沒有std.lnt).退出代碼選項指定選項的規(guī)則注釋內(nèi)的選項LINT選項可以放在注釋中,例如:/*lintoption1option2...optionalcommentary*/選項可以有多行//lintoption1option2...optionalcommentary選項僅為一行選項間要以空格分開,lint命令一定要小寫,并且緊跟在/*或//后面,不能有空格。如果選項由類似于操作符和操作數(shù)的部分組成,例如-esym(534,printf,scanf,operatornew),其中最后一個選項是operatornew,那么在operator和new中間只能有一個空格。宏內(nèi)的選項選項還可以放在宏定義中,當(dāng)宏被展開時選項才生效。例如:#defineDIVZERO(x)/*lint-save-e54*/((x)/0)/*lint-restore*/允許除數(shù)為0而不告警選項內(nèi)的空格你可以使用雙引號(”),而不是單引號,來保護一個空格,例如:-"dWORD=unsignedshort"就象#defineWORDunsignedshort-dMESSAGE="useunsignedshort"就象#defineMESSAGE"useunsignedshort"選項顯示因為選項可能被放于模糊的地方而遺忘,冗余信息選項-vo(見章節(jié)5.4冗余信息選項.)能被用來顯示遇到的所有選項。選項和其中的字符一些我們更復(fù)雜的選項有下列形式-identifier(arg1,arg2,...)這些選項可以放置在.lnt間接文件中和/*lint注釋中,但是不能放置到命令行中。對MS-DOS,可以使用'!'代替逗號(',').因此c:\lint\lint-esym(714,alpha)...可以替換為lin-esym(714!alpha)...完整的設(shè)置是:O.S.MetaCharacterAlternativeMS-DOS,!Unix()?[].MacintoshMPW+"&'LINT的選項很多共有300多種,大體可分為以下幾類:錯誤信息禁止選項說明:“-”:表示禁止輸出相應(yīng)的錯誤消息“+”:表示允許輸出相應(yīng)的錯誤消息“#”:允許使用通配符“?”和“*”除了900級別(900-999)和1900(1900-1999)級別的告警消息缺省是關(guān)閉的外,其它的告警消息缺省均是打開的。-e#:禁止輸出告警號為#的消息;例如-e504w關(guān)閉錯誤信息504;-e7??關(guān)閉所有700水平的錯誤;關(guān)閉情報信息,最好使用-w2;-e1*s將關(guān)閉所有以數(shù)字1開頭的信息,包括信息12、1413和1自己;-e(#):對于下一個表達式禁止輸出告警號為#的消息!e#:在本行禁止輸出告警號為#的消息--e(#):對當(dāng)前的整個表達式禁止輸出告警號為#的消息整個表達式可以是一個if語句、一個while語句、任何一個for語句、一個switch語句或者一個表達式語句-e{#[,#]…}:w禁止輸出下一個語句或聲明(第一個)告警號為#的消息一般使用在一個lint的注釋中,例如://lint-e{715}suppress"knotreferenced"voidf(intn,unsignedu,intk){//lint-e{732}suppress"lossofsign"u=n;//732notissued//lint-e{713}suppress"lossofprecision"if(n){n=u;//713notissued}}//715notissued–elib{715}被用于在整個函數(shù)中抑制信息715,而不是在下一個函數(shù)中。–e{732}將被用于在下一個分配語句中抑制信息732。–e{713}將被用于在下一個整個if語句中抑制信息713。注意:這個結(jié)構(gòu)可以在一個類的定義前或namespace聲明來抑制和類或namespace體相關(guān)的信息。使用–e{#}和-save–e#…-restore是一樣的作用。通配符可以使用在–e{}中。因此–e{7??}或–e{*}都是合法的。.--e{#[,#]…}:將禁止它放置的整個區(qū)域的信息號#。區(qū)域可能是一個混合語句、一個函數(shù)體、一個類、一個結(jié)構(gòu)、一個聯(lián)合定義、一個鏈接規(guī)格體。如果選項沒有放置在任何這些區(qū)域,抑制將作用于全體(從出現(xiàn)的地點到模塊的結(jié)束)。它沒有擴展模塊的結(jié)束到下一個模塊。它將影響對模塊的綜合報導(dǎo)的信息,但是不影響對全局的綜合報導(dǎo)的信息。考慮下列例子://lint--e{528}suppress"f()notreferenced"staticvoidf(intn,unsignedu,intk){//lint--e{715}suppress"knotreferenced"http://lint--e{732}suppress"lossofsign"u=n;//732notissuedif(n){//lint--e{713}suppress"lossofprecision"n=u;//713notissuedu=n;//732notissued}}//715notissued--e{528}抑制告警528,發(fā)布于模塊的綜合報導(dǎo),沒有影響其它模塊。--e{715,732}抑制715和732,發(fā)布在函數(shù)內(nèi),沒有影響其它函數(shù)。--e{713}抑制在符號語句中的丟失精度的信息。許多關(guān)于-e{}的評論也適用于--e{}。象-e{},任何--e{}選項被嵌入到語句樹中;它可以出現(xiàn)在你的宏中,它可以使用通配符。!e#O抑制一行信息(這里#是一個信息號),被使用在/*lint(或//lint)注釋。它只是抑制給出的一行代碼。例如:if(x=f(34))//lint!e720y=y/x;將抑制信息720,對一行??梢源鎯蓚€單獨的lint注釋://lint-save-e720if(x=f(34))//lint-restorey=y/x;對于C代碼,/*lint格式的注釋將更合適:if(x=f(34))/*lint!e720*/y=y/x;多個錯誤信息抑制選項可被允許如下使用,但是沒有通配符:n=u/-1;//lint!e573!e721一個限制條件是:一行消息抑制不能放置在宏內(nèi)。這樣是為了速度。一個快速地掃描是對每個非預(yù)處理輸入行尋找字符'!'。如果這個選項嵌入在宏內(nèi),這樣快速的尋找將沒辦法做到。-ealetter抑制參數(shù)不匹配信息。注意:這只是影響非原型的調(diào)用,因此對C++程序沒有影響。lette可能是:I――sub-integern――nominalu――unsignedvs.signeds――samesize這些選項對選擇的不同類型抑制信息516(參數(shù)類型不匹配)。告警信息516被發(fā)布當(dāng)實參和/形參在函數(shù)調(diào)用和原型中不一致。-eai:整型數(shù)子類參數(shù)不一致,如:char/shortvs.int。參考+fxc和+fxs.-ean:名義上的參數(shù)不一致,如:字節(jié)數(shù)相同(都是32位)的int和long,unsignedint和unsignedlong等,也支持short和int,當(dāng)它們字節(jié)數(shù)相同時。-eas:參數(shù)大小相同,如:如果int和pointer字節(jié)數(shù)相同,那么如果f()的參數(shù)應(yīng)該是pointer的話,用f(3)整型數(shù)調(diào)用就會報錯,設(shè)置此項可以關(guān)閉告警-eau:參數(shù)類型一致,但是符號類型不一致,如:unsignedint和int,例如,如果函數(shù)f期望一個unsignedint,n是一個int,那么調(diào)用f(n)將發(fā)出告警信息516,這個信息可以通過設(shè)置-eau而不顯示。以上四個選項主要用于非原型的舊風(fēng)格的C語言程序。其中-ean和-eau正交,eas涵蓋了ean和eau。舉例來說,如果-eas被設(shè)置,沒有必要設(shè)置-eau.-efile(#,file[,file]...)對指定文件禁止輸出告警號為#的消息這個象-esym,但是只是用于那些參數(shù)是文件名的錯誤信息。(例如7,305,306,307,314,404,405,406,537,766)。請注意,這個選項不是抑制一個文件內(nèi)的信息,而是關(guān)于這個文件的信息。-efunc(#,Symbol[,Symbol]...)對于函數(shù)Func,禁止輸出告警號為#的消息例如:intf(intn){returnn/0;//Error54}將報告信息54(被0除)。要抑制這個信息,你可以使用選項-efunc(54,f)。這個將抑制任何的發(fā)生在同樣函數(shù)的被0除的信息。-efunc選項和-esym(抑制某個函數(shù)名的信息,或任何錯誤信息中的參數(shù)的符號名的信息)選項相比,這兩個都支持通配符。成員函數(shù)必須表示為使用范圍操作符,因此-efunc(54,X::operator=)-elib(#[,#]...)對于庫頭文件禁止輸出告警號為#的消息#m可以是通配符,一個更方便的方式是對庫頭文件設(shè)置一個檢查級別,使用-wlib(level).-elibsym(#[,#]...)對于所有庫頭文件中的符號禁止輸出告警號為#的消息,此告警不同于elib之處在于-elib(#)僅僅當(dāng)分析頭文件時不輸出相應(yīng)的告警,如果你在源程序中使用了會導(dǎo)致告警#的變量等,在分析源程序時還是會告警的,因此要想完全的關(guān)閉該告警,使其在頭文件和源文件中均不出現(xiàn),請使用本選項。例如,假定一個庫定義了一對類:classX{};classY:publicX{~Y();};這將導(dǎo)致信息1510,基類Xh沒有析構(gòu)器。注意,信息將被延期直到見到子類Y的一個析構(gòu)器。選項-elib(1510)當(dāng)處理庫頭文件時將抑制這個信息。如果在用戶自己的代碼中,有一個聲明:classZ:publicX{~Z();};診斷將發(fā)布信息,盡管使用-elib(1510)I,因為這個聲明在庫代碼之外。用戶可以抑制信息使用-esym(1510,X)但是如果有大量的這樣的基類都沒有析構(gòu)器,用戶可以使用選項:-elibsym(1510)-emacro(#,symbol,...)對于宏Symbol,當(dāng)其展開時禁止輸出告警號為#的消息使用這個選項的原因是經(jīng)常因為對于編譯器或第三方的庫宏,需要抑制錯誤信息。-emacro((#),symbol,...)對于宏Symbol,當(dāng)其展開時禁止輸出告警號為#的消息,與上一個選項的區(qū)別是它會先將宏加上一對括號再判斷,如:#defineDIVIDE(n,m)n/m那么它會在宏展開時將n/m看作(n/m)來處理。例如,假定宏ZERO被定義為:#defineZERO(*(int*)0)當(dāng)ZERO被實際使用后,結(jié)果是告警信息413(使用NULL指針)。要抑制這個信息,你可能想到使用:-emacro(413,ZERO)這將不總是起作用,歸因于事實:信息413被在一個表達式步中給出,而不是語法分析階段。修改的辦法是使用:-emacro((413),ZERO)這將抑制信息413,使用語法分析,在宏相關(guān)的樹節(jié)點放置告警信息413抑制需求。選項-e(413)被放置于一個表達式前的/*lint注釋內(nèi)。就好像我們定義ZERO為:#defineZERO/*lint-e(413)*/(*(int*)0)-epletter(s)指針的類型不匹配這個選項指指針到指針的不匹配(錯誤64),交叉分配、在初始化中隱含分配、函數(shù)中返回、在原型中傳遞分配等。letter是以下中的一種:n――nominalu――unsignedvs.signednc――nominalcharuc――unsignedvs.signedchars――samesizep――allindirectvalues-epn名義上的指針不一致,如:對于指向字節(jié)數(shù)大小相同的變量的指針例如指向short的指針對指向int的指針,這里int和short大小相同。-epu指針指向的類型僅僅符號不一致例如char和unsignedchar-epnc指針指向的字符串類型,僅僅名義上不同指針指向的類型不同,一個是char,另一個是signedchar,這里char是默認的signed,或一個是char,另一個是signedchar,這里char是默認的unsigned.-epuc指針指向的字符串類型,其符號不一致指針指示的類型不同,一個是signedchar,另一個是unsignedchar.-eps指針指向的類型不同,但大小字節(jié)數(shù)相同-epp指針指向的類型不確定-epn和-epu正交;-eps包含這兩個;-epp包含其它的;-epnc是-epn的一個特例;-epuc是-epu的一個特例;-esym(#,Symbol[,Symbol]...)于指定的符號Symbol(可以是變量名、函數(shù)名等),禁止輸出告警號為#的消息,符號Symbol中可以使用通配符*和?。例如:-esym(715,un_*)對任何前三個字符是"un_"的符號抑制信息715-esym(512,?,*::*)對任何名稱包含"::"(例如成員變量名稱)的符號抑制信息512-etd(TypeDiff[,...])對于TypeDiff類型,忽略不同地方對其的類型定義不同,用于舊風(fēng)格C例如,-etd(ellipsis)將抑制兩個函數(shù)類型不同,一個以省略號確定,而另一個不是的信息。-etemplate(#[,#]...)抑制當(dāng)展開模塊時的錯誤信息-wLevel設(shè)置告警級別(0,1,2,3,4),0表示不打印任何告警消息,用于先關(guān)閉所有告警,然后打開部分告警-wlib(Level)對庫(文件)設(shè)置告警級別變量類型大小選項說明:不同的目標(biāo)機、編譯系統(tǒng)變量類型的的大?。ㄈ缍陶妥兞?、整型變量等)會有所不同,該類選項用于為目標(biāo)機設(shè)置變量類型的大小。例如,如果你要對一個嵌入式系統(tǒng)lint,int和指針通常是16個字節(jié),你應(yīng)該確定:lint-si2-sp2...當(dāng)前的這些大小參數(shù)的值,可以使用下列的命令獲得:lin-sp6?-sb#:設(shè)置一個字節(jié)的比特數(shù),缺省值為8-sbo#:sizeof(bool),缺省值是1-sc#:sizeof(char),缺省值為1-slc#:sizeof(longchar),缺省值為2-ss#:sizeof(short),缺省值為2-si#:sizeof(int),缺省值為4-sl#:sizeof(long),缺省值為4-sll#:sizeof(longlong),缺省值為8-sf#:sizeof(float),缺省值為4-sd#:sizeof(double),缺省值為8-sld#:sizeof(longdouble),缺省值為16-sp#:sizeof(allpointers),缺省值為4和6-spN#:sizeofnearptrs,缺省值為4-spF#:sizeoffarptrs,缺省值為6-spND#:sizeofneardatapointer,缺省值為4-spNP#:sizeofnearprogpointer,缺省值為4-spFD#:sizeoffardatapointer,缺省值為6-spFP#:sizeoffarprogpointer,缺省值為6-spD#:sizeofdataptrs,缺省值為4和6-spP#:sizeofprogramptrs,缺省值為4和6,near為4,far為6-smp#:sizeofallmemberptrs,缺省值為4-smpD#:sizeofmemberptr(data),缺省值為4-smpP#:sizeofmemberptrs(prog),缺省值為4-smpNP#:sizeofmemberptr(NearProg),缺省值為4-smpFP#:sizeofmemberptr(FarProg),缺省值為4-sw#:sizeofwidechar,缺省值為2冗余信息選項說明:“-”:表示僅輸出到文件stdout“+”:表示同時輸出到文件stdout和stderr使用格式:{-+}v[cdhoistw][mf<int>]冗余信息指的是LINT過程中產(chǎn)生的一些與編譯過程有關(guān)的信息,而不是指真正的告警信息、錯誤信息等。是否生成這些信息可以通過-v和+v選項來決定。+v是生成這些信息,-v是關(guān)閉這些信息,這組選項中除+v外,其它所有選項都可以關(guān)閉+v選項。以下選項可以出現(xiàn)0或多個:c:輸出每次一個調(diào)用特定設(shè)置參數(shù)的函數(shù)d:輸出語言特定標(biāo)識符到每個模塊的冗余信息n:每n行輸出一個信息o:輸出命令行和注釋行中包含的配置i:輸出所使用的配置文件名(lnt文件)s:輸出內(nèi)存消耗數(shù)量t:輸出每次一個模板被實例化的情況w:每當(dāng)一個函數(shù)被特定的參數(shù)作用時輸出報告h:輸出嚴(yán)格的類型層次圖(輸出結(jié)果類似于DOS命令tree的結(jié)果)#:附加文件ID,用于判斷文件是否相同以下選項一次只能出現(xiàn)一個:m:輸出模塊名(缺省就是輸出模塊名)f:輸出所有文件名(此選項包含m選項)<int>:每條消息打印為int行(此選項包含f選項)例如:lint+voffile1file2>temp將導(dǎo)致產(chǎn)生對每個模塊、每個頭文件和每個選項的一行信息。這個信息將出現(xiàn)在控制臺,并同樣的內(nèi)容被重定向到文件temp。但是不是所有的系統(tǒng)都支持重定向。幸好有-os選項,因此可以改為:lint+vof-os(temp)file1file2標(biāo)志選項說明:“+f”:表示打開該開關(guān)(即設(shè)置標(biāo)志為1)“-f”:表示關(guān)閉該開關(guān)(即設(shè)置標(biāo)志為0)“++f”:表示增1“--f”:表示減1標(biāo)志選項用于打開或關(guān)閉對某類語法情況的處理。后面兩個選項(++和--)用于你想在局部改變開關(guān)取值,而不影響全局設(shè)置的情況。例如你可以這樣使用:/*lint++flb*/intprintf();/*lint--flb*/將被用于設(shè)置flb(library)flag打開,只是為一次的聲明,隨后,恢復(fù)這個標(biāo)志的值,不管它原來是多少。目前的所有flag的設(shè)置可以使用下列命令獲得:following:lin-oe(temp)+fce?文件temp將捕獲標(biāo)志選項的總結(jié),并且設(shè)置Continue-on-Errorflag打開。fabABbreviatedstructureflag――支持縮略式結(jié)構(gòu),很少有編譯器支持這種功能。缺省值為OFF如:s.a.b如果不會引起歧義的話,可以縮寫為s.b。faiArgumentspointedtogetInitializedflag――指針參數(shù)是否初始化(不初始化將告警),缺省值為ONWhenanargumentispassedtoafunctionintheformoftheaddressofascalarandifthereceivingparameterisnotdeclaredasconstpointer,thenitisassumedbydefaultthatthescalartakesonnewvaluesandthatwedonotknowwhatthosevaluesare.Thus,inthefollowing:voidf(int**);voidg(){int*p=NULL;f(&p);*p=0;//OK,nowarning.}wedonotwarnofthepossibilityoftheuseofaNULLpointerbecauseourpastknowledgeiswipedawaybythepresumedinitializationaffordedbythefunctionf.However,iftheflagisturnedOFF(using-fai),thenwewillwarnofthepossibilityoftheuseofaNULLpointer.fanANonymousunionflag――是否支持匿名聯(lián)合,用于結(jié)構(gòu)變量的說明,對C缺省值為OFF,C++為ON如果這個標(biāo)志打開,匿名聯(lián)合是支持的。匿名聯(lián)合出現(xiàn)在結(jié)構(gòu)內(nèi),在結(jié)構(gòu)內(nèi)沒有名稱,因此使用一個簡短的符號訪問。例如:structabc{intn;union{intui;floatuf;};}s;...s.ui...這里聯(lián)合成員(s.ui或s.uf)的引用和結(jié)構(gòu)成員(s.n)的引用意義簡單。這是Microsoft編譯器用在C++中的一個特性。fasAnonymousstructflag――是否支持匿名結(jié)構(gòu),類似于fan,缺省值同上如果這個標(biāo)志打開,將支持匿名結(jié)構(gòu)。匿名結(jié)構(gòu)和匿名聯(lián)合類似。如果一個結(jié)構(gòu)沒有tag,沒有聲明,例如:classX{struct{inta;intb;};}x;一些編譯器(特別是MSC)支持這個構(gòu)造,但是不是非標(biāo)準(zhǔn)的。一旦設(shè)置選項-cmsc,這個標(biāo)志將被打開。fbaBitAddressabilityflag――Bit位尋址能力(可訪問性),缺省值為OFFIfthisflagisON(bydefaultitisOFF),anindividualbitofanint(oranyintegral)canbespecifiedusingthenotation:eger-constantwhereaisanexpressionrepresentingtheintegralandinteger-constantisanintegerconstant.Theconstructistreatedasabitfieldoflength1.例如,thefollowingcode:/*lint+fbaTurnonBitAddressability*/intn;n.2=1;n.4=0;...if(n.2||n.4)...willsetthe2ndbitofnto1andthe4thbitto0.Lateritteststhosebits.ThissyntaxisnotstandardC/C++butdoesrepresentacommonconventionusedbycompilersforembeddedsystems.fbcBinaryConstantflag――是否支持布爾類型常量0b...,缺省值為OFFIfthisflagisON,Binaryconstantshavingtheform0{bB}{01}+arepermitted.例如:0B101010101==0x15550b1111==0xFThisisnotanANSIconstructandfewcompilersactuallysupportthisfeature.fboBooleanflag――是否允許bool,true,false關(guān)鍵字,缺省值為ONIfthisflagisON,keywordsbool,true,andfalseareactivatedatthestartofeveryC++module.fbuBitfieldsareUnsignedflag――是否強制比特位域為無符號數(shù),缺省值為OFFWhenthisflagisON,bitfieldswillbeconsideredunsignedeventhoughanominalintisusedinitsspecification.例如:structS{intb:1;};hasaone-bitbitfieldbwhosevaluesnormallyrangefrom-1to0.ItwillreceiveanInformationalmessage(806)warningabouttheunusualcharacterofthedeclaration.Howeversomecompilers,treatthisasrangingfrom0to1.i.e.,theytreatthebitfieldasunsigned.Thepreferredprogrammerresponseistodeclarethebitfieldunsigned,asthisisportable.Ifyoudon'twanttodothisforsomereason,youmaysetthisflagON,tomatchthebehaviorofyourcompiler.fcdCDeclissignificantflag――是否區(qū)分cdecl說明符,缺省值為OFFIfthisflagisON,adistinctionismadebetweenfunctionsdeclaredexplicitlywiththecdeclmodifier(meaningfultousersofPC-lint)andfunctionsdeclaredwithoutthismodifier.Whengeneratingprototypes(-od),cdeclisaddedforallfunctionsdeclaredwiththismodifier.fceContinue-on-Errorflag――遇到#error時是否繼續(xù)運行,缺省值為OFFIfa#errordirectiveisencountered,processingwillnormallyterminate.IfthisflagisON,the#errorlineisprintedandprocessingwillcontinue.fcpC++flag――強制使用C++處理方式,缺省值為OFF+fcp表示其后的模塊文件將被強制作為C++程序?qū)Υ幚怼?fcp表示按照擴展名使用缺省的處理方式。例如:lin+fcpa1.ca2.ca3.c-fcpa4.ca5.cpp,其中a1.c、a2.c和a3.c將被作為C++程序進行Lint,而a4.c和a5.cpp按照缺省的方式(C和C++)進行LintfctCreateTagflag――生成標(biāo)簽(說明:結(jié)構(gòu)名、枚舉名就是一種標(biāo)簽Tag),缺省值為OFFAnystruct,union,enum,orclassthathasnonamefollowingthekeywordisconsidereduntagged.IfthisflagisON(thedefaultisOFF),tagswillbecreatedwheretheydonototherwiseexist.Thecreatedtagwillconsistofacompoundnamecontainingthefilenameandlinenumberwherethestructureisdefined.Thereareanumberofusesforsuchaflag.Forone,itforcesuntaggedstructstobeconsidereddifferenttypesiftheyaredefinedindifferentfiles.Also,somesubtleproblemscanoccurwhenattemptingtoreconstructlobinformationthatcontainsuntaggedstructures.Thesimpleremedyinthatcaseistosetthisflag.fcuChar-is-Unsignedflag――char型總是作為unsigned,缺省值為OFFIfthisflagisON,plainchardeclarationsareassumedtobeunsigned.Thisisusefulforcompilers,which,bydefault,treatcharasunsigned.NotethatthistreatmentisspecificallyallowedbytheANSIstandard.Thatis,whethercharisunsignedorsignedisuptotheimplementation.Seealsothefdcflag.fdcDistinguish-plain-Charflag――C++中是否區(qū)分char、unsignedchar、signedchar,缺省值為ONThisoptionineffectsaysthatforthepurposeoffunctionoverloadingtherearethreedistinctchartypes:char,signedcharandunsignedchar.ThisistheANSIC++draft[10]andissetautomaticallyifyouturnontheANSIflag(-A).Ifyourcompilerdoesnotsupportallthree,thentheoption-fdcmustbegiveninthecompiler選項file.Youcantellifyourcompilerneedsitbynotingwhether,例如,bothcharandsignedcharareoverloadedforthesamefunctions.Lookiniostream.h例如.ThisoptionhasnoeffectwhenyouareprocessingC-onlycode.fdhdot-hflag――是否為頭文件名附加'.h',缺省值為OFFIfthisflagisONandifyou#includeafilewithoutspecifyinganextension,thena".h"extensionisassumed.例如:#include"stdio"wouldcause"stdio.h"tobeincluded.fdiDirectoryofIncludingfileflag――是否從頭文件目錄(而非當(dāng)前目錄)開始搜索頭文件,缺省值為OFFForUnixsystemsthedefaultisON.ForPC-lintandforothersystemsthedefaultisOFF.IfthisflagisON,thesearchfor#includefileswillstartwiththedirectoryoftheincludingfile(inthedoublequotecase)ratherthanwiththecurrentdirectory.ThisisthestandardUnixconventionandisalsousedbytheMicrosoftcompiler.例如:#include"alpha.h"beginsthesearchforfilealpha.hinthecurrentdirectoryifthefdiflagisOFF,orinthedirectoryofthefilethatcontainsthe#includestatementifthefdiflagisON.Thisnormallywon'tmakeanydifferenceunlessyouarelintingafileinsomeotherdirectoryasin:lintsource\alpha.cIfalpha.ccontainstheabove#includelineandifalpha.halsoliesindirectorysourceyouneedtousethe+fdioption.fdlpointer-Difference-is-Longflag――是否指針之差為long型數(shù),缺省值為OFF,即int型數(shù)Thisflagspecifiesthatthedifferencebetweentwopointersistypedlong.Otherwisethedifferenceistypedint.Thisflagisautomaticallyadjusteduponencounteringatypedefforptrdiff_t.Ifthevalueoftheflagis2,thenpointerdifferencesareassumedtobelonglong.Thiscanoccurthroughthepairof選項:+fdl++fdlfdrDeduce-Return-modeflag――檢查函數(shù)的返回模式(返回值是否被使用等,舊風(fēng)格的C),缺省值為OFFWiththeintroductionandgeneralacceptanceofthevoidtypethisoptionisalmostobsolete.Thereturnmode
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同范本林業(yè)
- 傳單派發(fā)合同范本
- 鄉(xiāng)鎮(zhèn)物業(yè)收費合同范本
- 勞務(wù)公司租車合同范本
- 公會主播合同范本
- 勞務(wù)購買合同范例
- 公司經(jīng)營模式合同范本
- 出售買賣合同范本
- 勞動合同轉(zhuǎn)簽合同范本
- 2025國合通測校園招聘筆試參考題庫附帶答案詳解
- 消防員班長培訓(xùn)課件
- 醫(yī)師資格認定申請審核表
- 04干部人事檔案目錄
- (新湘科版)六年級下冊科學(xué)知識點
- MLL基因重排成人急性B淋巴細胞白血病和急性髓系白血病臨床特征及預(yù)后危險因素分析
- 雅思學(xué)習(xí)證明范本范例案例模板
- 磁共振成像(MRI)基本知識及臨床應(yīng)用
- 電廠深度調(diào)峰運行對機組的影響
- 分布式光伏電站勘查收資清單
- 產(chǎn)品不良品(PPM)統(tǒng)計表格模板
- 品管圈PDCA提高手衛(wèi)生依從性-手衛(wèi)生依從性品
評論
0/150
提交評論