PREfastStepbyStepV21CHTWord下载.docx
- 文档编号:1360503
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:29
- 大小:270.25KB
PREfastStepbyStepV21CHTWord下载.docx
《PREfastStepbyStepV21CHTWord下载.docx》由会员分享,可在线阅读,更多相关《PREfastStepbyStepV21CHTWord下载.docx(29页珍藏版)》请在冰点文库上搜索。
如何建置PREfast範例6
如何顯示PREfast結果7
PREfast缺失記錄檢視器8
PREfast缺失記錄文字輸出10
分析PREfast結果11
篩選PREfast結果12
減少雜訊13
範例:
解讀PREfast結果14
範例1:
未初始化的變數和NULL指標14
範例2:
隱含(implicit)的評估順序15
範例3:
使用不正確的IRQL呼叫函式15
範例4:
在錯的地方報告的有效錯誤16
範例5:
根據函式特性推斷的用途18
範例6:
不正確的列舉型別18
PREfast最佳作法20
資源20
免責聲明
這是一份初步的文件,在所述的軟體最後商業發行之前,本文件內容可能會有實質上的變更。
本文件所包含資訊代表MicrosoftCorporation在截至發行日期為止,對於所討論問題的當時觀點。
由於Microsoft必須反應不斷變化的市場情況,因此本文件內容不應該當做Microsoft一方的承諾,並且Microsoft對於在發行日期之後提供的任何資訊,也無法保證其準確性。
這份白皮書僅供資訊參考之用。
MICROSOFT不對本文件所含的資訊擔保責任,無論其為明示、默示或法定者。
遵守所有適用的著作權法是使用者的責任。
在不限制任何依著作權本得享有之權利,未經MicrosoftCorporation書面許可,貴用戶不得為任何目的使用任何形式或方法(電子形式、機械形式、影印、記錄或其他方式)複製或傳送本文件的任何部份,也不得將本文件的任何部份儲存或放入檢索系統(aretrievalsystem)。
Microsoft可能擁有本文件所提及內容中所含之專利權、專利優先權、商標、著作權,或其他智慧財產權。
除非Microsoft書面授權合約所明示規定者外,提供本文件並不授予貴用戶上述專利權、商標、著作權或其他智慧財產權。
©
2005MicrosoftCorporation.Allrightsreserved.
Microsoft、Windows與WindowsServer係MicrosoftCorporation在美國及(或)其他國家/地區的商標或註冊商標。
本文件中所提實際公司和產品,可能為各所有人所有之商標。
簡介
它會逐一巡訪各個函式(包括很少在執行階段執行的程式碼路徑),以模擬所有可能程式碼路徑的執行過程。
PREfast根據一套規則,檢查每條可能的程式碼路徑,以識別可能的錯誤或不良的程式碼編寫方式,並記錄顯示違反規則的程式碼警告。
您可以使用PREfast分析核心模式驅動程式及其他核心模式元件。
只要忽略任何特定的核心警告,您也可以使用PREfast分析使用者模式驅動程式。
PREfast僅授權做為驅動程式開發工具之用。
您不應將PREfast用於測試使用者模式應用程式。
PREfast主要是設計用以分析針對x86平台所撰寫的32位元程式碼。
但是,PREfast本身可執行於支援MicrosoftWindows-32-bit-on-Windows-64-bit(WOW64)的系統。
雖然PREfast看不到透過條件式編譯所排除的任何程式碼,但只要將程式碼編譯為32位元,您還是可以用它來分析64位元驅動程式碼。
若要讓PREfast能夠分析程式碼,您只需編譯程式碼,而不需加以連結或執行。
程式碼可以用C或C++撰寫。
這份文件介紹PREfast2.1版,並提供執行PREfast的指示、解讀PREfast結果的要領,以及在開發階段使用PREfast的祕訣。
如需瞭解PREfast版本2.1的可用性,請參閱列於本文件結尾的資源。
注意
從使用者觀點來看,PREfast2.1和PREfast1.5之間主要的差異在於,PREfast2.1只有一個版本(不需要在版本之間切換),及它會使用/drivers命令列參數來啟用驅動程式特定規則。
熟悉PREfast1.5的開發人員應該檢閱本文件<如何執行PREfast>一節,以取得詳細資訊。
PREfast2.1的其他差異反映其內部架構中的變更,這種變更產生了更有效率的作業,並降低出現無謂訊息的機會。
為什麼要使用PREfast
PREfast是極具價值的核心模式開發工具,因為它能夠發現難以測試及偵錯的錯誤,並識別可能為無效的假設。
一旦程式可供編譯,您便能立即使用PREfast,所以它會找到可能透過程式傳播的錯誤假設。
不論問題是簡單的「複製並貼上」錯誤,或是可能造成被迫重新設計程式的複雜設計缺失,只要及早發現錯誤就可以減少不得不做的修正次數,並且讓您在開發程序中,趁錯誤還容易修復且對開發時程影響尚輕的時候,儘早進行修正。
在開發階段尋找這樣的錯誤遠比嘗試透過測試來尋找錯誤,或是在客戶發現發行產品中的錯誤後,被迫進行現場修復,要來得便宜多了。
例如:
未初始化的變數可能造成若干嚴重的潛在問題,而應該及時更正。
PREfast可以識別可能會在後續程式碼中使用未初始化變數的情況。
例如,在迴圈內初始化的變數會在迴圈執行0次的情況下,保持未初始化。
如果PREfast無法將這樣的程式碼路徑排除在外,它就會發出警告。
PREfast可以偵測原始程式碼中,可能未受保護的浮點運算式。
核心模式驅動程式必須使用適當的函式呼叫,保護硬體的浮點運算狀態。
如果未能做到這點,則可能造成資料損毀和無緣無故的當機,這些情況將很難透過傳統的方式來偵錯。
請注意,我們說的是「無法將這樣的程式碼路徑排除在外」,而不是「尋找這樣的程式碼路徑」。
PREfast會逐一巡訪各個函式分析程式碼,所以沒有關於全域狀態或目前函式外部所執行(可能影響指定程式碼路徑)工作的資訊。
結果所致,PREfast會發出一些可能並不代表程式碼中實際錯誤的警告。
這些警告通常稱為「誤診」(FalsePositives)或「雜訊」(Noise)。
「誤診」可能仍然有其價值,因為它們經常可以認出程式設計人員所做的假設。
繼續就迴圈內初始化變數的範例來討論,對程式碼瞭若指掌的程式設計人員可能知道迴圈至少會執行一次,或其他某個函式會將變數安全地初始化。
在此情況下,PREfast的警告就是「雜訊」,但它會指出變數一定會安全地初始化的假設。
即使這個假設是安全的,加入ASSERT也頗有助益,因為這樣做可以讓接手的程式設計人員知道這個假設,並且可以利用檢查建置所提供的通知,避免宣告失敗。
如果本機程式碼未能向PREfast保證程式碼安全無虞,PREfast就會將程式碼當做是不安全來進行處理。
例如,假設PREfast遇到解除指標參考的程式碼路徑。
指標會不會是NULL?
如果可以根據某種理由懷疑它可能如此(例如,前面的程式碼會測試是否為NULL,但後續的程式碼卻以不安全的方式存取指標),PREfast就會發出有關解除NULL指標參考的警告。
如果沒有理由懷疑指標可能會是NULL,那麼PREfast便不會發出警告。
PREfast不會尋找所有可能的錯誤,或甚至它被設計用以偵測的一切可能錯誤實例,所以通過PREfast的程式碼不一定沒有任何錯誤。
但PREfast在偵測許多難以藉其他方式找到的錯誤方面非常有效,並且它對錯誤所做的報告通常會使錯誤易於修復。
這可幫助您釋出測試資源,全力尋找並修復影響更為深鉅的錯誤。
PREfast的偵測範圍
程式碼一旦可供編譯,PREfast便能立即開始偵測程式碼中的可能錯誤。
它可以偵測許多重大的錯誤類別,例如:
記憶體:
可能的記憶體流失、解除參考的NULL指標、未初始化的記憶體存取、核心模式堆疊的過度使用,和集區標記(pooltags)的不當使用。
資源:
沒能即時釋放資源(例如鎖定),呼叫某些函式時應該保留的資源,以及呼叫其他函式時不應該繼續保留此資源。
函式使用方式:
可能不正確的特定函式用法、可能不正確的函式引數、未嚴格檢查型別的函式可能發生的引數型別不相符、可能使用某個過時函式的情況,以及以可能不正確的IRQL的函式呼叫。
浮點運算狀態:
保護驅動程式中浮點運算硬體狀態時發生的失敗,以及在使用不同IRQL儲存浮點運算狀態後,嘗試進行還原的動作。
優先順序規則:
由於C的優先順序規則所致,程式碼可能不會依照程式設計人員預定的方式執行。
核心模式程式碼編寫方式:
可能造成錯誤的程式碼編寫方式,例如,修改不透明(opaque)的記憶體描述元清單(MDL)結構、未能檢查呼叫函式所設定的變數值,以及使用C/C++字串操作函式,而不使用Ntstrsafe.h中定義的安全字串函式。
驅動程式特定的程式碼編寫方式:
在核心模式驅動程式中,經常成為錯誤來源的特定作業,例如:
在沒有修改成員及儲存指標到字串或結構引數的情況下,複製了整個I/O要求封包(IRP),而不是複製DriverEntry常式中的引數。
使用PREfast
若要在建置環境視窗中執行PREfast,您可以輸入prefast這個字,後面接著平常所用的建置命令。
若要搭配驅動程式特定規則來執行PREfast,您必須使用/drivers參數,如本文件稍後所說明。
PREfast會攔截建置(build)公用程式對一般cl編譯器(cl.exe)的呼叫。
prefast命令所做的,即是執行cl攔截編譯器,以分析原始程式碼,然後建立錯誤的記錄檔及警告訊息。
PREfast分別對原始程式碼中的每個函式進行操作。
它會產生由一次檢查所有檔案所得的單一聯合清單,以及去除由表頭檔案所產生的重複錯誤及警告。
PREfast接著呼叫一般編譯器以產生平常所見的build輸出。
產生的物件檔案與以一般建置命令所產生的檔案相同。
本節將簡要介紹PREfast命令列及PREfast缺失記錄檢視器。
如果您已熟悉PREfast的使用方式,不妨略過本節。
如需有關如何使用PREfast的詳細資訊,請參閱與WindowsDDK一併安裝的PREfast線上文件集。
安裝PREfast的位置
PREfast會與WindowsDDK建置環境一同安裝。
您不需要執行任何其他步驟安裝PREfast。
PREfast線上文件集會與其他WindowsDDK線上文件集一併安裝:
PREfast線上文件集會安裝在%winddk%\Help\。
若要顯示這份線上文件集,請按一下[開始],依序指向[所有程式]、[DevelopmentKits](開發套件)、[WindowsDDK]、[Help](說明)、[PREfast],然後按一下[PREfastDocumentation](PREfast文件)。
其他PREfast文件(包括有關PREfast與驅動程式特定規則的特定資訊)會安裝在PREfast\Doc目錄(%winddk%\bin\x86\prefast\doc\)。
如何執行PREfast
若要在build環境視窗中執行PREfast,請輸入prefast,並在後面接著平常所用的build命令。
如果您在驅動程式原始程式碼上執行PREfast,請務必使用/drivers參數來套用驅動程式特定規則。
PREfast會攔截對cl編譯器的呼叫,以分析要進行編譯的程式碼,然後以XML格式,將分析結果寫入記錄檔。
您的程式碼會照常進行build,PREfast不會變更原始程式碼或build程序的結果。
執行PREfast
1.開啟build環境視窗。
2.使用cd命令,設定build原始程式碼所需要的預設目錄。
例如,如果要build驅動程式,您最好將預設目錄設定為包含sources檔案或dirs檔案的目錄。
3.輸入prefastbuild,後面接著build程式碼所需要的任何建置公用程式參數。
例如,如果要在驅動程式原始程式碼上執行PREfast,請輸入:
prefast/driversbuild-cZ
PREfast會分析要進行編譯的程式碼,然後將分析結果寫入記錄檔。
預設的記錄檔Defects.xml會寫入%winddk%\bin\x86\prefast\。
若要將記錄檔寫入其他位置,請使用/LOG=參數搭配prefast命令。
如何建置PREfast範例
PREfast會與原始程式碼範例的目錄一同安裝,範例中包含刻意製造以觸發各種PREfast警告的錯誤。
您可以使用PREfast範例驗證PREfast安裝,以及試驗PREfast缺失記錄檢視器。
\driver子目錄包含驅動程式原始程式碼,會更詳細地說明驅動程式特定規則。
為了與觸發警告的程式碼做比較,範例程式碼檔案Boundsexamples.cpp包含幾個未含錯誤,而不致觸發任何PREfast警告的函式。
請在原始程式碼中尋找名稱中含有「_ok」的函式。
建置PREfast範例
2.將PREfastExamples目錄設為預設目錄。
例如,如果C:
\DDK是DDK的安裝目錄,而您想要使用驅動程式特定規則來buildPREfast的範例,請在命令提示中輸入下列命令:
cdc:
\ddk\bin\x86\prefast\examples
3.輸入prefastbuild命令以build範例,如下所示:
prefast/driversbuild-cZ
下列命令視窗輸出顯示buildPREfast範例的結果。
編譯錯誤會反映範例中刻意製造的錯誤。
C:
\WINDDK\bin\x86\prefast\examples>
prefast/driversbuild-cz
-------------------------------------------------------------
Microsoft(R)PREfastVersion2.1.4504for80x86.
Copyright(C)MicrosoftCorporation.Allrightsreserved.
BUILD:
Adding/YtoCOPYCMDsoxcopyopswon'
thang.
Objectrootsetto:
==>
objfre_wxp_x86
CompileandLinkfori386
Examiningc:
\winddk\bin\x86\prefast\examplesdirectoryforfilestocompile.
c:
\winddk\bin\x86\prefast\examples
Compiling(NoSync)c:
\winddk\bin\x86\prefast\examplesdirectory
Compiling-bounds-examples.cppfori386
Compiling-pft-example1.cppfori386
Compiling-pft-example2.cppfori386
Compiling-pft-example3.cppfori386
Compiling-precedence-examples.cppfori386
Compiling-hresult-examples.cppfori386
Compiling-drivers-examples.cppfori386
Compiling-generatingcode...fori386
errorsindirectoryc:
pft-example2.cpp(17):
errorC4700:
localvariable'
a'
usedwithouthavingbeeninitialized
pft-example1.cpp(14):
j'
BuildingLibrary-objfre_wxp_x86\i386\prefastexamples.libfori386
LIB:
errorLNK1181:
cannotopeninputfile'
objfre_wxp_x86\i386\pft-example1.obj'
Done
15filescompiled-2Errors
1librarybuilt-1Error
Error:
Thebuildcommand'
build'
returnedstatus'
1'
.
Removingduplicatedefectsfromthelog...
PREfastreported41defectsduringexecutionofthecommand.
EnterPREFASTLISTtolistthedefectlogastextwithintheconsole.
EnterPREFASTVIEWtodisplaythedefectloguserinterface.
如果您在不使用/drivers參數的情況下buildPREfast範例,PREfast便會忽略drivers-examples.cpp中的特定驅動程式錯誤,而只報告39個缺失。
如何顯示PREfast結果
您可以使用下列任一方式,顯示PREfast分析的結果:
若要在PREfast缺失記錄檢視器中顯示記錄檔內容,請使用prefastview命令。
若要在建置環境命令視窗中,將記錄檔內容(以XML儲存)以文字輸出方式列示,請使用prefastlist命令。
PREfast缺失記錄檢視器(PREfastDefectLogViewer)
PREfast檢視器提供圖形使用者介面,可用以檢視PREfast輸出、篩選輸出以便顯示或隱藏特定訊息,以及檢視加註的原始程式碼以便查看產生指定警告的分析路徑。
在PREfast缺失記錄檢視器中顯示PREfast結果
1.如本節前面所述,在原始程式碼上執行PREfast。
2.輸入prefastview。
PREfast會在[MessageList](訊息清單)畫面中顯示PREfast缺失記錄檔。
訊息清單畫面
圖1顯示[MessageList](訊息清單)畫面,它列出搭配驅動程式特定規則,使用PREfast建置範例所產生的結果。
PREfast[MessageList](訊息清單)畫面頂端的版本號碼表示正在顯示記錄的PREfast版本。
圖1.訊息清單畫面
在[MessageList](訊息清單)畫面中,您可以:
按一下欄標題([Description](描述)、[WarningNumber](警告編號)、[SourceLocation](原始碼位置)或[InFunction](函式))以排序螢幕上的訊息。
按兩下訊息以開啟[ViewAnnotatedSource](檢視加註的原始程式碼)畫面,並顯示該訊息的程式碼。
按一下[Filter](篩選)按鈕顯示經過篩選的檢視,即可從預先定義的清單中選擇篩選條件,或顯示及隱藏個別訊息。
檢視加註的原始程式碼畫面
如果按兩下[MessageList](訊息清單)畫面中的訊息,便會顯示[ViewAnnotatedSource](檢視加註的原始程式碼)畫面。
[ViewAnnotatedSource](檢視加註的原始程式碼)畫面會針對觸發訊息的錯誤,顯示加註的原始程式碼,而其前後仍保留幾行程式碼,以便瞭解上下的關連。
圖2顯示[ViewAnnotatedSource](檢視加註的原始程式碼)畫面。
圖2.檢視加註的原始程式碼畫面
在[ViewAnnotatedSource](檢視加註的原始程式碼)畫面中,您可以:
按一下[Prev](上一個)或[Next](下一個)以顯示其他訊息的加註原始程式碼,或
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PREfastStepbyStepV21CHT