本文來自AI新媒體量子位(QbitAI)
點開許久不用的“XX旅行”,你想買張回家的車票。頁面上彈出的更新提示寫着:
本次更新将修複系統XX功能漏洞。
“這些App怎麼天天更新。”你心裡有些不耐煩。
如果有系統能自動修複更新檔,可能就沒這麼麻煩了。你别說,還真有。

麻省理工學院(MIT)電子工程和計算機科學教授Martin Rinard就曾開發出一些通用模闆,算法可以通過模闆生成并評估一系列備用更新檔。
最近,Rinard的學生Fan Long和加州大學聖地亞哥分校的Peter Amidon又研發出一個新系統,通過分析軟體已經打出的更新檔,學習生成自己的模闆。
在一個手工編碼的更新檔生成系統中,可能有5至10個模闆,但這個新系統建立了85個,幫助它生成更多樣化的精确更新檔。它的模闆可适用于特定類型軟體,不會産生很多無用的備用更新檔。在測試中,被稱為“Genesis”的新系統修複的漏洞數量是最好的手工編碼模闆系統的兩倍。
“這是一個權衡的過程,”Long說,“一方面,你想生成足夠多的備用更新檔,讓你可以從中挑選出有用的那幾個。另一方面,你又不想讓備用更新檔數量過多,多到無法找到它。”
訓練Genesis的資料集中包含兩組代碼塊:原始代碼、漏洞及修複的更新檔的代碼。Genesis先構造出幾對訓練執行個體,這樣資料集中的每一項都能與其他項配對。
之後,Genesis分析每一對執行個體,并建立一個通用的表示形式,即模闆草稿,它将兩個原始版本的兩個更新檔合成在一起,也可能合成其他無用的備用更新檔。
接下來,Genesis測試了訓練集中所有示例的每個模闆。每個模闆僅基于兩個示例合成,但也可能适用于其他幾個例子。模闆有兩個标準,即漏洞的數量和産生的無用備選模闆的數量。
例如,一個模闆生成了10個備用更新檔,其中4個在訓練資料中出現錯誤,而另一個模闆生成了1000個備用更新檔,其中隻有5個可以用的更新檔。相比之下,還是前者更合适。
在這些評分标準的基礎上,Genesis選擇了500個最有能力勝任的模闆。對每個模闆來說,它都以此用其他示例增強最初兩個示例的訓練集,建立了一個龐大的三例訓練集。每個訓練集都會改變草稿模闆,産生更通用的模闆,然後執行同樣的評估程式。
這個過程循環四輪後,500個最好的模闆都接受了五個示例的訓練。最後,用稍微有些不同的評估标準進行篩選,確定訓練集中每個錯誤都被糾正了。
在研究人員的實驗中,最終的篩選将模闆的數量從500減少到85。在Genesis裡用Java編寫的程式中,MIT的研究人員将其性能與表現最好的手工編碼的Java更新檔生成器做了對比。
從41個開源程式設計項目中抽取的49個測試用例中,Genesis正确修補了其中21個漏洞,而手工編碼的系統則修補了11個。
研究人員表示,如果訓練資料更充足、計算能力更強大,評估的備用模闆可能結果還能更好。
最後,附研究論文位址:
https://people.csail.mit.edu/rinard/paper/fse17.genesis.pdf
— 完 —
本文作者:安妮
原文釋出時間:2017-09-29