夢晨 發自 凹非寺

量子位 報道 | 公眾號

有的人能把代碼寫成推理小說。

需要一個臨時變量的時候就叫temp,需要多個就叫var1,var2。

甚至用拼音縮寫當函數名,比如查詢訂單就叫cxdd。

要想看懂這樣的代碼,得聯系上下文反復推敲,還原每個部分的真實作用。

這個過程叫做反混淆()。

麻煩,著實麻煩。就沒有省事兒點的辦法嗎?

讓AI來??!

最近,就出了這樣一個語言模型DOBF,專治代碼混淆。

像下圖這種,所有不影響運行的變量名、函數名、類名,都被替換成無意義的符號,AI都能作出猜測并嘗試還原。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

來看看和正確答案的對比,雖然不是完全一樣,但AI的改法也大大提高了代碼的可讀性。

代碼寫的真棒_怎么讓ai寫代碼_代碼寫出來怎么用

像,源代碼中是“重置參數”,AI改成“初始化權重”,也完全說得通。

DOBF模型目前除了還支持C++和Java。

編碼不規范的人畢竟是少數,這個模型更廣泛的用途是恢復故意做混淆以保護知識產權的代碼,比如這種:

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

代碼寫好后,把不影響編譯運行的部分,批量替換成人類難以分辨的符號,給破譯增加難度。

在這之前也有掩碼語言模型( )用于恢復被遮蔽的文本。

用于恢復代碼的有哈工大&微軟開發的和之前開發的,但效果都不如最新的DOBF。

DOBF超過它們靠的不是模型架構上的創新或數據集的完善,而是提出了新的預訓練任務。

合理的任務指導AI學習

之前的掩碼語言模型多是隨機選擇要掩蔽的部分,經常會選到括號逗號這種對AI來說沒什么難度的。

DOBF的做法是指定遮蔽變量名、函數名和類名并讓AI去恢復,這個任務難度更大,能迫使AI學到更深層的規律。

另外還用相同的符號替代多次出現的同一名稱,這樣可以防止AI發現有的名字可以復制粘貼之后學會偷懶走捷徑。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

像上圖中的變量V3,AI從第3行的定義可以看出這個變量是List類型,再一看第5行調用的是pop(0)。

這不是先進先出嘛,AI就會命名成(隊列)而不是(堆棧)了。

更厲害的還在后面,DOBF通過代碼內容甚至能判斷出相應函數是生成斐波那契數列和做向量點積的。

代碼寫的真棒_代碼寫出來怎么用_怎么讓ai寫代碼

DOBF在架構上其實沒有特別的設計,只是為了公平對比分別訓練了兩個和、層數一樣的模型。

成功的關鍵之處就在于合理的訓練任務。