AI根據(jù)代碼內(nèi)容自動(dòng)起函數(shù)名,再也不怕命名不規(guī)范的同事了|開(kāi)源
看有些人的代碼像看推理小說(shuō)
夢(mèng)晨 發(fā)自 凹非寺
量子位 報(bào)道 | 公眾號(hào) QbitAI
有的人能把代碼寫成推理小說(shuō)。
需要一個(gè)臨時(shí)變量的時(shí)候就叫temp,需要多個(gè)就叫var1,var2。
甚至用拼音縮寫當(dāng)函數(shù)名,比如查詢訂單就叫cxdd。
要想看懂這樣的代碼,得聯(lián)系上下文反復(fù)推敲,還原每個(gè)部分的真實(shí)作用。
這個(gè)過(guò)程叫做反混淆(Deobfuscation)。
麻煩,著實(shí)麻煩。就沒(méi)有省事兒點(diǎn)的辦法嗎?
讓AI來(lái)啊!
最近,F(xiàn)acebook就出了這樣一個(gè)語(yǔ)言模型DOBF,專治代碼混淆。
像下圖這種,所有不影響運(yùn)行的變量名、函數(shù)名、類名,都被替換成無(wú)意義的符號(hào),AI都能作出猜測(cè)并嘗試還原。
來(lái)看看和正確答案的對(duì)比,雖然不是完全一樣,但AI的改法也大大提高了代碼的可讀性。
像FUNC_0,源代碼中是“重置參數(shù)”,AI改成“初始化權(quán)重”,也完全說(shuō)得通。
DOBF模型目前除了Python還支持C++和Java。
編碼不規(guī)范的人畢竟是少數(shù),這個(gè)模型更廣泛的用途是恢復(fù)故意做混淆以保護(hù)知識(shí)產(chǎn)權(quán)的代碼,比如這種:
代碼寫好后,把不影響編譯運(yùn)行的部分,批量替換成人類難以分辨的符號(hào),給破譯增加難度。
在這之前也有掩碼語(yǔ)言模型(Masked Language Model)用于恢復(fù)被遮蔽的文本。
用于恢復(fù)代碼的有哈工大&微軟開(kāi)發(fā)的CodeBERT和Facebook之前開(kāi)發(fā)的TransCoder,但效果都不如最新的DOBF。
DOBF超過(guò)它們靠的不是模型架構(gòu)上的創(chuàng)新或數(shù)據(jù)集的完善,而是提出了新的預(yù)訓(xùn)練任務(wù)。
合理的任務(wù)指導(dǎo)AI學(xué)習(xí)
之前的掩碼語(yǔ)言模型多是隨機(jī)選擇要掩蔽的部分,經(jīng)常會(huì)選到括號(hào)逗號(hào)這種對(duì)AI來(lái)說(shuō)沒(méi)什么難度的。
DOBF的做法是指定遮蔽變量名、函數(shù)名和類名并讓AI去恢復(fù),這個(gè)任務(wù)難度更大,能迫使AI學(xué)到更深層的規(guī)律。
另外還用相同的符號(hào)替代多次出現(xiàn)的同一名稱,這樣可以防止AI發(fā)現(xiàn)有的名字可以復(fù)制粘貼之后學(xué)會(huì)偷懶走捷徑。
像上圖中的變量V3,AI從第3行的定義可以看出這個(gè)變量是List類型,再一看第5行調(diào)用的是pop(0)。
這不是先進(jìn)先出嘛,AI就會(huì)命名成queue(隊(duì)列)而不是stack(堆棧)了。
更厲害的還在后面,DOBF通過(guò)代碼內(nèi)容甚至能判斷出相應(yīng)函數(shù)是生成斐波那契數(shù)列和做向量點(diǎn)積的。
DOBF在架構(gòu)上其實(shí)沒(méi)有特別的設(shè)計(jì),只是為了公平對(duì)比分別訓(xùn)練了兩個(gè)和CodeBERT、TransCoder層數(shù)一樣的模型。
成功的關(guān)鍵之處就在于合理的訓(xùn)練任務(wù)。
微調(diào)一下能完成更多任務(wù)
驗(yàn)證了這個(gè)方法有效后,F(xiàn)acebook把這個(gè)訓(xùn)練任務(wù)提取出來(lái)稱為DOBF任務(wù),還可以用于訓(xùn)練其他語(yǔ)言模型。
比如在TransCoder模型上把DOBF作為預(yù)訓(xùn)練任務(wù),再用CodeXGLUE基準(zhǔn)測(cè)試中的下游任務(wù)進(jìn)行微調(diào)。
結(jié)果在代碼抄襲檢測(cè)、總結(jié)代碼生成文檔、和自然語(yǔ)言搜索代碼片段這3個(gè)任務(wù)上,使用DOBF或MLM+DOBF預(yù)訓(xùn)練都取得了更好的成績(jī)。
Facebook下一步還要以DOBF作為指導(dǎo),看看能不能為自然語(yǔ)言設(shè)計(jì)更好的預(yù)訓(xùn)練目標(biāo)。
不過(guò)代碼上的事還不算完,人類在混淆代碼上可是無(wú)所不用其極的。
期待著有一天,AI連國(guó)際C語(yǔ)言混亂代碼大賽上的變態(tài)代碼也能看懂。
Github地址:
https://github.com/facebookresearch/CodeGen/blob/master/docs/dobf.md
論文地址:
https://arxiv.org/abs/2102.07492
國(guó)際C語(yǔ)言混亂代碼大賽:
http://www.ioccc.org/
— 完 —
量子位 QbitAI · 頭條號(hào)簽約
關(guān)注我們,第一時(shí)間獲知前沿科技動(dòng)態(tài)