亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

用于資源泄漏檢測的系統(tǒng)和方法

文檔序號:6351005閱讀:333來源:國知局
專利名稱:用于資源泄漏檢測的系統(tǒng)和方法
技術(shù)領(lǐng)域
本發(fā)明涉及資源泄漏檢測,更具體而言涉及使用靜態(tài)分析來跟蹤系統(tǒng)資源以及檢測和報告資源泄漏的方法和系統(tǒng)。
背景技術(shù)
資源泄漏典型地源于編程錯誤,其中,有限的系統(tǒng)資源例如輸入/輸出(I/O)流、 字體和數(shù)據(jù)庫連接從未被相應(yīng)的程序釋放。結(jié)果,系統(tǒng)速度會降低,并且系統(tǒng)崩潰會發(fā)生。 盡管垃圾回收減輕了程序員顯式地管理存儲器的負(fù)擔(dān),程序員仍顯式地管理其他有限的系統(tǒng)資源。資源泄漏檢測工具通過分析程序代碼并報告資源泄漏來幫助程序員檢測資源泄漏,以允許泄漏資源的有效識別和校正。

發(fā)明內(nèi)容
本發(fā)明的示例性實施例涉及用于跟蹤程序中的資源以確定該程序是否泄漏任何資源的系統(tǒng)和方法。特別地,這里公開的有效的跟蹤過程在分析程序時使用動態(tài)可調(diào)整的必須訪問路徑集合用于別名的(aliasing)目的。在本發(fā)明的一個實施例中,一種用于檢測程序中的資源泄漏的方法包括啟動對程序的控制流的分析;響應(yīng)于獲取控制流中的資源,生成資源的必須訪問路徑的初始集合; 通過根據(jù)控制流分析至少添加或刪除必須訪問路徑來動態(tài)修改必須訪問路徑的集合,來跟蹤控制流中的資源;以及如果基于必須訪問路徑的集合,資源在控制流的出口不可到達(dá) (unreachable),則確定該資源已被泄漏。在本發(fā)明的另ー示例性實施例中,一種用于檢測程序中的資源泄漏的系統(tǒng)包括 控制流表示生成器,被配置為生成程序的控制流表示;必須訪問路徑模塊,被配置為存儲必須訪問路徑的多個集合;跟蹤器,被配置為分析控制流并通過生成和修改必須訪問路徑的集合來跟蹤資源,從而響應(yīng)于獲取控制流中的資源而生成該資源的必須訪問路徑的給定集合,且從而根據(jù)控制流分析,通過至少添加和刪除必須訪問路徑,動態(tài)調(diào)整必須訪問路徑的給定集合,以跟蹤資源;以及報告模塊,被配置為如果基于必須訪問路徑集合該資源被確定為在控制流的出口處不可到達(dá),則報告資源被泄漏。此外,在本發(fā)明的其他實施例中,一種用于報告程序中的資源泄漏的方法包括生成程序的控制流表示;分析控制流表示來確定資源泄漏;確定資源泄漏是已見證 (witnessed)的泄漏還是由分析局限引起的潛在泄漏;以及報告資源泄漏,從而已見證的泄漏更優(yōu)先于由分析局限引起的潛在泄漏。通過下列對其示例性實施例的詳細(xì)說明并結(jié)合附圖,這些以及其他特征和優(yōu)勢將
變得明顯。


