欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

用于靜態(tài)分析的中間表示結構的制作方法

文檔序號:6435319閱讀:163來源:國知局
專利名稱:用于靜態(tài)分析的中間表示結構的制作方法
技術領域
本申請涉及對中間表示的靜態(tài)分析。
背景技術
為了生成高質量的軟件程序,對軟件程序的功能性進行測試和分析是非常重要的。動態(tài)分析涉及在精心選擇的實例上實際運行程序以驗證該程序的真實行為。然而,執(zhí)行動態(tài)分析并不是經(jīng)??尚械模貏e是當程序將運行的環(huán)境的個體性未知或變化時。僅當程序完成(可能使用短(stub)類和函數(shù))并能運行時才進一步執(zhí)行動態(tài)分析。靜態(tài)分析在不運行源或程序代碼的情況下來對它們進行檢查。路徑敏感的數(shù)據(jù)流分析試圖徹底且準確地預測在抽象域上的每條路徑。這對診斷例如安全或可定域性之類的問題非常有用。在這種路徑敏感的數(shù)據(jù)流分析中,被稱為“客戶端”的組件可以收集針對該客戶端適于檢測的問題而特別定義的數(shù)據(jù)。給予客戶端一個中間表示的程序,它由程序語句和控制流邊組成??蛻舳穗S后為給予輸入狀態(tài)的每個語句計算輸出狀態(tài)。然而,一些函數(shù)的中間表示可以丟失、太過復雜或類屬的,使得客戶端做出或多或少的精確假設,這會導致檢測到錯誤的缺陷(“噪聲”),以及漏檢真正的缺陷。有時,每次僅分析整個程序的一部分以使得分析可縮放。在這種情況中,丟失外部組件會使得工具過度近似可能的程序行為、引導它們找到錯誤的缺陷(“噪聲”)或丟失真正的缺陷。例如,對外部定義的類的屬性的設置和取得在工具想到的屬性的值可能不同于先前在相同缺陷路徑上設置的屬性的值時會引起噪聲。對頻繁使用的具有公知的行為的外部組件,例如.Net或STL數(shù)據(jù)結構來說,通常具有太過復雜并且太過龐大而無法完整包括在分析中的代碼。然而,如果分析完全通過例如假設任何都可能作為調(diào)用外部應用程序接口(API)的結果來近似它們,則它們將引起大量的噪聲(或真正缺陷的漏檢)。例如,C++STL映射通常被實現(xiàn)為平衡樹。要從各種操作的復雜結構中引導出插入(“a”,l),其后是檢索(“a”)返回1(假設沒有其他代碼同時運行)是異常困難的。. Net形式的通用函數(shù)參數(shù)化中間表示,其中語句被依據(jù)類型來參數(shù)化。這樣的中間表示通常具有類屬相關的語句,它們可以取決于具體的實例化而具有不同的含義。例如, 創(chuàng)建參數(shù)化類型的對象對于具有參考類型的實例化來說意味著分配堆對象(heap object) 和調(diào)用構造函數(shù),而對于具有值類型的實例來說則意味著創(chuàng)建和初始化棧變量。隨后,強制工具進入在對經(jīng)實例化的類屬API的每次調(diào)用時取決于具體的實例化來理解類屬相關的語句的含義的復雜邏輯。

發(fā)明內(nèi)容
在此描述的至少一個實施例涉及對源或程序代碼的中間表示的分析。根據(jù)一個實施例,訪問并靜態(tài)地分析源或程序代碼的初始表示的初始版本。對于該初始版本的一個或多個部分,分析組件查詢提供了對應于該部分的補充中間表示的分析時間解決(analysis-time resolution)組件。該補充中間表示提供了有關該部分的進一步的清晰性,并且還被分析。如果找到缺陷,就報告它們。根據(jù)一個實施例,分析時間解決組件從靜態(tài)地分析程序的中間表示的分析組件接收查詢。分析時間解決組件訪問有關程序的信息,所述信息被用于生成程序的補充中間表示,該補充中間表示能夠更容易被用于分析所述程序的運作。本發(fā)明內(nèi)容并不旨在標識出所要求保護的主題的關鍵特征或必要特征,也不旨在用于幫助確定所要求保護的主題的范圍。


