本發明屬于軟件工程和軟件測試領域,特別是涉及一種面向深度學習框架的軟件缺陷定位方法。
背景技術:
1、深度學習框架,如pytorch和tensorflow,已然成為深度學習領域的支柱,極大地推動了人工智能系統的迅猛發展。這些框架提供了一套全面且系統的應用程序編程接口(applicationprogramming?interface,簡稱api),貫穿深度學習應用開發的始終。如圖1所示,從數據預處理到模型構建與訓練,再到模型評估、優化及最終部署,每一環節均有專門的api予以支撐。在深度學習模型的開發過程中,工程師們可以依托這些框架的api,將不同功能的組件如卷積層、全連接層、池化層和歸一化層等進行靈活組合,從而構建出結構復雜且性能卓越的神經網絡模型。一旦模型構建完成,開發者便可利用相關的訓練api啟動訓練流程,使模型能夠在海量數據上進行高效學習。模型訓練完畢后,推理(或稱預測)階段的重要性便凸顯出來。在這一階段,開發者通過調用框架的推理api,將經過訓練的成熟模型應用于實際數據中,以獲取精確的預測結果。本發明特別聚焦于tensorflow和pytorch兩大深度學習框架。這兩個框架在學術界和工業界均備受贊譽,憑借其強大的功能、卓越的性能以及出色的易用性,為深度學習應用的研發提供了有力的支撐。
2、近年的研究表明,一些傳統軟件缺陷定位技術已被證明是高效的,如基于程序變異分析的缺陷定位技術、基于程序切片的缺陷定位技術以及基于頻譜的缺陷定位技術。本發明將回顧上述三種技術,并探討這些技術在深度學習框架環境中的潛在適用性。
3、基于程序變異分析的缺陷定位技術是一種源于對軟件質量及測試過程深入研究的方法。該技術旨在為開發者提供有效的缺陷定位途徑,通過模擬真實缺陷的產生及其行為模式來實現。具體而言,對于給定的程序,此技術會人為地引入一系列細微的變化,從而生成變異的程序版本。這些變化,即“突變”,涉及對原始程序在語法或邏輯層面上的細微調整,如改變變量值、刪除語句或修改條件判斷的結果等。接下來,通過在變異后的程序上執行預先設計的測試用例集,技術會觀察并記錄這些突變對程序執行行為的影響。此技術的核心理念建立在一個假設之上:若某一突變觸發了測試用例的失敗,則該突變所在的位置極有可能是程序中真實缺陷的隱藏之處。這一假設基于直觀的認知,即程序中的缺陷多源于代碼未按預期執行,而突變則是對這種非預期執行的仿真。因此,通過分析導致測試用例失敗的突變及其在代碼中的確切位置,開發者能更精準地識別出程序中可能潛在的真實缺陷。這種方法不僅顯著提升了缺陷定位的準確性,同時也助力開發者更深入地理解程序的行為特性,從而有效提高軟件的質量和可靠性。然而,在深度學習框架的應用中,一個不可忽視的挑戰在于其編譯過程。深度學習框架在應用之前需經過編譯,這一過程常常耗費大量的計算資源和時間。基于程序變異分析的缺陷定位技術,其關鍵在于通過修改源代碼生成眾多突變體來模擬潛在的缺陷情況。由于需要構建大量的突變體,這一技術會帶來顯著的時間開銷。
4、基于程序切片的缺陷定位技術是軟件調試領域的關鍵工具,其核心優勢在于能夠深入解析程序語句間的依賴關系,從而精確識別與缺陷觸發緊密相關的語句集合,即所謂的程序切片。該技術為開發者在龐大復雜的代碼庫中快速定位問題提供了有力支持。程序切片技術主要分為靜態切片和動態切片兩大類。靜態切片依賴于靜態依賴分析,它能夠在不實際執行程序的情況下,識別出與特定切片標準(如特定語句或變量)相關聯的所有語句集合。而動態切片則更側重于程序的實際執行流程,它根據特定的執行軌跡來收集與切片標準直接相關的語句。此外,動態切片還可進一步細分為后向切片和前向切片,前者關注導致程序狀態變更的語句,后者則關注受這些狀態變更影響的語句。然而,基于程序切片的方法在處理深度學習框架中的多維張量時面臨明顯挑戰。在深度學習的計算圖構建與運行過程中,多維張量作為核心數據結構在各個計算節點之間傳遞。但深度學習框架中的潛在缺陷往往與整個張量無關,而是與其中的特定元素值密切相關?,F有技術難以精確地對多維張量執行有效的切片操作,因此無法準確識別出與缺陷直接相關的特定元素。
5、基于頻譜的缺陷定位技術在傳統軟件測試領域已得到深入應用,其主要目標是精確識別并隔離程序中的錯誤元素。這一技術的核心理念在于,通過收集測試用例的執行結果(包括通過和失敗的用例),分析測試用例執行期間各程序元素的運行頻率。利用這些頻率數據,本發明可以為每個程序元素計算出一個可疑值,該值可作為判斷其是否為程序失敗原因的參考指標。此外,為了更全面、細致地評估各元素的可疑程度,本發明常采用可疑值聚合策略,例如將失敗測試用例所觸及的語句的可疑值進行綜合,從而獲得更為精確的分析結果。這種聚合不僅基于單一的語句,還可以擴展到基本塊、函數或文件等不同層級,從而更好地映射出程序的結構特征和邏輯關系。總結來說,基于頻譜的缺陷定位技術的有效性受三個核心因素影響:首先是可疑值計算公式的選擇,它直接決定了如何從執行頻率中推導出程序元素的可疑性;其次是可疑值的聚合方法,它關乎如何全面且準確地評估各程序元素的問題可能性;最后是測試用例的質量,它們構成了頻譜信息收集與分析的數據基礎。對這些關鍵因素進行優化,能夠顯著提升基于頻譜的缺陷定位技術的準確性與效率,從而更有效地揭示并修復程序中的潛在問題。
6、然而,現有的缺陷定位技術主要針對一般軟件錯誤(如c/java程序中的錯誤)設計,其實現方式和變異算子并不適用于深度學習框架。此外,先前研究中的變異算子未針對深度學習框架的獨特特性進行專門設計,如計算圖和具體的深度學習操作等。
技術實現思路
1、為了填補深度學習框架在缺陷定位技術工具上的空缺,本發明提出一種面向深度學習框架的程序切片的缺陷定位方法,通過設計針對深度學習框架的變異規則、解析與模擬突變導致缺陷發生的原始失敗測試用例,從而生成通過的突變測試用例,變異算子選擇,收集執行覆蓋信息,最終運用頻譜技術精確定位缺陷。
2、本發明利用以下技術方案實現:
3、一種面向深度學習框架的程序切片的缺陷定位方法,包括:
4、輸入導致缺陷發生的原始失敗測試用例,對所述原始失敗測試用例進行深度解析以精準識別代碼構成,從識別的代碼中提取關鍵元素即目標變異點;
5、設計面向深度學習框架的變異規則;
6、應用所述變異規則對原始失敗測試用例實施模擬的突變,從而生成與原始失敗測試用例變異執行路徑高度相似且剔除了錯誤語句的突變測試用例;
7、采用metropolis-hastings算法依據所述突變測試用例實現每一輪迭代過程中的變異算子選擇,綜合考慮歷史迭代數據和當前測試用例的狀態,遞歸地選定最適合的變異算子,以進一步對目標原始失敗測試用例進行變異操作,逐步排除包含錯誤的代碼元素;
8、執行所述的原始失敗測試用例和所述的突變測試用例,分別收集所述原始失敗測試用例和所述突變測試用例執行過程中的覆蓋信息;
9、依據收集到的所述覆蓋信息和所述突變測試用例的狀態,運用基于頻譜的缺陷定位算法進行缺陷定位,輸出精確的缺陷定位結果。
10、在一些實施方式中,所述變異規則進一步包括api層級變異算子、控制流層級變異算子、變量層級變異算子、圖層級變異算子和設備層級變異算子,其中,通過api層級變異算子修改api調用中的參數,通過控制流層級變異算子改變條件語句的邏輯,通過變量層級變異算子替換賦值語句中的值,通過圖層級變異算子修改計算圖,通過設備層級變異算子更改設備分配指令。
11、在一些實施方式中,所述依據收集到的所述覆蓋信息和所述突變測試用例的狀態,運用基于頻譜的缺陷定位算法進行缺陷定位,輸出精確的缺陷定位結果的步驟進一步包括:
12、基于收集到的所述覆蓋信息和所述突變測試用例的狀態,通過分析所述覆蓋信息,計算出深度學習框架中每個代碼元素的ncf、ncs、nuf和nus,包括文件、函數和基本塊三種粒度;計算出每個代碼元素的可疑值分數,表達式如下:
13、
14、其中,ncf表示覆蓋該語句的失敗測試用例的數量,ncs表示覆蓋該語句的通過測試用例的數量,nuf表示未覆蓋該語句的失敗測試用例的數量,nus表示未覆蓋該語句的通過測試用例的數量;將深度學習框架中每個代碼元素的可疑值分數進行排序,排名越靠前的代碼元素越可疑。
15、在一些實施方式中,采用metropolis-hastings算法依據所述突變測試用例實現每一輪迭代過程中的變異算子選擇進一步包括:根據當前變異規則mra的概率分布采樣下一個變異規則mrb;若mrb相較于mra表現更優,則mrb將被確定性地接受;反之,若mrb表現非優,仍有概率被接受;在獲得mrb的結果后,更新其評分,為下一次迭代對突變規則重新排序。
16、在一些實施方式中,所述覆蓋信息涵蓋每個測試用例執行期間的代碼路徑,所述代碼路徑涉及文件、函數以及基本塊在內的不同層次的代碼元素;覆蓋信息轉化為頻譜矩陣,其中每一行代表一個特定的代碼元素,每一列對應于ncf、ncs、nuf和nus四個關鍵指標。
17、在一些實施方式中,所述應用所述變異規則對原始失敗測試用例實施模擬的突變進一步包括:將原始失敗測試用例的源代碼構建對應的抽象語法樹,對所述抽象語法樹進行有針對性的修改。
18、在一些實施方式中,在已知變異規則mra的情況下接受變異規則mrb的概率計算如下:
19、
20、其中,ka和kb分別表示變異規則mra和mrb在按照優先級得分降序排列的變異規則列表中的位置。
21、與現有技術相比,本發明所能達成的有益技術效果和取得的技術進步如下:
22、1)對比分析原始失敗測試用例與通過測試用例在執行路徑上的異同,生成與原始失敗測試用例執行路徑高度相似,但剔除了錯誤語句的新測試用例,能夠實現深入挖掘代碼元素與缺陷之間的潛在聯系;
23、2)綜合考慮歷史迭代數據和當前測試用例的狀態,選定最適合的變異算子,從而逐步排除包含錯誤的代碼元素;
24、3)進一步地,計算出文件、函數和基本塊三種代碼元素粒度的可疑分數,進行排名越靠前的代碼元素越可疑的分析判斷,以輸出精確的缺陷定位結果,從而幫助開發人員快速鎖定并修復程序切片中代碼中的缺陷,能夠有效提升深度學習框架的整體質量和可靠性;