本公開將參考附圖來提供優(yōu)選實施例的下列說明的細(xì)節(jié),在附圖中
圖1是示出根據(jù)本發(fā)明示例性實施例的分析的方面的控制流圖的高級框/流程圖。圖2是根據(jù)本發(fā)明示例性實施例的用于檢測程序中的資源泄漏的方法的高級框/ 流程圖。圖3是根據(jù)本發(fā)明示例性實施例的用于檢測和報告資源泄漏的系統(tǒng)的高級框/流程圖。圖4是根據(jù)本發(fā)明示例性實施例的用于檢測和報告資源泄漏的方法的高級框/流程圖。圖5是根據(jù)本發(fā)明示例性實施例的用于檢測資源泄漏的方法的高級框/流程圖。
具體實施例方式根據(jù)本發(fā)明的示例性實施例,可以執(zhí)行靜態(tài)分析,來報告程序例如Java程序中的泄漏缺陷(bug)。這里描述的示例性實施例可以是可在交互設(shè)置中使用的產(chǎn)業(yè)強度的工具, 其中它們可以在幾分鐘內(nèi)處理幾百萬行代碼,并且同時具有很低的假陽性率。特別地,開源應(yīng)用程序可以被靜態(tài)地分析,以檢測整個程序中的缺陷,而不是單個過程的有限范圍。這里描述的示例性實施例足夠快地分析大型程序,例如具有10000個類的java程序。盡管垃圾回收使程序員免于存儲器管理的責(zé)任,但它沒有解決資源管理的問題。 在Java和類似的語言中,當(dāng)程序獲取有限系統(tǒng)資源例如套接字或數(shù)據(jù)庫連接的實例吋,它必須通過顯式地調(diào)用dispose或close方法來釋放該實例。讓未釋放資源的最后的句柄超出范圍會泄漏資源運行時系統(tǒng)慢慢地耗盡系統(tǒng)資源的有限供應(yīng),導(dǎo)致性能降低和系統(tǒng)崩潰。但是,要保證資源總是被釋放需要技巧并容易出錯。作為例子,考慮下面表1中示出的Java程序。表1
第7行中Fi IeOutpuびtream的分配獲取了流,這是需要通過調(diào)用對流句柄的closeO來釋放的系統(tǒng)資源。獲得的流對象然后進(jìn)入OutputMreamWriter的構(gòu)造函數(shù),構(gòu)造函數(shù)將它記在一私有字段。OutputMreamWriter對象轉(zhuǎn)而進(jìn)入I^rintfeiter的構(gòu)造函數(shù)。在finally塊中,程序員調(diào)用對I^rintfeiter對象的closeO。該closeO 函數(shù)調(diào)用對“嵌套的” OutputStreamffriter對象的close (),該對象轉(zhuǎn)而調(diào)用對嵌套的 FileOutpuびtream對象的closeO。通過使用finally,看來程序關(guān)閉了流,即使是在發(fā)生異常吋。但是,一潛在的資源泄漏隱藏在該程序中。OutputMreamWriter的構(gòu)造函數(shù)可能拋出異常注意到程序員預(yù)期UnsupportedEncodingExc印tion可能會發(fā)生。如果確實發(fā)生了該異常,在第5行中對變量out的賦值不會執(zhí)行,結(jié)果在第7行中分配的流再也不會被關(guān)閉。資源管理缺陷在Java中很常見,這有幾個原因。首先,由于對垃圾回收器的角色的含混,程序員可能忽略對closeO的調(diào)用。其次,即使是很仔細(xì)的程序員也可能容易忘記釋放沿著所有可能的異常路徑的所有資源,如表1所示的那樣。最后,程序員需要理解所有相關(guān)的API契約(contract)。在上面的例子中,程序員正確地理解了關(guān)閉I^rintfeiter實例會通過級聯(lián)的closeO調(diào)用來關(guān)閉嵌套的資源。但是,級聯(lián)的close并不是在所有API 中普遍的,程序員很容易做出錯誤的假設(shè)。本發(fā)明的示例性實現(xiàn)包括可伸縮而有用的基于靜態(tài)分析的泄漏檢測工具。它們是有用的,因為工具生成的報告是用戶可行動的(actionable),而不僅僅是全面的。此外,它們是可伸縮的,因為這些實現(xiàn)能處理包含數(shù)萬個類的真實世界的Java應(yīng)用。本發(fā)明的示例性特征包括可伸縮的過程間分析的執(zhí)行。關(guān)于別名的過程間推理(reasoning)是建立有用的資源泄漏檢測工具的ー個因素。例如,在圖1示出的程序中,本發(fā)明的示例性實施例可以推理在OutputMreamWriter的closeO方法中釋放的 FileOutputStream的實例實際上是在OutputMreamWriter對象被構(gòu)造時被附加到該 OutputStreamffriter對象的同一實例。在分析具有數(shù)萬個類的應(yīng)用程序吋,這樣的推理會是很難實現(xiàn)的,因為這樣規(guī)模的程序阻礙了對足夠精確的全程序別名分析的計算。本發(fā)明的實施例可以通過在有效的過程間數(shù)據(jù)流分析的上下文中使用訪問路徑來跟蹤相關(guān)的別名信息,來回避一般的別名分析問題。令人驚奇地,通過經(jīng)驗觀察到,稀疏跟蹤的別名信息可以提供很高的精確性。其他的示例性特征解決了假陽性的問題。假陽性一般會在保證可靠性 (soundness)的任何工具中發(fā)生。但是,如果缺陷查找工具產(chǎn)生太多的假陽性,用戶將簡單地傾向于忽略結(jié)果。與目標(biāo)是確定代碼是否有特定種類錯誤的驗證工具不同,缺陷查找エ 具應(yīng)當(dāng)優(yōu)先考慮比其他報告更可能是真陽性的報告。示例性實施例可以通過保持下列記錄來提供這樣的優(yōu)先級排序缺陷是否沿相同的路徑被見證,或者它是否是由于分析的限制而被假設(shè)的。根據(jù)經(jīng)驗,可以看到由分析限制引起的缺陷更可能是假陽性。示例性實施例還可以解決資源管理問題相關(guān)的問題。例如,關(guān)于嵌套的資源,僅僅跟蹤基本系統(tǒng)資源是不夠的,因為用戶需要采取的校正行為可能是對嵌套了資源實例的對象調(diào)用close方法。例如,假設(shè)在表1示出的程序中,OutputMreamWriter的構(gòu)造函數(shù)不能拋出異常,而是程序員忘記了包括out. closeO。即使真實的資源是FileOutputMream而不是OutputMreamWriter或I^rintfeiter,在該情形下,程序員一般更希望報告指明out應(yīng)被關(guān)閉,而不是FileOutputMream的匿名實例。如這里下面所討論,本發(fā)明的示例性實施例提供了報告,其使得合適的彌補動作更明顯。本發(fā)明的示例性實施例考慮的其他方面是異常流。例如,如表1中提供的程序所示,程序員在使用try-catch-finally塊時經(jīng)常出錯。因此,資源泄漏工具應(yīng)該特別關(guān)注那里所隱藏的缺陷。報告所有可能的運行時錯誤所引起的泄漏會將用戶淹沒于不感興趣的結(jié)果中。但是,程序員期望發(fā)生的那些異常路徑應(yīng)該被解決。例如,程序員會典型地忽略基于OutOfMemoryException的泄漏報告,因為大多數(shù)程序不會被期望來處理這樣嚴(yán)重的異常。相反,基于信任的探試法可以被用來抑制由異常流引起的報告,除非分析發(fā)現(xiàn)可信的證據(jù)來證明該報告是正當(dāng)?shù)摹,F(xiàn)在將參考圖1中提供的用于表1中示出的程序的示例性控制流圖100來一般地以高級別示出示例性系統(tǒng)和方法如何可分析表1中示出的程序。在控制流圖100中,行數(shù)102對應(yīng)于表1中提供的程序的行數(shù),虛線邊104表示異常流并用表示其攜帶的異常類型的標(biāo)簽106來標(biāo)記,點線邊108表示流程間的控制流轉(zhuǎn)移。需要注意OOM對應(yīng)于存儲器不足異常,UEE對應(yīng)于不支持的編碼異常,且IOE對應(yīng)于輸入/輸出異常。在本發(fā)明的示例性方法和系統(tǒng)實施例中,分析可以將控制流圖(CFG)以及獲取和釋放系統(tǒng)資源的過程的規(guī)范作為輸入。圖1示出了用于表1中的程序的CFG的相關(guān)部分110以及某些被調(diào)用的方法的CFG 120-126。臨時變量tl和t2在構(gòu)造CFG 110時被引入。該例子中的規(guī)范聲明了 FileOutputMream的構(gòu)造函數(shù)分配了資源,以及相應(yīng)的closeO釋放了它。該特殊分析的目標(biāo)是為了確立在第7行上的資源分配跟隨著在到出口的所有可能執(zhí)行路徑上的釋放;當(dāng)這個屬性不成立時,就存在可能的泄露。方法和系統(tǒng)的實施例可以符號性地跟蹤C(jī)Ri中的路徑中的每個資源,直到a)它被釋放,或者b)它變得不可到達(dá)而沒有被釋放,并由此泄漏??紤]從第7行上的資源分配開始的程序路徑7-6-5-11-14-15。下面兩行涉及由構(gòu)造函數(shù)調(diào)用引起的過程間跟蹤。第6行上的構(gòu)造函數(shù)將其參數(shù)存入到實例字段a。分析可以推斷,在第6行之后,表達(dá)式t2. a和tl都指向被跟蹤的資源。第5行上的構(gòu)造函數(shù)將其參數(shù)存入到實例字段b。分析類似地可以推斷,在第5行之后,表達(dá)式out.b. a也指向被跟蹤的資源。第15行上的調(diào)用out. close ()傳遞地調(diào)用對表達(dá)式out. b和out. b. a的close ()(注意CFG 124和126中的this將被合適地綁定),最后一個釋放了被跟蹤的資源,因為它等于tl。此時,表達(dá)式tl、t2. a和out. b. a所引用的資源被釋放,并因此不再被跟蹤。為了有效,方法和系統(tǒng)實施例能夠證明CFG 1 中的this, a等于CFG 110中分配的tl。這涉及精確的過程間必須別名(must-alias)推理。示例性方法和系統(tǒng)實施例使用選擇性相等謂詞(equality predicate),而不用依靠全程序別名分析,來執(zhí)行必須別名推理?,F(xiàn)在參考異常路徑7-6-8-9-11-14-15-出口,在第15行上,表達(dá)式out指向第9行上分配的對象,并且不等于第7行上分配的資源tl。在過程出口處,表達(dá)式tl仍然指向來自第7行的未釋放的資源,且沒有其他表達(dá)式可指向該資源。由于tl在過程出口處超出范圍,可以推斷在第7行分配的資源無法到達(dá)、未被釋放且泄漏了。
關(guān)于路徑7-6-5-11-14-出口,其中第14行上的分支沒有被采取,如果分析可以證明假輸出是不可能的,該路徑是不可行的;如果分析不能證明,它會報告泄漏。示例性系統(tǒng)和方法實施例可以避免該假陽性。對于路徑7-6-14-出口,其中OutOfMemoryExc^ption在第6行發(fā)生,資源會沿該路徑發(fā)生泄漏。但是,根據(jù)用戶的決定,方法和系統(tǒng)實施例可以抑制沿著與不常見的嚴(yán)重異常相關(guān)的異常流的問題,如下面更為詳細(xì)地討論的。現(xiàn)在參考下面提供的表2的算法1,示出了根據(jù)本發(fā)明的示例性實施例的特定分析過程。需要注意,這里描述的示例性實施例可以以多種方式實現(xiàn)。如本領(lǐng)域技術(shù)人員所理解的,本發(fā)明的方面可以被實現(xiàn)為系統(tǒng)、方法或程序產(chǎn)品。相應(yīng)地,本發(fā)明的各方面可以采取完全硬件實施例、完全軟件實施例(包括固件、駐留軟件、微代碼等)或組合了軟件和硬件方面的實施例的形式,所有這些軟件和硬件方面在此通常被稱為“電路”、“模塊”或“系統(tǒng)”。此外,本發(fā)明的方面可以采取體現(xiàn)在一個或多個計算機(jī)可讀介質(zhì)(在介質(zhì)中具有計算機(jī)可讀程序代碼)中的計算機(jī)程序產(chǎn)品的形式??梢允褂靡粋€或多個計算機(jī)可讀介質(zhì)的任意組合。所述計算機(jī)可讀介質(zhì)可以是計算機(jī)可讀信號介質(zhì)或計算機(jī)可讀存儲介質(zhì)。計算機(jī)可讀存儲介質(zhì)例如可以是(但不限于)電、磁、光、電磁、紅外線或半導(dǎo)體系統(tǒng)、裝置或設(shè)備或上述任何適合的組合。計算機(jī)可讀存儲介質(zhì)的更具體的示例(非窮舉列表)可以包括以下項具有一條或多條線的電連接、便攜式計算機(jī)軟盤、硬盤、隨機(jī)存取存儲器(RAM)、只讀存儲器(ROM)、可擦寫可編程只讀存儲器(EPR0M或閃存)、光纖、便攜式光盤只讀存儲器(CD-ROM)、光存儲設(shè)備、磁存儲設(shè)備或上述任何適合的組合。在本文檔的上下文中,計算機(jī)可讀存儲介質(zhì)可以是任何能夠包含或存儲由指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用或與所述指令執(zhí)行系統(tǒng)、裝置或設(shè)備結(jié)合的程序的有形介質(zhì)。計算機(jī)可讀信號介質(zhì)可以包括其中包含計算機(jī)可讀程序代碼(例如,在基帶中或作為載波的一部分)的傳播數(shù)據(jù)信號。此類傳播信號可以采取多種形式中的任何一種,包括但不限于電磁、光或上述任何適合的組合。計算機(jī)可讀信號介質(zhì)可以是任何并非計算機(jī)可讀存儲介質(zhì)以及傳送、傳播或傳輸由指令執(zhí)行系統(tǒng)、裝置或設(shè)備使用或與所述指令執(zhí)行系統(tǒng)、裝置或設(shè)備結(jié)合的程序的計算機(jī)可讀介質(zhì)??梢允褂萌魏芜m當(dāng)?shù)慕橘|(zhì)(包括但不限于無線、線纜、光纜、RF等或上述任何適合的組合)來傳輸計算機(jī)可讀介質(zhì)中包含的程序代碼。用于執(zhí)行本發(fā)明的方面的操作的計算機(jī)程序代碼可以使用一種或多種編程語言的任意組合來編寫,所述編程語言包括諸如Java、Smalltalk, C++或類似語言之類的面向?qū)ο蟮木幊陶Z言或者諸如“C”編程語言或類似的編程語言之類的常規(guī)過程編程語言。所述程序代碼可以完全地在用戶計算機(jī)上執(zhí)行,部分地在用戶計算機(jī)上執(zhí)行,作為獨立的軟件包執(zhí)行,部分地在用戶計算機(jī)上并部分地在遠(yuǎn)程計算機(jī)上執(zhí)行,或者完全地在遠(yuǎn)程計算機(jī)或服務(wù)器上執(zhí)行。在后者的情況中,所述遠(yuǎn)程計算機(jī)可以通過包括局域網(wǎng)(LAN)或廣域網(wǎng)(WAN)的任何類型網(wǎng)絡(luò)與用戶的計算機(jī)相連,也可以與外部計算機(jī)進(jìn)行連接(例如,使用因特網(wǎng)服務(wù)提供商通過因特網(wǎng)連接)。下面參考根據(jù)本發(fā)明的實施例的方法、裝置(系統(tǒng))和計算機(jī)程序產(chǎn)品的流程圖和/或方塊圖對本發(fā)明的方面進(jìn)行描述。將理解,所述流程圖和/或方塊圖的每個方塊以及所述流程圖和/或方塊圖中的方塊的組合可以由計算機(jī)程序指令來實現(xiàn)。這些計算機(jī)程
9序指令可以被提供給通用計算機(jī)、專用計算機(jī)或其他可編程數(shù)據(jù)處理裝置的處理器以產(chǎn)生機(jī)器,以便通過所述計算機(jī)或其他可編程數(shù)據(jù)處理裝置的處理器執(zhí)行的所述指令產(chǎn)生用于實現(xiàn)在一個或多個流程圖和/或方塊圖方塊中指定的功能/操作的裝置。這些計算機(jī)程序指令也可以被存儲在引導(dǎo)計算機(jī)、其他可編程數(shù)據(jù)處理裝置或其他設(shè)備以特定方式執(zhí)行功能的計算機(jī)可讀介質(zhì)中,以便存儲在所述計算機(jī)可讀介質(zhì)中的所述指令產(chǎn)生一件包括實現(xiàn)在所述一個或多個流程圖和/或方塊圖方塊中指定的功能/操作的指令的制品。所述計算機(jī)程序指令還可被加載到計算機(jī)、其他可編程數(shù)據(jù)處理裝置或其他設(shè)備,以導(dǎo)致在所述計算機(jī)、其他可編程裝置或其他設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機(jī)實現(xiàn)的過程,從而在所述計算機(jī)或其他可編程裝置上執(zhí)行的指令提供用于實現(xiàn)在一個或多個流程圖和/或方塊圖方塊中指定的功能/操作的過程。過程內(nèi)分析回到表2中的算法1,如上所示,可以以至少兩種方式由該過程實現(xiàn)顯著程度的效率。首先,與對于整個程序預(yù)計算(pre-computing)別名或借助于使用不精確的別名信息(兩者都可能產(chǎn)生大量的假陽性)不同,該分析可以在以完全合適的方式分析程序時動態(tài)地(on-the-fly)生成并使用最小別名信息集合。其次,與在整個程序中跟蹤資源不同,資源可以僅在相關(guān)的程序部分中被跟蹤。例如,資源可以在其被獲取的位置和其被釋放或變得不可到達(dá)的位置之間被跟蹤。表2
控制流圖可以用下列類型的抽象語句來描述entry、exit、ρ = acquire R、release R q、branch c L、p = new T、p = q. f >p. f = q、p = q、以及調(diào)用語句 invoke。為了清楚起見,可以假設(shè)分配和釋放語句的方法調(diào)用被抽象地重寫為獲取(acquire)和釋放(release)語句,例如,ρ = new FiIeOutputStream(file)可以被表示為ρ = acquire FileOutputStreaminvoke p. <init>()此外,語句p. close ()被表示為release FileOutputStream ρinvoke p. close ()該分析假設(shè)每個局部變量,例如p,具有單個靜態(tài)賦值(SSA)。抽象的ρ = q語句被包括來描述在SSA轉(zhuǎn)換中引入的φ-節(jié)點的處理,并對過程調(diào)用中的值從實參(actual)到形參(formal)的傳遞進(jìn)行建模。分支語句,分支c L,具有條件表達(dá)式c和跳轉(zhuǎn)目標(biāo)L。需要注意,因為這里使用的SSA變量僅在單個過程中唯一,調(diào)用者值數(shù)字(value number)應(yīng)該避免與被調(diào)用者值數(shù)字混淆。一般數(shù)據(jù)流分析如表2所示,算法1在如算法的行中指示的類型i^act的事實(fact)冪集格(powerset lattice)上執(zhí)行迭代的數(shù)據(jù)流3元組,其包含SSAVariable (這是SSA值數(shù)字)、ResourceType (這是資源的類型)、以及Mate。State表示在i^act中包含的有限數(shù)量的輔助信息,用以幫助解決算法將要執(zhí)行的詢問。下面給出了 Mate的具體描述,但是這時候可以假設(shè)它包含局部變量上的謂詞。算法使用下列輔助函數(shù)initialState(p =SSAVariable) -initalState (ρ =SSAVariable)基于給定的 SSA變量來創(chuàng)建Mate的元素。isMustAlias(p =SSAVariable, q =SSAVariable, a Jtate)-該函數(shù)意味著,給定 a中的信息,P等于q。如果該檢查失敗,則該分析不認(rèn)為在其上釋放被調(diào)用的變量會強烈關(guān)閉P所引用的資源。對該詢問的保守回答為假。isConsistent (condition :Expression,a :State)。根據(jù)該函數(shù),condition,作為條件表達(dá)式(Expression),與a中的信息不矛盾。該函數(shù)被用來裁剪不可行的路徑。對該詢問的保守回答是真。isUnreachable (a =State, ρ =SSAVariable)。該函數(shù)意味著根據(jù) a 中的信息,ρ 所引用的資源不再可由任何活動名稱(live name)訪問。在過程出口處,局部變量被認(rèn)為變?yōu)樗赖?,除非另外在a中保留。對該詢問的保守回答是假。如表2中的算法1所示,第5-8行用對應(yīng)于資源分配的初始事實來對分析下種(seed)。算法然后將這些事實在程序語句中傳播,沿路創(chuàng)建新的事實。第M-25行示出了其他指針(pointer)語句例如p. f = q對Mate的影響;這些影響在下面更詳細(xì)地描述。算法收斂,因為沒有事實從映射表(map)D中刪除,并且i^act的每個成分是有限的。State本發(fā)明的示例性實施例可以將Mate實現(xiàn)為到被跟蹤資源的must-access-path集合。must-access-path是由變量以及緊跟著的(可能空的)字段名序列組成的表達(dá)式,從而該表達(dá)式的值引用資源。例如,上面提到的out. b. a是must-access-path。下面提供的表3示出了名稱為in的must-access-path集合如何被單獨的程序語句變換(transform)。表 權(quán)利要求
1.一種用于檢測程序中的資源泄漏的方法,包括 啟動(50 對程序的控制流的分析;響應(yīng)于獲取控制流中的資源,生成(504)用于該資源的必須訪問路徑的初始集合; 根據(jù)控制流分析,通過至少添加或移除必須訪問路徑來動態(tài)調(diào)整必須訪問路徑集合, 來跟蹤(506)控制流中的資源;以及如果基于必須訪問路徑集合,所述資源在控制流出ロ處不可到達(dá),則確定(512)該資源被泄漏。
2.如權(quán)利要求1所述的方法,還包括響應(yīng)于確定必須訪問路徑集合中的任何變量釋放了所述資源,在到達(dá)控制流的出口之前停止(508)對該資源的跟蹤。
3.如權(quán)利要求1所述的方法,其中,所述跟蹤包括在過程間調(diào)用中跟蹤資源。
4.如權(quán)利要求3所述的方法,其中,只有當(dāng)過程間調(diào)用引起必須訪問路徑集合中的修改或當(dāng)過程間調(diào)用引起該資源的釋放時,該資源才會在過程間調(diào)用中被跟蹤。
5.如權(quán)利要求4所述的方法,其中,所述調(diào)整還包括為過程間調(diào)用中使用的變量添加必須訪問路徑。
6.如權(quán)利要求1所述的方法,其中,如果必須訪問路徑集合是空的,則所述資源不可到TSo
7.如權(quán)利要求1所述的方法,其中,所述跟蹤(508)還包括通過基于必須訪問路徑集合,評定用于采取分支的條件是否為真,來確定分支是否被采取。
8.如權(quán)利要求1所述的方法,還包括如果所述必須訪問路徑集合包含的必須訪問路徑的數(shù)量超過第一閾值或者如果該集合包含的必須訪問路徑的長度超過第二閾值,則通過清空該集合來過濾(510)必須訪問路徑集合。
9.如權(quán)利要求1所述的方法,其中,所述跟蹤忽略預(yù)定類型的異常路徑。
10.ー種包含用于檢測測試程序中的資源泄漏的計算機(jī)可讀程序的計算機(jī)可讀存儲媒介,其中,所述計算機(jī)可讀程序在計算機(jī)上執(zhí)行時使得計算機(jī)啟動(50 對測試程序的控制流的分析;響應(yīng)于獲取控制流中的資源,生成(504)用于該資源的必須訪問路徑的初始集合; 根據(jù)控制流分析,通過至少添加或移除必須訪問路徑來動態(tài)調(diào)整必須訪問路徑集合, 來跟蹤(506)控制流中的資源;以及如果基于必須訪問路徑集合,所述資源在控制流出ロ處不可到達(dá),則確定(512)該資源被泄漏。
11.一種用于檢測資源泄漏的系統(tǒng),包括控制流表示生成器(314),被配置為生成程序的控制流表示; 必須訪問路徑模塊(320),被配置為存儲必須訪問路徑的多個集合; 跟蹤器(318),被配置為分析控制流并通過生成和調(diào)整必須訪問路徑集合來跟蹤資源, 從而響應(yīng)于獲取控制流中資源生成用于該資源的給定必須訪問路徑集合,且從而根據(jù)控制流分析,通過至少添加或移除必須訪問路徑來動態(tài)地調(diào)整給定必須訪問路徑集合,以跟蹤資源;以及報告模塊(322),被配置為如果基于必須訪問路徑集合確定所述資源在控制流出ロ 處不可到達(dá),則報告資源被泄漏。
12.如權(quán)利要求11所述的系統(tǒng),其中,所述跟蹤器(318)還被配置為響應(yīng)于給定必須訪問路徑集合中的任何變量釋放了所述資源,則在到達(dá)控制流的出口之前停止對資源的跟fe; ο
13.如權(quán)利要求11所述的系統(tǒng),其中,所述跟蹤器(318)還被配置為在過程間調(diào)用中跟蹤資源。
14.如權(quán)利要求13所述,其中,只有當(dāng)過程間調(diào)用引起必須訪問路徑集合中的修改或當(dāng)過程間調(diào)用引起所述資源的釋放時,該資源才會在過程間調(diào)用中被跟蹤。
15.如權(quán)利要求14所述的系統(tǒng),其中,所述調(diào)整還包括為過程間調(diào)用中使用的變量添加必須訪問路徑。
16.如權(quán)利要求11所述的系統(tǒng),其中,如果給定必須訪問路徑集合是空的,則所述資源不可到達(dá)。
17.如權(quán)利要求11所述的系統(tǒng),其中,所述跟蹤器還被配置為基于給定必須訪問路徑集合,通過評定用于采取分支的條件是否為真,來確定分支是否被采取。
18.如權(quán)利要求11所述的系統(tǒng),其中,所述跟蹤器(318)還被配置為如果所述給定集合包含的必須訪問路徑的數(shù)量超過第一閾值或者如果該集合包含的必須訪問路徑的長度超過第二閾值,則通過清空該給定集合來過濾該給定必須訪問路徑集合。
19.如權(quán)利要求11所述的系統(tǒng),其中,所述跟蹤器還被配置為在分析期間忽略預(yù)定類型的異常路徑。
20.一種用于報告程序中的資源泄漏的方法,包括生成(40 程序的控制流表示;分析(404)該控制流表示,來確定資源泄漏;確定G06)資源泄漏是已見證的泄漏還是由分析限制引起的潛在泄漏;以及報告G08)資源泄漏,從而已見證的泄漏更優(yōu)先于由分析限制引起的潛在泄漏。
21.如權(quán)利要求20所述的方法,其中,所述確定(406)包括確定任何泄漏是否是嵌套資源的泄漏,且其中所述報告還包括報告嵌套資源泄漏的至少ー個包裝器。
22.如權(quán)利要求21所述的方法,其中,所述報告(408)還包括對其中嵌套了資源泄漏的包裝器進(jìn)行聚類。
23.如權(quán)利要求20所述的方法,其中,所述報告(408)還包括過濾掉由于預(yù)定類型的異常路徑產(chǎn)生的泄露。
24.如權(quán)利要求20所述的方法,其中,所述分析(404)還包括啟動對程序的控制流的分析;響應(yīng)于獲取控制流中的資源,生成用于該資源的必須訪問路徑的初始集合。根據(jù)控制流分析,通過至少添加或移除必須訪問路徑來動態(tài)調(diào)整必須訪問路徑集合, 來跟蹤控制流中的資源;以及如果基于必須訪問路徑集合該資源在控制流出ロ處不可到達(dá),則確定該資源被泄漏。
25.一種計算機(jī)可讀存儲媒介,包括用于報告測試程序中的資源泄漏的計算機(jī)可讀程序,其中,所述計算機(jī)可讀程序在計算機(jī)上執(zhí)行時使得計算機(jī)生成(40 測試程序的控制流表示; 分析(404)該控制流表示,來確定資源泄漏;確定(406)該資源泄漏是已見證的泄漏還是由分析限制引起的潛在泄漏;以及報告(408)資源泄漏,從而已見證的泄漏更優(yōu)先于由分析限制引起的潛在泄漏。
全文摘要
公開了一種使用靜態(tài)分析來檢測(404)程序中的資源泄漏的系統(tǒng)和方法??梢詫討B(tài)可調(diào)整的必須訪問路徑集合用于(406)別名的目的,以在程序的過程內(nèi)和過程間跟蹤資源。還公開了可行動的報告(408),其中,資源泄漏被優(yōu)先級排序、過濾、聚類,以提高可用性。
文檔編號G06F12/00GK102597970SQ201080049854
公開日2012年7月18日 申請日期2010年7月30日 優(yōu)先權(quán)日2009年11月3日
發(fā)明者E·托爾拉克, S·錢德拉 申請人:國際商業(yè)機(jī)器公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1