為了描述能夠獲得上述和其它優(yōu)點和特征的方式,各實施例的更具體的描述將通過參考各附圖來呈現(xiàn)??梢岳斫猓@些附圖只描繪了樣本實施例,并且因此不被認為是對其范圍的限制,將通過使用附圖并利用附加屬性和細節(jié)來描述和解釋各實施例,在附圖中圖1示出可用于采用此處所描述的各實施例的示例計算系統(tǒng);圖2示出在其中使用中間表示來靜態(tài)地分析代碼并在其中向分析時間解決組件查詢補充中間表示的環(huán)境。圖3說明了用于靜態(tài)地分析源或程序代碼的中間表示的方法的流程圖。圖4示出分析時間解決組件通過生成補充的中間表示來支持對源或程序代碼的靜態(tài)分析的方法的流程圖。
具體實施例方式根據(jù)在此描述的實施例,描述了對源或程序代碼的中間表示的分析。訪問并靜態(tài)地分析源或程序代碼的初始中間表示的初始版本。對于該初始版本的一個或多個部分,分析組件查詢提供了對應于該部分的補充中間表示的分析時間解決組件。該補充的中間表示提供了有關該部分的進一步的清晰性,并且還被分析。如果找到缺陷,就報告它們。首先, 將參考圖1來描述關于計算系統(tǒng)的某些介紹性討論。然后,將參考圖2至4來描述靜態(tài)分析的實施例。首先,參考圖1來描述關于計算系統(tǒng)的介紹性討論。計算系統(tǒng)現(xiàn)在越來越多地采取多種多樣的形式。計算系統(tǒng)可以例如是手持式設備、電器、膝上型計算機、臺式計算機、大型機、分布式計算系統(tǒng),或者甚至通常不被視為計算系統(tǒng)的設備。在本說明書以及權利要求書中,術語“計算系統(tǒng)”被廣義地定義為包括包含至少一個處理器以及其上能含有可由處理器執(zhí)行的計算機可執(zhí)行指令的存儲器的任何設備或系統(tǒng)(或其組合)。存儲器可以采取任何形式,并可以取決于計算系統(tǒng)的特性和形式。計算系統(tǒng)可以分布在網(wǎng)絡環(huán)境中,并可包括多個組分計算系統(tǒng)。如圖1所示,在其最基本的配置中,計算系統(tǒng)100通常包括至少一個處理單元102 和存儲器104。存儲器104可以是物理系統(tǒng)存儲器,該物理系統(tǒng)存儲器可以是易失性、非易失性、或兩者的某種組合。術語“存儲器”在此也可用來指諸如物理存儲介質等非易失性大容量存儲。如果計算系統(tǒng)是分布式的,則處理、存儲器和/或存儲能力也可以是分布式的。 如此處所使用的那樣,術語“模塊”或“組件”可以指在計算系統(tǒng)上執(zhí)行的軟件對象或例程。 此處所描述的不同組件、模塊、引擎,以及服務可以實現(xiàn)為在計算系統(tǒng)上執(zhí)行的對象或進程
5(例如,作為分開的線程)。在隨后的描述中,參考由一個或多個計算系統(tǒng)執(zhí)行的動作描述了各實施例。如果這樣的動作是以軟件實現(xiàn)的,則執(zhí)行動作的相關聯(lián)計算系統(tǒng)的一個或多個處理器響應于已經(jīng)執(zhí)行了計算機可執(zhí)行指令來引導計算系統(tǒng)的操作。這樣的操作的示例涉及對數(shù)據(jù)的操縱。計算機可執(zhí)行指令(以及被操縱的數(shù)據(jù))可以存儲在計算系統(tǒng)100的存儲器104中。 計算系統(tǒng)100還可包含允許計算系統(tǒng)100例如通過網(wǎng)絡110與其他消息處理器通信的通信信道108。計算系統(tǒng)100還可以包括用于將用戶界面顯示給用戶的顯示器112。如以下更詳細討論地,本發(fā)明的各實施例可包括或利用包括諸如例如,一個或多個處理器和系統(tǒng)存儲器之類的計算機硬件的專用或通用計算機。本發(fā)明范圍內(nèi)的各實施例還包括用于承載或存儲計算機可執(zhí)行指令和/或數(shù)據(jù)結構的物理和其他計算機可讀介質。 這些計算機可讀介質可以是可由通用或專用計算機系統(tǒng)訪問的任何可用介質。存儲計算機可執(zhí)行指令的計算機可讀介質是物理存儲介質。承載計算機可執(zhí)行指令的計算機可讀介質是傳輸介質。由此,作為示例而非限制,本發(fā)明的各實施例可包括至少兩種完全不同的計算機可讀介質計算機存儲介質和傳輸介質。 計算機存儲介質包括RAM、ROM、EPROM、CD-ROM或其他光盤存儲,磁盤存儲或其他磁存儲設備,或可用于存儲計算機可執(zhí)行指令或數(shù)據(jù)結構形式的所需程序代碼裝置且可由通用或專用計算機訪問的任何其他介質?!熬W(wǎng)絡”被定義為允許在計算機系統(tǒng)和/或模塊和/或其他電子設備之間傳輸電子數(shù)據(jù)的一個或多個數(shù)據(jù)鏈接。當信息通過網(wǎng)絡或另一個通信連接(硬連線、無線、或者硬連線或無線的組合)傳輸或提供給計算機時,該計算機將該連接適當?shù)匾暈閭鬏斀橘|。傳輸介質可包括可用于承載計算機可執(zhí)行指令或數(shù)據(jù)結構形式的所需程序代碼裝置且可由通用或專用計算機訪問的網(wǎng)絡和/或數(shù)據(jù)鏈接。上述的組合也應被包括在計算機可讀介質的范圍內(nèi)。此外,在到達各種計算機系統(tǒng)組件之后,計算機可執(zhí)行指令或數(shù)據(jù)結構形式的程序代碼裝置可從傳輸介質自動轉移到計算機存儲介質(或者相反)。例如,通過網(wǎng)絡或數(shù)據(jù)鏈接接收到的計算機可執(zhí)行指令或數(shù)據(jù)結構可被緩存在網(wǎng)絡接口控制器(例如,“NIC”) 內(nèi)的RAM中,然后最終被傳輸?shù)接嬎銠C系統(tǒng)RAM和/或計算機系統(tǒng)處的較不易失性的計算機存儲介質。因而,應當理解,計算機存儲介質可被包括在同樣(或甚至主要)利用傳輸介質的計算機系統(tǒng)組件中。計算機可執(zhí)行指令例如包括,當在處理器處執(zhí)行時使通用計算機、專用計算機、或專用處理設備執(zhí)行某一功能或某組功能的指令和數(shù)據(jù)。計算機可執(zhí)行指令可以是例如二進制代碼、諸如匯編語言之類的中間格式指令、或甚至源代碼。盡管用結構特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權利要求書中定義的主題不必限于上述特征或動作。相反,上述特征和動作是作為實現(xiàn)權利要求的示例形式而公開的。本領域的技術人員將理解,本發(fā)明可以在具有許多類型的計算機系統(tǒng)配置的網(wǎng)絡計算環(huán)境中實施,這些計算機系統(tǒng)配置包括個人計算機、臺式計算機、膝上型計算機、消息處理器、手持式設備、多處理器系統(tǒng)、基于微處理器的或可編程消費電子設備、網(wǎng)絡PC、小型計算機、大型計算機、移動電話、PDA、尋呼機、路由器、交換機等等。本發(fā)明也可在其中通過網(wǎng)絡鏈接(或者通過硬連線數(shù)據(jù)鏈接、無線數(shù)據(jù)鏈接,或者通過硬連線和無線數(shù)據(jù)鏈接的組合)的本地和遠程計算機系統(tǒng)兩者都執(zhí)行任務的分布式系統(tǒng)環(huán)境中實施。在分布式系統(tǒng)環(huán)境中,程序模塊可位于本地和遠程存儲器存儲設備中。圖2示出了表示其中可以使用在此所述的原則的示例環(huán)境的環(huán)境200??梢栽趫D 1的計算系統(tǒng)100上實現(xiàn)或跨多個這樣的計算系統(tǒng)分布所有或部分環(huán)境200。圖3說明了用于靜態(tài)地分析源代碼的中間表示的方法的流程圖?,F(xiàn)在將頻繁地參考圖2的環(huán)境200來描述圖3的方法。根據(jù)圖3的方法,訪問源代碼的中間表示的初始版本(動作301)。在某一點上, 從源代碼生成初始表示。盡管中間表示的這種生成可以由靜態(tài)地分析中間表示的相同的計算系統(tǒng)來執(zhí)行,但這并不是必需的。然而,圖2示出了在某一點上使用源代碼生成中間表示 222。例如,由模塊211使用許多不同的源代碼語言中的任意一種來生成中間表示222。例如,源代碼211可以表示以C#編程語言所編寫的程序,而源代碼212可以表示以C++編程語言所編寫的程序。垂直橢圓213符號化地表示了可以從任意語言的源代碼生成中間表示 222。作為一個示例,中間表示222可以由原語指令(在源代碼意義上不必要的程序語句) 組成以及用于該程序的控制流邊。隨后,靜態(tài)地分析中間表示的初始版本(動作30 。例如,在圖2中,分析組件231 靜態(tài)地分析中間表示。在說明性實施例中,一個或多個客戶端234通過估計中間表示來執(zhí)行實際的檢測。每個客戶端可以被特別地設計并結構化以檢測一個或多個特定缺陷的特定子集。當分析組件靜態(tài)地分析所述中間表示時,分析組件可能面臨它難以基于單獨的中間表示來推斷正在發(fā)生的操作的某些部分。分析組件查詢分析時間解決組件來幫助解決含糊性,而不是在此階段做出假設。例如,在圖2中,分析組件231在每次遇到中間表示的未知部分時查詢準時制(just-in-time)組件232 (也稱為分析時間解決組件23 。在這種意義上,該部分對于分析客戶端234是未知的。未知代碼的示例可以是使得在運行時將被執(zhí)行的代碼不清楚的代碼。為了獲得更多的確定性,分析組件所執(zhí)行的動作在圖3中作為框310所包含的動作而被示出。特別地,分析組件向分析時間解決組件查詢中間表示的不清楚部分的清晰性 (動作311)。作為響應,分析組件231從分析時間解決組件232接收補充的中間表示233(動作312)。補充的中間表示可以結合中間表示的初始版本來分析(動作313),以獲得更多的清晰性。作為中間表示的不清楚部分的一個示例,假設源代碼指定了依據(jù)類型來參數(shù)化的類屬類的方法。在那種情況下,除非所述類型是公知的,否則特定函數(shù)甚至不能被真實地標識,因為該函數(shù)的真正本性可以依賴于作為參數(shù)被提供給類屬類實例的類型而改變。在這種情況下,當分析組件231向分析時間解決組件查詢時,可以提供中間表示的不清楚部分。 假設知道類屬方法或類屬類的方法以及要對其實例化的類型,分析時間解決組件可以提供方法的特定實例化的中間表示。在那種情況下,補充中間表示233是方法的特定特定實例化。作為中間表示不清楚的情況的另一個示例,假設程序做出對分析組件231知道一點或完全不知道的外部函數(shù)的函數(shù)調(diào)用。在那樣的情況下,分析時間解決組件233可以理解在本上下文中通常調(diào)用特定的函數(shù)。這種情況的示例在如下給出,在該示例中調(diào)用外部函數(shù)Mream: Dispose (),并且生成Stream: Dispose。函數(shù)?;谠撎囟ê瘮?shù)的知識,分析時間解決組件233隨后生成表示該特定外部函數(shù)的補充中間表示。該特定外部函數(shù)還調(diào)用另一函數(shù)是可能的。那個其他函數(shù)可能已經(jīng)由中間表示來表示,在這種情況下,不需要向分析時間解決組件233的進一步函數(shù)查詢。否則,做出查詢,并且,處理可以被遞歸地重復。現(xiàn)在將提供C#代碼的示例。源代碼包括對被稱為ReferenceTypeExample (引用類型示例)的類和被稱為ValueTypeExample (值類型示例)的類的如下類定義
using System;(使用系統(tǒng))
Il Reference type (//引用類型)
class ReferenceTypeExample {
public int χ;
// Default constructor (//默認構造函數(shù))
public ReferenceTypeExample() {
x = 0;
}
}
// value type (//值類型)
struct ValueTypeExample {
public int x;
// Default constructor is implicit (//隱含了默認構造函數(shù))
}所述源代碼還包括如下的類屬函數(shù)
class GenericExample {
III〈summary〉 (//〈概述>)
III Generic function, parameterized by type T (//依據(jù)類型 T 來參數(shù)化的類屬
函數(shù))
III which is required to have a default constructor (//該類屬函數(shù)要求具有默
認構造函數(shù))
III T can be a value type or a reference type ( //T 可以是值類型或引用類型) III </summary> (//</概述>)
private T GenericFunction<T>() where T : new() {
T ret = new T(); return ret;
}現(xiàn)在假設存在調(diào)用了被稱為GenericFimction(類屬函數(shù))的類屬函數(shù)的兩個函數(shù)。下述函數(shù)被稱為I^estlteferenceTypelnstantiation(測試引用類型實例化)以及調(diào)用用ReferenceTypeExample (引用類型示例)類來實例化的函數(shù)GenericFunction (類屬函數(shù))
III〈summary〉 (//〈概述> )
III Function calling GenericFunction instantiated with a reference type ( //調(diào)用用引用類型來實例化的GenericFunction的函數(shù)) III〈/summary〉(//</概述〉)
public void TestReferenceTypeInstantiation() {
ReferenceTypeExample t = GenericFunction<ReferenceTypeExample>();
}下述函數(shù)被稱為TestValueTypelnstantiation (測試值類型實例化)以及調(diào)用用 ValueTypeExample (值類型示例)類來實例化的函數(shù)GenericFunction (類屬函數(shù))
基于該源代碼,可以為GenericFunction (類屬函數(shù))生成下述MSIL中間表示 //
// MSIL for GenericFunction<T> (//GenericFunction<T> 的 MSIL)
//
/*
.method private hidebysig instance !!T GenericFunction<.ctor T>() cil managed {
// Code size40 (0x28) (//代碼大小 40 (0x28))
.maxstack 2
.locals init (
!!T'ret',!!T CS$1$0000,!!T CS$0$0001) nop
ldloca.s CS$0$0001 initobj !!T ldloc.2
box!!T
brfalse.s IL 001c
IL—0000: IL—0001: IL_0003: IL 0009: IL 一000a: IL OOOf:
10IL_0011:ldloca.sCS$0$0001IL__0013:initobj!!TIL_0019:ldloc.2IL.001a:br.sIL_0021IL_001c:call! !0 [mscorlib]System.Activator::CreateInstance<!!0>()IL.-0021:stloc.OIL0022:ldloc.OIL0023:stloc.lIL0024:br.sTL_0026IL0026:ldloc.lIL0027:ret
} Il end of method GenericExample GenericFunction( // 方法
GenericExample-GenericFunction 的末尾)注意,在該示例中,存在調(diào)用CLR運行時函數(shù)“System. Activator: :CreateInstance< !! >()的行。在該示例中,函數(shù)從函數(shù)主體不存在和/或不能在C#源代碼層被表達的意義中來說是特定的。這樣的函數(shù)的示例包括C/C++內(nèi)部函數(shù), 如memset/memcpy以及一些CLR運行時函數(shù)等。在Anvil IR(從以上所示的MSIL構建)
中的相同類屬函數(shù)的示例如下示出
//
// Generic Anvil IR for GenericFunction<T> (//GenericFunction<T> 的類屬 Anvil IR)
//
// INITOBJECT, BOX, and call to [mscorlib]System.Activator::CreateInstance’ 1<!T> (//INITOBJECT (初始化對象 ) BOX 以及對 [mscorlib]System.Activator::CreateInstance' 1 <!T>的調(diào)用)
Il have a different semantics depending on whether instantiated with a reference orvalue types (//取決于用引用類型還是值類型來實例化而具有不同的語義)
Il The instantiated IR below (generated on the fly by the JIT module) translates those instructions (//以下經(jīng)實例化的IR (由JIT模塊在進行中生成)將那些指令轉換成) Il into common instructions matching the corresponding semantics. (//與對應語義相匹配的普通指令。)
// The BRANCH instruction is a test detecting whether the type T is a reference or a value type. (//BRANCH (分支)指令是檢查類型T是引用類型還是值類型的測試)
/*
FUNCTION [test]GenericExample::GenericFunction11<T> (size: 20)
return = ENTER this ret = DECLARE t327 = ASSIGN &CS$0$0001 *t327 = INITOBJECT <!T> $L3(EH) t285 = BOX <!T> CS$0$0001 $L3(EH) t294 = NE t285 O
=BRANCH t294 true:$Ll 1 false:$L 16 $L11= LABEL (references: 1)
i328 = ASSIGN &CS$0$0001 *t328 = INITOBJECT <!T> $L3(EH) t288- = ASSIGN CS$0$0001 =GOTO $L23 $L16= LABEL (references: 1)
t288- = CALL [mscorlib]System.Activator::CreateInstanceM<!T> $L3(EH) $L23= LABEL (references: 1)
ret = ASSIGN t288-t293 = ASSIGN ret return = RETURN t293$L2二 EXIT (references: 0)
$L3= UNWIND (references: 4)
*/在此,行System. Activator: :Createhstance~l< ! T>$L3 (EH)是由運行時引入
的特定函數(shù)。中間語言可以被下述不同的中間表示所代替
//
// Jitted Anvil IR for GenericFunction<ReferenceTypeExample> ( Il 將 GenericFunction<ReferenceTypeExample>的 Anvil IR 處理成)
Il as generated by JIT at the callsite for GenericFunction in function (//由 JIT 在調(diào)用站點為GenericFunction在函數(shù)中生成) TestReferenceTypeInstantiation //
// In reference type case, INITOBJECT just initializes the pointer to null, (//在為引用類型的情況下,INITOBJECT (初始化對象)只將指針初始化成空,) Il BOX reduces to a simple assignment, and CreateInstance translates into a NEWOBJ instruction (//BOX 縮減為簡單分配、以及 CreateInstance (創(chuàng)建實例) 轉換成NEWOBJ (新對象)指令)
// (memory allocation) and a call to the default constructor. (//(存儲器分配)和對默認構造函數(shù)的調(diào)用。)
// Note that the BRANCH instruction is still there, but its true branch will never be taken, (//注意BRANCH指令還在那里,但其正確的分支永遠都不會被采用,) U which is easily detected by the analysis engine. (//這可由分析引擎容易地檢測到。)
/*
FUNCTION[test] GenericExample:: GenericFunction' 1 <mref(classReferenceTypeExample)> (size: 17)return = ENTER this ret = DECLARE t285 = ASSIGN null t294 = NE t285 0
二 BRANCH t294 true:$Ll 1 false:$L16 $L11= LABEL (references: 1)
t288- = ASSIGN null =GOTO $L23 $L16二 LABEL (references: 1)
t288- 二 NEWOBJECT〈class [test]ReferenceTypeExample> $L3(EH) 二 CALL [test]ReferenceTypeExample::.ctor t288- $L3(EH) $L23= LABEL (references: 1)
ret = ASSIGN t288-t293 = ASSIGN ret return = RETURN t293 $L2= EXIT (references: 0)
$L3= UNWIND (references: 2)
*/作為另一個示例,下述中間表示可以表示用ValueTypeExample (值類型示例)來實例化的GenericFunction (類屬函數(shù))的特定實例 //
// Jitted Anvil IR for GenericFunction<ValueTypeExample>( // 將
GenericFunction<ValueTypeExample>的 Anvil IR 處理成)
// as generated by JIT at the callsite for GenericFunction in function TestReferenceTypeInstantiation (//由 JIT 在調(diào)用站點處為 GenericFunction 在函數(shù)
TestReferenceTypeInstantiation (測試引用類型實例化)中生成)Il
H INITOBJECT translates to the call to the implicit default constructor (which body is also generated by the JIT), (//INITOBJECT (初始化對象)轉換成對所隱含的默認構造函數(shù)(其主體也由JIT生成)的調(diào)用,)
Il BOX has the usual BOX semantics of creating a wrapper object, (//BOX 具有倉 1J 建封裝對象的常用BOX語義,)
Il and CreateInstance reduces to a simple assignment. (//以及 CreateInstance 縮減為簡單分配。)
// Note that the BRANCH instruction is still there, but its false branch will never be taken, (//注意BRANCH指令還在那里,但其錯誤的分支永遠都不會被釆用,) // which is easily detected by the analysis engine. (//這可由分析引擎容易地檢測
到。) //
/*
FUNCTION[test] GenericExample:: GenericFunctiorf 1〈structValueTypeExample> (size: 17)
return = ENTER this ret = DECLARE t327 = ASSIGN &CS$0$0001
=CALL [test]ValueTypeExample::$CTOR t327 $L3(EH) t285 = BOX〈struct [test]YalueTypeExample> CS$0$0001 $L3(EH) 294 = NE t285 O
=BRANCH t294 true:$L 11 false:$L23 $L11= LABEL (references: 1)
t328 = ASSIGN &CS$0$0001
=CALL [test]ValueTypeExample::$CTOR t328 $L3(EH) t288- = ASSIGN CS$0$0001// inner the stream is disposed properly here, since there is an implicit call to Stream: :Dispose(), which calls Stream: :Close(), which calls My Stream: :Dispose(bool), which disposes of the inner resources. (//流的內(nèi)部在此被合適地處理,因為存在對Stream::Dispose()的隱含調(diào)用,Stream::Dispose() 調(diào)用了 Stream::Close(),Stream::Close()調(diào)用了 MyStream::Dispose(bool),而
MyStream::Dispose(bool)處理該內(nèi)部資源。)
}對于遺忘了流實現(xiàn)的客戶端,M於tream(我的流)對象看上去沒有被合適地處理, 因為"using”分句將轉換成下述代碼,其中在最終部分,將調(diào)用Mream: :Dispose()來取代 MyStream: Dispose (bool),它將合適地處理MyMream(我的流)對象
$L23= LABEL (references: 1)
ret = ASSIGN t288-t293 = ASSIGN ret return = RETURN t293 $L2= EXIT (references: 0)
$L3= UNWIND (references: 3)
*/后面的兩個函數(shù)都表示了 GenericFunction(類屬函數(shù))類的不同的特定實例化的中間表示。作為另一個示例,函數(shù)可以是類屬實例化但不存在對類屬版本的訪問,或者函數(shù)是非類屬的但不存在訪問函數(shù)的主體。在這種情況下,預生成的中間表示(有時是近似地)對公知庫函數(shù)建模。這包括.Net Mream(· Net流)類的示例,其中,DisposeO函數(shù)調(diào)用CloseO,而CloseO進而調(diào)用虛擬函數(shù)Dispose (bool)。但如果我們僅具有從該流中導出的類的中間表示,則對Disp0se(b00l)函數(shù)的調(diào)用對于分析是不可見的。如果所描述的.Net Mream類的行為對于分析是未知的,則下述代碼看上去沒有適合地處理所導出的流
public static void TestO 1() {
using(var s = new MyStream())public static void TestO 1() {
var s = new MyStream()
try {
}
Finally {
s.Dispose(); // inner the stream is disposed properly here, since there is an implicit call to Stream::Dispose(), which calls Stream::Close(), which calls My Stream: :Dispose(bool), which disposes of the inner resources. (//流的內(nèi)部在此被合適地處理,因為存在對Stream::Dispose()的隱含調(diào)用,Stream::Dispose() 調(diào)用了 Stream::Close(),Stream::Close()調(diào)用了 MyStream::Dispose(bool),而 MyStream::Dispose(bool)處理該內(nèi)部資源。)下述代碼示出在上述示例中使用的MyMream(我的流)類實現(xiàn)的示例。public class C IDisposable {
public void Dispose() {
}
} public class MyStream : Stream {
C res = new C();
public override bool CanRead { get { return true; } } public override bool CanSeek { get { return true; } } public override bool CanWrite { get { return true; } }
public override long Length { get { return 0; } } public override long Position { get { return 0; } set { } }
public override void FlushQ { }
public override void SetLength(long 1)(}
public override int Read(byte[] bytes, int a, int b) { return 0; }
public override void Write(byte[] bytes, int a, int b) { }
public override long Seek(long a, System.IO.SeekOrigin o) { return 0; }
protected override void Dispose(bool disposed) {
res.DisposeQ;
}
} 在這種情況下,下述庫函數(shù)將協(xié)助提供特定函數(shù)的中間表示的生成。用于 Stream(流)類的所生成的代碼在下述runtime, cs示例中示出。
using System;
using System.Text;
namespace System {
namespace IO {
///〈summary〉 (//<概述>)
III Stream runtime model (//Stream 運行時模型) III </summary> (//</概述〉)
public abstract class Stream : MarshalByRefObject, IDisposable {
III〈summary〉 ( //<概述〉)
III Close (// 關閉)
III </summary> ( //</概述> )
public virtual void Close() {
Dispose(true);
// GC. SuppressFinalize(this);
}
III <summary> (//<概述〉)
III Dispose (//處理)
III〈/summary〉 (//</概述〉)
void IDisposable.Dispose() {
CloseO;III〈summary〉 (//〈概述> ) III Dispose (//處理) ///〈/summary〉( //</概述>)
public virtual void Dispose(bool disposing) {
//
}
}
}
}返回到圖3,在整個靜態(tài)分析中,客戶端234生成所標識的缺陷的列表(動作 314)。靜態(tài)分析還產(chǎn)生引起缺陷的對應中間表示部分。這些缺陷(以及可能的對應中間表示)可以隨后對于用戶是可視化的(動作315)例如,可以在顯示器112上可視化缺陷報告??蛇x擇,還可以提供運行時用戶界面223,它也可能使用顯示器112來顯示。用戶界面223允許用戶提供一信息給分析時間解決組件232,該信息可被該分析時間解決組件 232用來生成中間表示的初始版本的至少一部分中的一個或多個的補充中間表示。作為示例,該信息可以包括方法的類屬實現(xiàn),以便分析時間解決組件232可以對它們進行實例化。 可以使用顯示器112或可能通過文件來提供這種信息。作為示例,信息可以包括方法的類屬實現(xiàn),使得分析時間解決組件232可以對它們進行實例化。圖4說明了分析時間解決組件通過生成補充中間表示來支持對源代碼的靜態(tài)分析的方法400的流程圖。分析時間解決組件232從分析組件231接收查詢(動作401)。如參照圖3所述,當遇到中間表示的不清楚片斷時,例如當可能遇到類屬類或方法或外部函數(shù)調(diào)用時,可能生成該查詢。響應于查詢,分析時間解決組件訪問澄清與不清楚部分相關聯(lián)的處理的信息(動作402)。隨后,分析時間解決組件使用所訪問的信息來生成對應于該部分的補充的中間表示(動作40;3)。補充的中間表示隨后被提供給分析組件(動作404)。因此,在此所述的原則允許對源代碼的中間表示的更加完整和精確的靜態(tài)分析, 而不會對使用該中間表示來查找缺陷的客戶端的開發(fā)成本產(chǎn)生負面的影響。本發(fā)明可具體化為其它具體形式而不背離其精神或本質特征。所描述的實施例在所有方面都應被認為僅是說明性而非限制性的。因此,本發(fā)明的范圍由所附權利要求書而非前述描述指示。落入權利要求書的等效方案的含義和范圍內(nèi)的所有改變被權利要求書的范圍所涵蓋。
權利要求
1.一種包括在其上具有計算機可執(zhí)行指令的一個或多個計算機存儲介質的計算機程序產(chǎn)品,當所述計算機可執(zhí)行指令由計算系統(tǒng)的一個或多個處理器執(zhí)行時,使得所述計算系統(tǒng)執(zhí)行以下動作訪問源或程序代碼的中間表示的初始版本的動作; 靜態(tài)地分析所述中間表示的初始版本的動作;對于所述中間表示的初始版本的至少一部分,所述部分基于靜態(tài)分析受不確定性的影響,執(zhí)行下述動作向分析時間解決組件查詢所述中間表示的所述部分的清晰度的動作;以及響應于所述查詢,接收補充的中間表示的動作;以及分析所述補充的表示的動作。
2.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,所述中間表示的初始版本的至少一部分中的一個或多個是類屬方法或由一個或多個類型來參數(shù)化的類屬類中的方法。
3.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,所述中間表示的初始版本的至少一部分中的一個或多個是對外部組件的函數(shù)調(diào)用。
4.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,其中訪問源或程序代碼的中間表示的初始版本的動作包括訪問所述源或程序代碼的動作;以及使用所訪問的源或程序代碼來生成所述源或程序代碼的中間表示的初始版本的動作。
5.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,靜態(tài)地分析所述中間表示的初始版本的動作包括多個缺陷檢測組件評估所述中間表示的初始版本的動作,所述多個缺陷檢測組件的每一個被設計成檢測一個或多個特定缺陷的子集。
6.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,所述計算機可讀介質被進一步結構化,以便在由一個或多個處理器執(zhí)行時,使得所述計算系統(tǒng)進一步執(zhí)行以下動作作為分析動作的結果,生成所標識的缺陷的列表的動作。
7.如權利要求1所述的計算機程序產(chǎn)品,其特征在于,所述計算機可讀介質被進一步結構化,以便在由一個或多個處理器執(zhí)行時,使得所述計算系統(tǒng)進一步執(zhí)行以下動作提供用戶界面的動作,通過所述用戶界面,用戶可以將一信息提供給所述分析時間解決組件,該分析時間解決組件可以使用該信息來生成所述中間表示的初始版本的至少一部分中的一個或多個的補充的中間表示。
8.一種使在計算系統(tǒng)上運行的分析時間解決組件支持源或程序代碼的靜態(tài)分析的方法,所述方法包括從正執(zhí)行對源或程序代碼的中間表示的初始版本的靜態(tài)分析的分析組件處接收查詢的動作,所述查詢標識所述中間表示的初始版本的一部分;響應于所述查詢,訪問澄清與所述部分相關聯(lián)的處理的信息的動作; 使用所訪問的信息來生成與所述部分相對應的補充的中間表示的動作;以及將所生成的補充的中間表示提供給所述分析組件的動作。
9.如權利要求8所述的方法,其特征在于,所述分析組件也在所述計算系統(tǒng)上運行。
10.如權利要求9所述的方法,其特征在于,所述部分包括類屬方法或依據(jù)一個或多個類型來參數(shù)化的類屬類中的方法, 分析所述補充的表示。
全文摘要
一種用于靜態(tài)分析的中間表示結構。對源或程序代碼的中間表示的分析。訪問并靜態(tài)地分析源或程序代碼的初始中間表示的初始版本。對于該初始版本的一個或多個部分,分析組件查詢提供了與該部分相對應的補充中間表示的分析時間解決組件。該補充的中間表示提供了有關該部分的進一步的清晰性,并且還被分析。如果找到缺陷,就報告它們。
文檔編號G06F11/36GK102402479SQ201110306939
公開日2012年4月4日 申請日期2011年9月27日 優(yōu)先權日2010年9月28日
發(fā)明者A·格林高澤, H·K·羅德 申請人:微軟公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
德惠市| 泸溪县| 宁津县| 青铜峡市| 嵩明县| 锦州市| 葵青区| 常宁市| 东乌珠穆沁旗| 利津县| 张北县| 招远市| 苍南县| 白水县| 呈贡县| 蕉岭县| 高陵县| 岫岩| 丘北县| 扎鲁特旗| 海淀区| 新密市| 宁南县| 泉州市| 吕梁市| 马关县| 大宁县| 罗江县| 江陵县| 潜江市| 西藏| 南陵县| 镇康县| 太康县| 慈利县| 宜兴市| 洪泽县| 南投县| 金门县| 连城县| 蒙城县|