利用代碼知識圖譜實現Bug定位
給定軟件項目中缺陷的自然語言描述,缺陷定位可以自動定位相關的源文件。最近,基于深度學習的模型被用于提取代碼的語義信息,對缺陷定位有顯著的改進。然而,編程語言是一種高度結構化和邏輯化的語言,它包含源文件內部和跨源文件的各種關系。在本文中,作者提出了一個名為KGBugLocator的模型,利用知識圖譜來提取代碼內部的關系,使用基于關鍵字監督的雙向注意力機制正則化模型,挖掘源代碼文件和缺陷報告間的內在關聯。 基于深度學習的缺陷定位存在兩個問題:
1. 如何表示編程語言以更好地匹配自然語言。
2. 如何更好地提取特征以降低編程語言和自然語言之間的語義鴻溝。
文章所提模型的框架如圖1所示,分為四個部分:
- 代碼知識圖譜嵌入
- 預編碼
- 基于關鍵詞監督的雙向注意力機制
- Bug定位

Fig. 1 模型框架
文章所構建的代碼知識圖譜示例如圖2所示。代碼知識圖譜基于AST構建,節點和邊分別對應代碼實體和代碼實體間關系。代碼實體有5種類型:class、property、method、parameter和variable;對應的關系實體也是5類:class間的inheritance關系,class和property、class和method、method和parameter、method和variable之間的has關系,property和class、variable和class之間的instance_of關系,method和class之間的return type關系,method和method間的call關系。文章使用LSTM捕捉Bug報告的語義信息,使用CNN捕捉代碼的語義信息,得到預處理的文本和代碼表示。然后使用關鍵字監督幫助注意力機制更好地關注關鍵信息。具體來說,作者將既在代碼中出現,又在報告中出現的token進行標記,將其所在的代碼標記為關鍵代碼行,關鍵代碼行的權重高于非關鍵代碼行。

Fig. 2 代碼知識圖譜

Fig. 3 數據集結構