代碼走查工具—PCL.ppt_第1頁
代碼走查工具—PCL.ppt_第2頁
代碼走查工具—PCL.ppt_第3頁
代碼走查工具—PCL.ppt_第4頁
代碼走查工具—PCL.ppt_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

代碼走查工具PCLint,目 錄,PC-Lint簡介 PC-Lint基本使用方法 PC-Lint常用選項(xiàng) PC-Lint在各種環(huán)境中的集成 PC-Lint常見告警分析及解決措施,PC-Lint簡介,PC-Lint是Gimpel Software公司開發(fā)的一個(gè)一個(gè)C/C+靜態(tài)語法檢查工具,它不是一個(gè)Free 軟件。一般來說,軟件在編譯連接通過后就可以使用PC-Lint做靜態(tài)檢查。 PC-Lint是一個(gè)命令行工具,在8.0版本里提供了300多個(gè)選項(xiàng),1000多個(gè)告警。 本篇培訓(xùn)材料旨在引導(dǎo)讀者入門,學(xué)會(huì)PC-LINT的基本使用方法,一些常見選項(xiàng)的使用,常見告警的分析及規(guī)避措施,希望可以起拋磚引玉的作用,為讀者深入掌握PC-Lint的使用打下基礎(chǔ)。 本篇材料主要是以PC-Lint8.0在Windows上的使用為基礎(chǔ)來做的。,PC-Lint基本使用方法,PC-Lint8.0主要由以下一些文件組成: Lint-nt.exe Windows下的執(zhí)行文件 Msg.txt 全部選項(xiàng)幫助說明文件 PC-Lint.pdf PC-Lint的幫助文件 Config.exe 配置程序 Std.lnt 標(biāo)準(zhǔn)配置文件 Options.lnt選項(xiàng)配置文件 .Lnt子目錄下的各種開發(fā)編譯環(huán)境的配置文件 其他一些文件,PC-Lint基本使用方法,PC-Lint是一個(gè)命令行工具,因此使用方式是命令行帶參數(shù)方式使用。 一般的使用格式為: lint-nt.exe Option file1 file2 如:lint-nt.exe -u -id:lint std.lnt sample.c 在這里-u 表示只對(duì)本單元進(jìn)行檢查 -id:lint 是表示會(huì)在d:lint目錄下搜索文件 std.lnt 是表示要使用的配置文件 sample.c 表示要檢查的源文件,PC-Lint基本使用方法,檢查一個(gè)目錄下的所有源文件可以使用以下方法: 如:lint-nt.exe -u -id:lint std.lnt d:ospvos*.cpp 跟前面不同的是這里將sample.c變成了d:ospvos*.cpp,使用*.cpp的意思是它會(huì)檢查d:ospvos目錄下的所有.cpp文件,但是它不能檢查子目錄下的文件,PC-Lint基本使用方法,要檢查所有包括子目錄的文件可以使用以下方法: lint-nt -id:lint std.lnt AllSource.lnt 在AllSource.lnt文件中可以放置如下: Moudule1-Dir*.cpp Moudule2-Dir*.cpp Moudule3-Dir*.cpp . 當(dāng)檢查所有文件時(shí)不需要使用-u選項(xiàng),PC-Lint基本使用方法,PC-Lint配置文件介紹 PC-Lint使用那個(gè)配置文件是由命令行參數(shù)決定的,一般地都使用std.lnt文件,std.lnt文件中可以包含各種配置選項(xiàng),還可以包含其他的配置文件,有點(diǎn)類似C的頭文件,里面可以include許多其他頭文件,不過PC-Lint配置文件包含其他配置文件不需要寫include,直接寫文件名就可以了。 每個(gè)配置文件里都可以包含配置選項(xiàng),這些配置選項(xiàng)也可以放在命令行中,一般為使用方便,命令行中不要放很多選項(xiàng),盡量都將選項(xiàng)放到配置文件中,PC-Lint基本使用方法,以下是VC下的配置文件樣例 / Microtec 32-bit, -si4 -sp4, lib-w32.lnt / Standard lint options co-msc60.lnt /PC-Lint提供的對(duì)VC6的告警屏蔽文件 lib-w32.lnt /PC-Lint提供的對(duì)VC6庫頭文件的告警屏蔽文件 options.lnt -si4 -sp4 /用戶自定義的選項(xiàng)文件 env-vc6.lnt /用戶用來設(shè)置編輯環(huán)境的配置文件 -id:vc6vc98include /include 目錄 -id:vc6vc98mfcinclude /include 目錄,PC-Lint基本使用方法,一般來說,PC-Lint經(jīng)常會(huì)有一些誤報(bào),為了消除這些誤報(bào),不得不將程序風(fēng)格改動(dòng)來規(guī)避,但有時(shí)候怎么改寫程序都有告警,比如說你定義了兩個(gè)宏,前面那個(gè)宏里有一半大括號(hào), 后面那個(gè)宏里有另一半大括號(hào), 這時(shí)候一定會(huì)有告警,你不得不使用一些PC-Lint選項(xiàng)來屏蔽這些告警。 一般情況下,我們都將自己要寫的選項(xiàng)放在Options.lnt文件中,PC-Lint基本使用方法,另外還有關(guān)于編輯環(huán)境的問題,如果把PC-Lint集成到某個(gè)編輯環(huán)境中,那么他輸入的格式必須和對(duì)應(yīng)環(huán)境吻合才能保證在鼠標(biāo)點(diǎn)擊(或雙擊)錯(cuò)誤消息條目時(shí)可以自動(dòng)定位到對(duì)應(yīng)源代碼行,一般來說這類配置都放置在env-xxx.lnt文件中,如VC6的時(shí)env-vc6.lnt, SourceInsight的是env-si.lnt PC-Lint本身提供了對(duì)各種編譯器及對(duì)應(yīng)庫頭文件的告警屏蔽文件,如co-msc60.lnt是對(duì)vc6的,lib-w32.lnt是對(duì)Win32庫頭文件告警的屏蔽配置文件,PC-Lint常用選項(xiàng),-i選項(xiàng) 這個(gè)選項(xiàng)主要是用來設(shè)置include路徑的 如:-iD:VC6VC98Include -e#選項(xiàng) 這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的告警 如:-e818 表示不顯示告警號(hào)為818的告警 -esym(#, 符號(hào)名)選項(xiàng) 這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的某個(gè)符號(hào)的告警, 如-esym(39, std) -emacro(#,宏名稱)選項(xiàng) 這個(gè)選項(xiàng)主要是用來屏蔽告警號(hào)為#的某個(gè)宏的告警,PC-Lint常用選項(xiàng),-dname=value 這個(gè)選項(xiàng)主要是用來定義一個(gè)宏的 如:-dWIN32, -dalpha=0 -sp# 表示指針的尺寸大小是#字節(jié) 如:-sp4表示指針是4個(gè)字節(jié)大小 -si# 表示int的尺寸大小是字節(jié) 如:-si4表示int型是4個(gè)字節(jié)大小 -t# 設(shè)置Tab鍵的大小為#個(gè)空格,缺省是8,PC-Lint常用選項(xiàng),-sem選項(xiàng) 這個(gè)選項(xiàng)主要是用來消除一些語義上的告警 比如說在一個(gè)函數(shù)A里面分配了內(nèi)存,這時(shí)調(diào)用了另一個(gè)函數(shù)AddNode將分配的內(nèi)存保存起來了,因此在函數(shù)A里面沒有釋放內(nèi)存,如果使用PC-Lint檢查會(huì)有內(nèi)存泄漏方面的告警,因?yàn)镻C-Lint不知道函數(shù)AddNode將分配的內(nèi)存保存起來了,要消除這個(gè)告警就要用到-sem選項(xiàng)了。假設(shè)AddNode的第2個(gè)參數(shù)是用來保存分配內(nèi)存,用法如下 -sem(AddNode, custodial(2) 這里custodial關(guān)鍵字是表示保存的意思,2是表示第2個(gè)參數(shù)。 -sem選項(xiàng)還有些其他用法,大家可以看PC-Lint自帶的pc-lint.pdf文件,里面有詳細(xì)的解析,PC-Lint常用選項(xiàng),-function(function0, function1, )選項(xiàng) 這個(gè)選項(xiàng)一般情況下主要是用來表示function1及后面省略掉的函數(shù)和function0有類似的行為。 如:-function(malloc, mymalloc1, mymalloc2)表示mymalloc1, mymalloc2和malloc有類似的行為,因?yàn)閙alloc是用來分配內(nèi)存的,所以pc-lint在檢查mymalloc1和mymalloc2時(shí)也會(huì)想檢查malloc一樣看是否有釋放掉 象上一頁里已經(jīng)定義了AddNode為保存內(nèi)存的函數(shù),如果碰到還有一個(gè)函數(shù)AddEvent也是有保存內(nèi)存的功能,我們除了可以使用-sem(AddEvent, custodial(2)外,也可以使用-function(AddNode, AddEvent), 效果是一樣的。不過要注意的是AddEvent保存內(nèi)存的參數(shù)也要和AddNode一樣是第2個(gè)。,PC-Lint常用選項(xiàng),-format選項(xiàng) 這個(gè)選項(xiàng)主要是用來設(shè)置輸出告警消息格式的,以便于可以和編輯環(huán)境格式一樣,便于自動(dòng)定位到告警對(duì)應(yīng)的源代碼 如對(duì)SourceInsight, -format選項(xiàng)的使用如下:-“format=%f %l %t %n: %m“ 這里%f表示文件名 %l表示代碼行號(hào) %t表示告警類型,如warning, error等 %n表示PC-Lint的告警號(hào) %m表示PC-Lint輸出的告警文本信息,PC-Lint常用選項(xiàng),-fallthrough 這個(gè)選項(xiàng)主要是用在switch case中沒有使用break的情況 可以在代碼中使用/lint fallthrough來消除沒有使用break的告警 -save 保存錯(cuò)誤抑制狀態(tài) 如:在代碼中使用 /lint save e429則表示從這行開始之后的代碼抑制429告警的出現(xiàn),直到使用/lint restore來進(jìn)行恢復(fù)后才會(huì)重新出現(xiàn)429告警 -restore 重新設(shè)置錯(cuò)誤抑制狀態(tài),使用-save選項(xiàng)抑制的告警將重新恢復(fù),在使用了-save選項(xiàng)后一定要記住使用-restore進(jìn)行恢復(fù),否則可能有許多告警就被屏蔽調(diào)不出現(xiàn)了。,PC-Lint常用選項(xiàng),其他一些常用選項(xiàng)還有 -elib 抑制庫頭文件的告警 -elibsym 抑制庫頭文件中某個(gè)符號(hào)的告警 -wlevel 設(shè)置告警級(jí)別 -efile 用來抑制一個(gè)或多個(gè)文件里的告警 -efunc 用來抑制一個(gè)或多個(gè)函數(shù)里的告警 +rw 設(shè)置保留關(guān)鍵字 等等。 象-efile, -wlevel這些告警不要輕易使用 這些選項(xiàng)的具體用法請(qǐng)看pc-lint.pdf文件,PC-Lint在各種環(huán)境中的集成,PC-Lint在各種環(huán)境中的集成方法原理都是一樣的,只要掌握前面講的基本用法,知道如何用命令行來檢測(cè)單個(gè)文件,一個(gè)目錄下的所有文件,許多目錄下的所有文件等,然后再結(jié)合各種環(huán)境的具體設(shè)置,就可以很方便地將PC-Lint集成到各種應(yīng)用環(huán)境中了。 下面將以VC6, SourceInsight, UltraEdit, Tornado四種環(huán)境為例講述如何集成PC-Lint,PC-Lint在各種環(huán)境中的集成,在vc環(huán)境中集成 在VC的Tools 菜單中, 按 Customize 會(huì)出現(xiàn)下一頁出現(xiàn)的對(duì)話框 先在上面的列表框里增加一個(gè)條目,里面填上PC-Lint80, 文本內(nèi)容可以是其他的,由你自己決定。 然后在Command:這一欄中輸入PC-Lint的執(zhí)行文件名,要帶上目錄 再在Arguments:一欄里填上 -u -iC:Lint std.lnt $(FileName) 這里$(FileName)表示VC窗口里當(dāng)前打開的文件名 你也可以將它改成$(FileDir)*.cpp表示檢查當(dāng)前打開文件同一目錄下的所有.cpp文件,通常用于檢查一個(gè)模塊 還可以改成AllSource.lnt, 象前面講過的一樣,AllSource.lnt是一個(gè)放置有所有文件的配置文件,這時(shí)要將-u去掉。,PC-Lint在各種環(huán)境中的集成,PC-Lint在各種環(huán)境中的集成,再在Initial Directory一欄里填上$(FileDir) 最后再將use output window打上勾就完成了將PC-Lint集成到VC環(huán)境中,PC-Lint在各種環(huán)境中的集成,在SourceInsight3.1中的集成 在SourceInsight3.1中集成PC-Lint過程如下: 1)從Options菜單中選擇“Custom Commands”命令項(xiàng)。 2)點(diǎn)Add鍵會(huì)出現(xiàn)下面的Add New Custom Command對(duì)話框 在New command name:欄中輸入“PC-lint80 ”,原則上這個(gè)名稱可以隨便起,只要你能搞清楚它的含義就可以了,然后按OK按鈕。,PC-Lint在各種環(huán)境中的集成,3)在Run欄中輸入“d:lintlint-nt -u -ic:lint std.lnt env-si %f”其中d:lint是你PC-LINT的安裝目錄, %f是表示當(dāng)前打開的文件。如果要Lint多個(gè)文件則需要使用配置文件,在配置文件里包含多個(gè)文件,將%f改成你自己的配置文件即可。 4)在Output欄中選擇“Iconic Window”、“Capture Output”。 5)在Control欄中選擇“Save Files First”、將缺省打了勾選上的“Pause When Done”改成不選擇。 6)在Source Links in Output欄中選擇“Parse Links in Output”、“File,then Line”。 7)在Pattern欄中將缺省設(shè)置改成( *) (0-9+)就大功告成了。 8)如果需要Lint當(dāng)前打開文件的同一目錄下所有文件,可以將%f改成%d*.cpp 如下圖:,PC-Lint在各種環(huán)境中的集成,PC-Lint在各種環(huán)境中的集成,在Tornado2.0環(huán)境中集成 在Tornado2.0的Tools菜單中點(diǎn)Customize后會(huì)出現(xiàn)如下一頁的對(duì)話框。 先在對(duì)話框中按Add按鈕 在Menu Text一欄中輸入PC-Lint80 在Tool Command:一欄中輸入 D:LINTlint-nt.exe -iD:Lint std.lnt $filename 你也可以象前面講過VC中集成一樣,將$filename改成$filedir*.cpp 或AllSource.lnt 在Working一欄中輸入$filedir 再將Redirect to Child Wind選上,按OK就可以了,PC-Lint在各種環(huán)境中的集成,PC-Lint在各種環(huán)境中的集成,在UltraEdit環(huán)境中集成 在Advanced菜單中選Tool Configuration . , 顯示圖如下一頁所示 在command line:中填寫: d:lintlint-nt iD:Lint std.lnt %F 在Menu Item中填寫:PC-Lint80 在Command Output中選擇: (x) Output to List Box 和 (x) Capture Output 5)按Insert 按鈕再按OK按鈕就可以了,PC-Lint在各種環(huán)境中的集成,PC-Lint常見告警分析及解決措施,PC-Lint的告警級(jí)別定義如下:,PC-Lint常見告警分析及解決措施,PC-Lint告警分為04級(jí),其中0級(jí)是內(nèi)部錯(cuò)誤或致命錯(cuò)誤,1級(jí)告警是句法錯(cuò)誤,2級(jí)告警是警告,3級(jí)是信息,4級(jí)是可選的,4級(jí)缺省是不打開的。 0級(jí)告警是不允許出現(xiàn)的,1級(jí)告警一般也是不允許出現(xiàn)的,如果出現(xiàn),說明可能PC-Lint配置上可能有問題,或者程序根本編譯不過,2級(jí)告警一般也是不能屏蔽的,2級(jí)告警很多是內(nèi)存資源沒有釋放,指針越界一類的警告,會(huì)產(chǎn)生嚴(yán)重問題,3級(jí)告警有些告警也是非常重要的,會(huì)引起嚴(yán)重問題,有些告警屬于提示信息,問題不是很大,所以3級(jí)告警里要分情況對(duì)待。 02級(jí)告警都不能使用-e選項(xiàng)進(jìn)行屏蔽,只能使用-esym,-emacro, -sem之類的選項(xiàng)進(jìn)行屏蔽;3級(jí)告警要根據(jù)具體情況,有些可以使用-e選項(xiàng)進(jìn)行屏蔽,有些不可以。 下面就對(duì)經(jīng)常遇到的一些告警進(jìn)行詳細(xì)的分析及討論解決措施。,PC-Lint常見告警分析及解決措施,告警號(hào):39 告警等級(jí):1 告警消息樣例: stl_type_traits.h(279): error 39: (Error - Redefinition of symbol _type_traits conflicts with line 271) 分析及解決措施: 可以使用-esym(39,符號(hào)名)來消除此告警,在這里可以使用 -esym(39, _type_traits,PC-Lint常見告警分析及解決措施,告警號(hào):402 告警等級(jí):2 告警消息樣例: XXX.cpp(77): error 402: (Warning - static function VOS_GetFixedStackDepth(void) (line 77) 分析及解決措施: 主要是函數(shù)原型申明為靜態(tài)的,但函數(shù)實(shí)體確漏寫了static造成,PC-Lint常見告警分析及解決措施,告警號(hào):413 告警等級(jí):2 告警消息樣例: xxx.cpp(1118): error 413: (Warning - Likely use of null pointer unknown-name in argument to operator unary * 分析及解決措施: 指針未校驗(yàn)引起,如果確認(rèn)指針可以由外部保證則可以使用ASSERT來消除此告警,PC-Lint常見告警分析及解決措施,告警號(hào):429 告警等級(jí):2 告警消息樣例: XXX.cpp(2474): error 429: (Warning - Custodial pointer pEvent (line 2459) has not been freed or returned) 分析及解決措施: AddEvent將指針pEvent保存起來,解決辦法是使用 -sem(ISystem:AddEvent,1p,custodial(1)來屏蔽此告警,這里1p是表示第1個(gè)參數(shù),custodial(1)是表示第1個(gè)參數(shù)被保留起來了。 另外還有函數(shù)遞歸調(diào)用時(shí),如果遞歸調(diào)用時(shí)使用的參數(shù)和函數(shù)參數(shù)同名也會(huì)出現(xiàn)此告警,遞歸調(diào)用時(shí)必須將參數(shù)改名。還有一種情況是在父函數(shù)里分配了內(nèi)存,傳遞到子函數(shù)后,由于子函數(shù)里有return語句有時(shí)也會(huì)產(chǎn)生429告警,這種行為非常奇怪,目前沒有找到好的消除辦法,盡量將程序結(jié)構(gòu)改成把return語句去掉就沒有這個(gè)告警了。,PC-Lint常見告警分析及解決措施,告警號(hào):522 告警等級(jí):2 告警消息樣例: error 522: (Warning - Expected void type, assignment, increment or decrement) 分析及解決措施: 單獨(dú)的*p+型可以改寫成(*p)+可以避免此告警,如果是*(p+)就沒有必要了,直接寫成p+就可以了。*p+型作為右值的話一般不會(huì)有此告警,另外函數(shù)返回值未處理有時(shí)也有此告警,PC-Lint常見告警分析及解決措施,告警號(hào):525 告警等級(jí):2 告警消息樣例: Warning 525: Negative indentation from line 312 分析及解決措施: 如果確定程序沒有問題的話,可以檢查告警 525的產(chǎn)生是否由于程序中有Tab鍵或者程序排版沒有對(duì)齊造成的,將Tab刪掉,改成空格,將排版格式對(duì)齊就可以了,PC-Lint常見告警分析及解決措施,告警號(hào):534 告警等級(jí):2 告警消息樣例: xxx.cpp(1694): error 534: (Warning - Ignoring return value of function YYY(unsigned long) (compare with line 180 分析及解決措施: 一般都是由于沒有處理函數(shù)返回值造成,如果確信函數(shù)返回值可以不處理的話,只要在不需要處理函數(shù)返回值的函數(shù)前加上(void)就可以了。,PC-Lint常見告警分析及解決措施,告警號(hào):539 告警等級(jí):2 告警消息樣例: Warning 539: Did not expect positive indentation from line 210 分析及解決措施: 除了左邊所說的問題外,如果程序中有TAB鍵,且不是8個(gè)空格的話,有時(shí)也會(huì)引起告警539的產(chǎn)生,如果消除掉左邊所說的問題還有539告警的話,則估計(jì)是由于程序中有Tab鍵造成的,將Tab刪掉,改成空格,并且排版格式要對(duì)齊就可以了。,PC-Lint常見告警分析及解決措施,告警號(hào):613 告警等級(jí):2 告警消息樣例: XXX.cpp(374): error 613: (Warning - Possible use of null pointer matrix in left argument to operator ptr+int 分析及解決措施: 通常是由于指針和整數(shù)相加造成的問題bool *matrix =(bool *)new bool(size_t)(len * len); bool *dep = matrix + row * len;可以改寫成先將地址轉(zhuǎn)換成整數(shù)形式,再相加后,再將整數(shù)形式的地址轉(zhuǎn)換為指針可以消除此告警。 另外還有指針在其他函數(shù)校驗(yàn)了,但在本函數(shù)內(nèi)沒有校驗(yàn)也會(huì)有此告警,象組建中,因?yàn)橛蠭nitialize()函數(shù)里保證那些組件指針的合法性,因此在其他函數(shù)里不再需要對(duì)這些指針做校驗(yàn),此種情況可以使用ASSERT()來消除此告警,其他情況請(qǐng)使用指針校驗(yàn)來消除此告警。,PC-Lint常見告警分析及解決措施,告警號(hào):616 告警等級(jí):2 告警消息樣例: XXX.cpp(162): error 616: (Warning - control flows into case/default) 分析及解決措施: case沒有break;語句的問題, 使用/lint -fallthrough 來屏蔽,PC-Lint常見告警分析及解決措施,告警號(hào):661 告警等級(jí):2 告警消息樣例: XXX.cpp(2560): error 661: (Warning - Possible access of out-of-bounds pointer (1 beyond end of data) by operator unary * 分析及解決措施: 內(nèi)存越界問題,如果由調(diào)用方保證,可以使用ASSERT來消除此告警,否則應(yīng)該對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn),PC-Lint常見告警分析及解決措施,告警號(hào):668 告警等級(jí):2 告警消息樣例: XXX.cpp(1211): error 668: (Warning - Possibly passing a null pointer to function memset(void *, int, unsigned int), arg. no. 1 分析及解決措施: 指針可能為null,一般都是由于沒有進(jìn)行校驗(yàn)引起,如果指針由外部可以保證的話,可以使用ASSERT消除這個(gè)告警,PC-Lint常見告警分析及解決措施,告警號(hào):672 告警等級(jí):2 告警消息樣例: XXX.cpp(353): error 672: (Warning - Possible memory leak in assignment to pointer cmpFactory:m_pLibrary) 分析及解決措施: 一個(gè)函數(shù)中申請(qǐng)了內(nèi)存在本函數(shù)中沒有釋放,在其他函數(shù)中釋放會(huì)引起這個(gè)告警可以使用-esym或-sem來消除,PC-Lint常見告警分析及解決措施,告警號(hào):685 告警等級(jí):2 告警消息樣例: XXX.cpp(2346): error 685: (Warning - Relational operator = always evaluates to true) 分析及解決措施: 簡單問題,通常是代碼里判斷條件錯(cuò)誤造成,修改代碼即可 比如定義一個(gè)char類型變量,條件判斷 讓它=127, 那么顯然判斷總是真,PC-Lint常見告警分析及解決措施,告警號(hào):708 告警等級(jí):2 告警消息樣例: XXX.cpp(1470): error 708: (Info - union initialization) 分析及解決措施: 要對(duì)聯(lián)合體的第一個(gè)成員賦值進(jìn)行初始化才不會(huì)告警不可以直接寫成union A a = 0;而應(yīng)該寫成union A a; a.First = 0;,PC-Lint常見告警分析及解決措施,告警號(hào):716 告警等級(jí):2 告警消息樣例: XXX.cpp(201): error 716: (Info - while(1) . ) 分析及解決措施: while(1)的問題,請(qǐng)使用for(;)替代,PC-Lint常見告警分析及解決措施,告警號(hào):717 告警等級(jí):2 告警消息樣例: XXX.cpp(508): error 717: (Info - do . while(0);) 分析及解決措施: 使用-emacro進(jìn)行屏蔽或者修改代碼,PC-Lint常見告警分析及解決措施,告警號(hào):725 告警等級(jí):2 告警消息樣例: XXX.cpp(311): error 725: (Info - Expected positive indentation from line 308) 分析及解決措施: 有時(shí)候是因?yàn)門ab鍵或排版格式?jīng)]有對(duì)齊造成,PC-Lint常見告警分析及解決措施,告警號(hào):731 告警等級(jí):2 告警消息樣例: XXX.cpp(331): error 731: (Info - Boolean argument to equal/not equal) 分析及解決措施: 判斷兩個(gè)bool變量或表達(dá)式是否相等或不等時(shí)會(huì)出現(xiàn)此告警,如: if (monPer15 != m_bCollectOf15) 當(dāng)出現(xiàn)此告警時(shí) 可以改為 if ( (INT)monPer15 != (INT)m_bCollectOf15)可以消除此告警,如果象這樣寫也會(huì)出現(xiàn)此告警,如if (true = m_bFlag)只要改寫為if (m_bFlag)就可以消除此告警了,PC-Lint常見告警分析及解決措施,告警號(hào):747 告警等級(jí):2 告警消息樣例: XXX.cpp(1446): error 747: (Info - Significant prototype coercion (arg. no. 2) int to bool) SetCrossTR(pSetting, period, false);/ 清除性能越限標(biāo)記。 分析及解決措施: 類型轉(zhuǎn)換問題,如SetThisCrossTR(pSetting, false);有此告警,改寫成SetThisCrossTR(pSetting, (bool)false);則消除了這個(gè)告警,一般情況下盡量避免使用bool型變量,PC-Lint常見告警分析及解決措施,告警號(hào):774 告警等級(jí):2 告警消息樣例: XXX.cpp(146): error 774: (Info - Boolean within if always evaluates to True 分析及解決措施: bool表達(dá)式總是真值或總是假值 void claNameManager:ManagerDestroy() ASSERT(m_pNameTable != NULL); m_pNameTable-HashDestroy(); if (m_pNameTable != NULL) delete m_pNameTable; m_pNameTable = NULL; 明顯應(yīng)該將HashDestroy放到if判斷里面,并且要?jiǎng)h除掉ASSERT那一行,PC-Lint常見告警分析及解決措施,告警號(hào):785 告警等級(jí):2 告警消息樣例: XXX.cpp(639): error 785: (Info - Too few initializers for aggregate) 分析及解決措施: 通常時(shí)給數(shù)組初始化賦值時(shí)沒有給所有的賦值造成,可以將其他的也賦值完來消除這個(gè)問題。這個(gè)告警目前在平臺(tái)中非常多,即使使用-e參數(shù)屏蔽也屏蔽不了,還是會(huì)出現(xiàn),這就要求編碼時(shí)養(yǎng)成良好的習(xí)慣。,PC-Lint常見告警分析及解決措施,告警號(hào):786 告警等級(jí):2 告警消息樣例: XXX.cpp(2451): error 786: (Info - String concatenation within initializer) 分析及解決措施: 同一個(gè)字符串分成多行書寫時(shí),使用雙引號(hào)進(jìn)行連接出的告警,此告警主要是提示是否多個(gè)字符串在中間忘了用標(biāo)點(diǎn)符號(hào)格開,有時(shí)候有些字符串很長,需要分成多行書寫時(shí)也會(huì)使用多個(gè)雙引號(hào),這時(shí)可以使用/lint save -786, /lint restore來屏蔽,PC-Lint常見告警分析及解決措施,告警號(hào):794 告警等級(jí):2 告警消息樣例: XXX.cpp(934): error 794: (Info - Conceivable use of null pointer p in left argument to operator ptr-ptr 分析及解決措施: 同告警613一樣,指針未校驗(yàn)引起,如果校驗(yàn)是在函數(shù)外部保證的,可以使用ASSERT來避免此告警,PC-Lint常見告警分析及解決措施,告警號(hào):796 告警等級(jí):2 告警消息樣例: XXX.cpp(396): error 796: (Info - Conceivable access of out-of-bounds pointer (1 beyond end of data) by operator unary *) 分析及解決措施: 指針有可能越界的問題,通常是由于沒有校驗(yàn)分配空間長度引起,PC-Lint常見告警分析及解決措施,告警號(hào):797 告警等級(jí):2 告警消息樣例: XXX.cpp(396): error 797: (Info - Conceivable creation of out-of-bounds pointer (2 beyond end of data) by operator + 分析及解決措施: 指針未做校驗(yàn)有可能引起越界,比如定義一個(gè)指針指向字符串,但是在使用p+操作時(shí)沒有先判斷指針是否會(huì)越界 如可以判斷*p != 0或校驗(yàn)指針和起點(diǎn)地址差是否超過預(yù)先分配的空間長度。,PC-Lint常見告警分析及解決措施,告警號(hào):801 告警等級(jí):3 告警消息樣例: XXX.cpp(340): error 801: (Info - Use of goto is deprecated) 分析及解決措施: 使用了goto語句造成,有些人使用goto語句不規(guī)范,如果屏蔽會(huì)引發(fā)其他程序結(jié)構(gòu)不合理的問題,所以在程序中還是不要使用goto語句。,PC-Lint常見告警分析及解決措施,告警號(hào):818 告警等級(jí):3 告警消息樣例: XXX.c(323) : Info 818: Pointer parameter pGraph (line 206) could be declared as pointing to const 分析及解決措施: 這個(gè)問題產(chǎn)生主要是因?yàn)楹瘮?shù)參數(shù)在函數(shù)中為只讀的,可以申明為const類型,但是如果使用以下形式: typdef struct POINT_t int x; int y; POINT, *LPPOINT; int InsertPoint(LPPOINT pPoint); 如果使用LPPOINT類型的指針類型來定義參數(shù)的話,即使改為const LPPOINT pPoint也仍然會(huì)有告警. 必須改為 const POINT *pPoint才能消除此告警,PC-Lint常見告警分析及解決措施,告警號(hào):825 告警等級(jí):3 告警消息樣例: XXX.cpp(2243): error 825: (Info - control flows into case/default without -fallthrough comment) 分析及解決措施: 使用/lint -fallthrough在代碼里進(jìn)行注釋可以消除此告警,PC-Lint常見告警分析及解決措施,告警號(hào):826 告警等級(jí):3 告警消息樣例: XXX.cpp(290): error 826: (Info - Suspicious pointer-to-pointer conversion (area too small) 分析及解決措施: 這個(gè)問題的產(chǎn)生通常是由于內(nèi)存越界造成或?qū)⒁粋€(gè)空間小的指針轉(zhuǎn)換為一個(gè)空間大的指針造成,xxx.cpp中的代碼為: pTailCheck = (DWORD *)(CHAR *)pBuf + pPtInfo-BufSize - VOS_PT_BUF_TAIL_LEN); 實(shí)際上是將 CHAR *轉(zhuǎn)換為DWORD *造成的。 可以在本行前使用注釋/*lint -save -e826 */屏蔽,在本行后再使用/*lint -restore */恢復(fù)的辦法,PC-Lint常見告警分析及解決措施,告警號(hào):834 告警等級(jí):3 告警消息樣例: int x = (rect.Width() - cxIcon + 1) / 2; XXX.cpp(178) : Info 834: Operator - followed by operator + is confusing. Use parentheses. 分析及解決措施: 這個(gè)告警很簡單,主要是需要使用括號(hào)將表達(dá)式按運(yùn)算優(yōu)先順序括起來以方便閱讀,PC-Lint常見告警分析及解決措施,告警號(hào):1065 告警等級(jí):3 告警消息樣例: XXX.cpp(657): error 1065: (Error - Symbol VOS_TerminateHandle(void) not declared as “C“ conflicts with line 510) 分析及解決措施: 在頭文件里被申明為extern “C“,但在cpp文件里函數(shù)前沒有加上extern “C“關(guān)鍵字造成,PC-Lint常見告警分析及解決措施,告警號(hào):1540 告警等級(jí):3 告警消息樣例: XXX.cpp(495): error 1540: (Warning - Pointer member CXXXObject:m_pCrc4Fecses (line 76, XXXP.h, module YYY.cpp) neither freed nor zeroed by destructor) 分析及解決措施: 析構(gòu)函數(shù)中沒有對(duì)成員指針變量進(jìn)行內(nèi)存釋放或清零操作, 修改代碼即可,PC-Lint常見告警分析及解決措施,告警號(hào):1732 告警等級(jí):3 告警消息樣例: XXX.cpp(48): error 1732: (Info - new in constructor for class FEC_CUR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論