濟(jì)南做網(wǎng)站0531soso做網(wǎng)站多少錢(qián)一年
1. 引言
研究背景:現(xiàn)代生產(chǎn)代碼庫(kù)極其復(fù)雜并且不斷更新。靜態(tài)分析器可以幫助開(kāi)發(fā)人員發(fā)現(xiàn)代碼中的潛在問(wèn)題(在本文的其余部分中稱為錯(cuò)誤),這對(duì)于在這些大型代碼庫(kù)中保持高代碼質(zhì)量是必要的。雖然通過(guò)靜態(tài)分析盡早發(fā)現(xiàn)錯(cuò)誤是有幫助的,但修復(fù)這些錯(cuò)誤的問(wèn)題在實(shí)踐中仍然主要是手動(dòng)任務(wù),阻礙了靜態(tài)分析工具的采用。
現(xiàn)存問(wèn)題:大多數(shù)靜態(tài)分析器都會(huì)查找常見(jiàn)錯(cuò)誤類別的實(shí)例,例如潛在的空取消引用、流行 API 的錯(cuò)誤使用或特定語(yǔ)言結(jié)構(gòu)的誤用。研究團(tuán)隊(duì)觀察到,針對(duì)特定錯(cuò)誤類別的修復(fù)通常彼此相似:它們有一個(gè)模式。也就是說(shuō),過(guò)去人類對(duì)同一錯(cuò)誤類別的修復(fù)可能會(huì)提供有關(guān)如何修復(fù)該錯(cuò)誤類別的未來(lái)實(shí)例的見(jiàn)解。鑒于這一觀察,是否可以通過(guò)學(xué)習(xí)過(guò)去的修復(fù)來(lái)自動(dòng)修復(fù)發(fā)現(xiàn)的錯(cuò)誤?
研究?jī)?nèi)容:論文通過(guò)學(xué)習(xí)過(guò)去的修復(fù)來(lái)解決自動(dòng)修復(fù)常見(jiàn)錯(cuò)誤類別實(shí)例的問(wèn)題。論文假設(shè)兩個(gè)輸入:(1)修復(fù)特定類型錯(cuò)誤的一組更改,例如來(lái)自代碼庫(kù)的版本歷史記錄。這些變化可以作為訓(xùn)練數(shù)據(jù)來(lái)學(xué)習(xí)修復(fù)模式。(2) 一段帶有我們要修復(fù)的靜態(tài)分析警告的代碼。僅給出這兩個(gè)輸入,問(wèn)題是預(yù)測(cè)解決方案,以類似于或等于人類開(kāi)發(fā)人員所做的方式解決靜態(tài)分析警告。通過(guò)自動(dòng)生成修復(fù)程序并僅將是否應(yīng)用修復(fù)程序的最終決定留給人類,可以大大減少解決靜態(tài)分析器指出的錯(cuò)誤所花費(fèi)的總體工作量。
論文專注于那些具有不平凡但重復(fù)性修復(fù)的錯(cuò)誤。一方面,有些錯(cuò)誤類別通常意味著特定的修復(fù)。例如,對(duì)于建議某個(gè)字段為最終結(jié)果的警告,實(shí)施自動(dòng)修復(fù)建議非常簡(jiǎn)單。這種自動(dòng)修復(fù)可以由該規(guī)則的作者在靜態(tài)分析器中定義,而不需要知道應(yīng)用該規(guī)則的特定上下文;事實(shí)上,有些容易出錯(cuò)規(guī)則帶有自動(dòng)修復(fù)功能。另一方面,一些錯(cuò)誤需要復(fù)雜的、特定于應(yīng)用程序的修復(fù),例如用戶進(jìn)行一系列特定交互后 UI 選項(xiàng)卡不顯示的問(wèn)題。在這里,論文的目標(biāo)是介于這兩個(gè)極端之間的錯(cuò)誤類別,其中找到修復(fù)程序并非易事,但典型的修復(fù)程序?qū)儆谝唤M重復(fù)出現(xiàn)的修復(fù)模式。對(duì)于此類錯(cuò)誤類別,通常存在不止一種方法來(lái)解決問(wèn)題,并且解決錯(cuò)誤類別的特定實(shí)例的正確方法取決于上下文,例如,靜態(tài)分析警告周?chē)拇a。
作為本工作中針對(duì)的錯(cuò)誤類別的一個(gè)示例,請(qǐng)考慮 NullPointerExceptions 仍然是 Java 和其他語(yǔ)言中最普遍的錯(cuò)誤之一。如果靜態(tài)分析器警告潛在的空取消引用,開(kāi)發(fā)人員可以通過(guò)各種方式解決該問(wèn)題。上圖顯示了空取消引用錯(cuò)誤修復(fù)的三個(gè)匿名示例,這些示例分別向現(xiàn)有 if 條件添加了一個(gè)連接、用三元運(yùn)算替換了調(diào)用以及添加了提前返回。雖然所有這些修復(fù)都引入了某種空檢查,但確切的修復(fù)在很大程度上取決于現(xiàn)有的代碼。除了這些示例之外,還有更多方法可以修復(fù)空取消引用錯(cuò)誤,例如,通過(guò)添加新的 if 語(yǔ)句或以分離方式擴(kuò)展現(xiàn)有的 if 條件。學(xué)習(xí)所有這些修復(fù)模式并決定將哪一種模式應(yīng)用于給定的錯(cuò)誤代碼是一個(gè)不小的問(wèn)題。論文的工作旨在自動(dòng)修復(fù)大規(guī)模工業(yè)軟件開(kāi)發(fā)中的錯(cuò)誤。 這種設(shè)置會(huì)帶來(lái)一些有趣的挑戰(zhàn):
- 為了減少修復(fù)錯(cuò)誤所花費(fèi)的人力時(shí)間,該方法可能只提出少量潛在的修復(fù)方案,最好只提出一個(gè)修復(fù)方案。
- 為了使此修復(fù)為開(kāi)發(fā)人員所接受,建議的修復(fù)應(yīng)該類似于人類:與人類開(kāi)發(fā)人員將實(shí)現(xiàn)的修復(fù)非常相似或完全相同。