01/ 從開(kāi)發(fā)者的煩惱說(shuō)起
開(kāi)發(fā)者在編寫代碼時(shí)瓢娜,需要花費(fèi)大量時(shí)間在低層次的重復(fù)編碼上,特別是針對(duì)一些語(yǔ)法比較冗余的開(kāi)發(fā)語(yǔ)言礼预。
同時(shí)眠砾,開(kāi)發(fā)者經(jīng)常被戲稱為面向搜索引擎編程,因?yàn)槲覀兘?jīng)常需要通過(guò)通用搜索引擎去查詢文檔資料托酸,但是通用搜索引擎的內(nèi)容質(zhì)量參差不齊褒颈,開(kāi)發(fā)者在找文檔、選文檔上都需要花費(fèi)大量時(shí)間获高,這會(huì)讓我們的開(kāi)發(fā)過(guò)程碎片化哈肖,無(wú)法集中精力聚焦在業(yè)務(wù)邏輯的開(kāi)發(fā)上。
在代碼評(píng)審階段念秧,評(píng)審人需要費(fèi)時(shí)費(fèi)力的人工評(píng)審淤井,特別是當(dāng)變更代碼特別多的時(shí)候,評(píng)審人很難去完成評(píng)審任務(wù),只能大致看一下币狠,從而違背了評(píng)審的初衷游两。在評(píng)審過(guò)程中,傳統(tǒng)的代碼檢測(cè)工具無(wú)法發(fā)現(xiàn)深層次的潛在缺陷漩绵,也不能提供缺陷的修復(fù)方案贱案,從而為線上故障埋下了隱患。
那么諸多的煩惱止吐,應(yīng)該怎么解決呢宝踪?
02/ 代碼智能如何賦能日常開(kāi)發(fā)
阿里云云效代碼智能團(tuán)隊(duì)通過(guò)AI技術(shù),打造了多款業(yè)界領(lǐng)先的智能編碼以及代碼檢測(cè)工具碍扔,是國(guó)內(nèi)首個(gè)將AI能力應(yīng)用到代碼評(píng)審場(chǎng)景的團(tuán)隊(duì)瘩燥。此外,我們也通過(guò)與學(xué)術(shù)界的深入合作不同,通過(guò)論文和專利厉膀,保持著技術(shù)的先進(jìn)性。下面我們?cè)敿?xì)介紹二拐。
代碼智能補(bǔ)全能力及原理
在編寫代碼時(shí)服鹅,云效Codeup 能通過(guò) WebIDE 為開(kāi)發(fā)者提供智能化的編碼輔助,快速完成輕量級(jí)編碼百新,也能讓開(kāi)發(fā)者通過(guò)語(yǔ)言描述快速地找到所需的代碼文檔或者代碼示例企软,減少編碼過(guò)程的碎片化。我們來(lái)看一個(gè)完整的代碼智能補(bǔ)全視頻演示吟孙。
https://www.bilibili.com/video/BV1Yf4y157NT/
(代碼智能補(bǔ)全完整視頻演示)
在編寫代碼時(shí)澜倦,只需要輸入幾個(gè)字符,甚至一個(gè)字符杰妓,代碼智能補(bǔ)全插件就能結(jié)合代碼上下文及其語(yǔ)義藻治,推薦出多個(gè)整行的代碼補(bǔ)全候選項(xiàng),前面標(biāo)注?圖標(biāo)的就是代碼智能補(bǔ)全插件提供的結(jié)果巷挥。在不同的代碼行桩卵,輸入同一個(gè)字符,比如X字符倍宾,它就能推薦出更適合當(dāng)前位置的行級(jí)代碼補(bǔ)全結(jié)果雏节。它也能自動(dòng)地將代碼上文中出現(xiàn)的變量或參數(shù),自動(dòng)地填充到合適的代碼補(bǔ)全候選項(xiàng)中高职。
代碼智能補(bǔ)全能夠幫助開(kāi)發(fā)者減少重復(fù)性較高的低層次編碼钩乍,大幅提升編碼效率,以視頻演示的代碼片段為例怔锌,
? 如果只是使用 IDE 內(nèi)置的代碼補(bǔ)全寥粹,需要敲擊鍵盤700次变过,花費(fèi)5分鐘的時(shí)間才能完成代碼的編寫;
? 使用某業(yè)界頂尖的同類產(chǎn)品涝涤,鍵盤輸入次數(shù)減少了33%媚狰,花費(fèi)的時(shí)間減少了6%。為什么鍵盤敲擊次數(shù)減少了很多阔拳,時(shí)間減少的卻很少呢崭孤?因?yàn)樗o出的代碼補(bǔ)全候選項(xiàng)過(guò)多,并且存在較多的錯(cuò)誤糊肠,需要開(kāi)發(fā)者花時(shí)間去做選擇辨宠,選擇太多反而不是好事;
? 使用我們?cè)菩ё灾餮邪l(fā)的代碼智能補(bǔ)全插件罪针,鍵盤輸入次數(shù)減少了65%彭羹,編碼耗時(shí)減少了57%黄伊,只需要2分鐘左右就能完成代碼的編寫泪酱。
那么我們是如何做到的呢?我們使用了多模型融合技術(shù)还最,將擅長(zhǎng)點(diǎn)各有側(cè)重的多個(gè)模型融合到一起墓阀,一個(gè)人決策可能不太準(zhǔn),多個(gè)人一起決策就能盡可能的減少誤判拓轻,其中的深度學(xué)習(xí)模型斯撮、語(yǔ)義模型等都能做到代碼上下文的感知,輸入同一個(gè)字符扶叉,在不同的代碼位置勿锅,會(huì)推薦不同的代碼補(bǔ)全結(jié)果,并且能將上文中出現(xiàn)的變量或參數(shù)枣氧,自動(dòng)填充到補(bǔ)全的候選項(xiàng)中溢十。
阿里巴巴內(nèi)部開(kāi)發(fā)者的使用情況顯示,相比于 IDE 內(nèi)置的補(bǔ)全达吞,代碼智能補(bǔ)全能幫助開(kāi)發(fā)者平均提升20%的編碼效率张弛。那么代碼智能補(bǔ)全的實(shí)現(xiàn)原理是怎么樣的呢?
我們會(huì)將代碼解析成抽象語(yǔ)法樹(shù)酪劫,并對(duì)AST進(jìn)行數(shù)據(jù)處理吞鸭,我們將處理好的數(shù)據(jù)通過(guò)深度學(xué)習(xí)模型進(jìn)行訓(xùn)練,剛開(kāi)始的幾個(gè)迭代覆糟,還只能生成一些雜亂的序列刻剥,模型會(huì)將生成的序列與期望生成的序列進(jìn)行對(duì)比,計(jì)算誤差并更正模型數(shù)據(jù)滩字,在N個(gè)迭代之后造虏,它已經(jīng)能生成符合語(yǔ)法的正確代碼序列盯滚。在代碼智能補(bǔ)全階段,我們將深度學(xué)習(xí)模型酗电、語(yǔ)義模型魄藕、統(tǒng)計(jì)學(xué)模型等多個(gè)不同種類的模型融合在一起,去生成代碼補(bǔ)全的候選項(xiàng)撵术,然后通過(guò)語(yǔ)法校正背率,避免將不符合語(yǔ)法的代碼推薦給開(kāi)發(fā)者。
代碼智能評(píng)審
在代碼評(píng)審中嫩与,當(dāng)開(kāi)發(fā)者創(chuàng)建評(píng)審時(shí)寝姿,云效Codeup 會(huì)為其推薦更合適的評(píng)審人,他可能更熟悉變更的代碼划滋,而評(píng)審人也能在評(píng)審列表上看到每個(gè)評(píng)審的預(yù)估耗時(shí)饵筑,幫助評(píng)審人充分利用碎片化時(shí)間進(jìn)行評(píng)審,同時(shí)在瀏覽評(píng)審時(shí)处坪,開(kāi)發(fā)者經(jīng)常需要查看某個(gè) API 的定義或引用根资,而我們提供的語(yǔ)法跳轉(zhuǎn)服務(wù)可以讓評(píng)審人像在 IDE 中一樣,在網(wǎng)頁(yè)端進(jìn)行代碼定義和引用的跳轉(zhuǎn)同窘。此外玄帕,我們也提供了更深層次的代碼檢測(cè)工具幫助評(píng)審人更快的發(fā)現(xiàn)隱藏缺陷,并能快速的修復(fù)缺陷想邦。
代碼智能安全檢測(cè)
關(guān)于代碼檢測(cè)裤纹,這里主要聊一下代碼內(nèi)容安全的檢測(cè)。說(shuō)到代碼安全丧没,每年都會(huì)有非常多漏洞被發(fā)現(xiàn)鹰椒,并且被黑客利用。比如早些年的Struts框架上傳文件模塊的漏洞呕童,能讓黑客遠(yuǎn)程執(zhí)行Shell命令漆际;近期的比如Chrome的零日漏洞,它存在Use-After-Free的問(wèn)題拉庵,它會(huì)允許黑客在渲染進(jìn)程中去執(zhí)行遠(yuǎn)程代碼灿椅,比如用戶如果在Chrome中打開(kāi)PDF文件,黑客就能通過(guò)遠(yuǎn)程命令獲取相關(guān)的用戶數(shù)據(jù)钞支。
為此茫蛹,云效Codeup為開(kāi)發(fā)者提供了依賴包漏洞檢測(cè)、源碼漏洞檢測(cè)等代碼內(nèi)容安全檢測(cè)工具烁挟。
依賴包漏洞檢測(cè)
依賴包漏洞檢測(cè)能幫助開(kāi)發(fā)者發(fā)現(xiàn)三方包中存在的漏洞隱患婴洼,三方包大部分是開(kāi)源軟件,而開(kāi)源軟件很少進(jìn)行安全測(cè)試撼嗓,并且黑客也更愿意去發(fā)現(xiàn)開(kāi)源軟件的漏洞柬采,因?yàn)榇a是開(kāi)源的欢唾,比較容易發(fā)現(xiàn)安全漏洞,而且一旦發(fā)現(xiàn)了安全漏洞粉捻,那么它的影響面會(huì)很大礁遣,絕大部分引用了存在安全漏洞三方包的應(yīng)用,都會(huì)受到黑客攻擊的威脅肩刃。
云效Codeup 的依賴包漏洞檢測(cè)工具會(huì)先將代碼進(jìn)行編譯構(gòu)建祟霍,并采集代碼所有的依賴包,然后通過(guò)漏洞匹配算法從漏洞庫(kù)中查詢準(zhǔn)確的漏洞信息盈包,為了讓漏洞庫(kù)覆蓋更全面沸呐,我們集成了多個(gè)外部漏洞庫(kù)以及阿里集團(tuán)安全團(tuán)隊(duì)自建的漏洞庫(kù)。開(kāi)發(fā)者獲取到的漏洞信息會(huì)包含建議升級(jí)的版本范圍呢燥,為了減少依賴包版本升級(jí)后對(duì)應(yīng)用穩(wěn)定性產(chǎn)生的影響崭添,我們會(huì)對(duì)每個(gè)依賴包版本進(jìn)行有效性以及兼容性分析,然后會(huì)為開(kāi)發(fā)者推薦建議升級(jí)的版本號(hào)叛氨,并且提供通過(guò)一鍵創(chuàng)建代碼評(píng)審修復(fù)依賴包漏洞的快捷入口呼渣。
源碼漏洞檢測(cè)
在代碼內(nèi)容安全檢測(cè)領(lǐng)域,除了剛才提到的依賴包漏洞檢測(cè)力试,我們也提供了對(duì)代碼庫(kù)自身的源碼漏洞檢測(cè)工具徙邻。
云效Codeup 基于源傘檢測(cè)引擎,將代碼中的數(shù)據(jù)流和控制流轉(zhuǎn)換成數(shù)學(xué)語(yǔ)言畸裳,然后對(duì)數(shù)學(xué)語(yǔ)言進(jìn)行定理證明,能夠更準(zhǔn)確的推導(dǎo)代碼中的路徑條件淳地,減少誤報(bào)怖糊。同時(shí),它具備跨函數(shù)的全文分析能力颇象,比如有多層的函數(shù)調(diào)用關(guān)系伍伤,如果最底層的函數(shù)存在一些代碼安全風(fēng)險(xiǎn),并且會(huì)影響最上層的業(yè)務(wù)代碼遣钳,它也能通過(guò)將代碼的數(shù)據(jù)流以及函數(shù)調(diào)用關(guān)系扰魂,解析為圖結(jié)構(gòu),通過(guò)對(duì)代碼圖譜的分析蕴茴,能夠快速的發(fā)現(xiàn)潛在的安全風(fēng)險(xiǎn)劝评。此外,我們對(duì)檢測(cè)出來(lái)的漏洞信息也會(huì)給與詳細(xì)的解釋倦淀,告訴開(kāi)發(fā)者每個(gè)漏洞在代碼中是怎么一步步帶來(lái)影響的蒋畜。我們一起看一個(gè)視頻。
https://www.bilibili.com/video/BV1Ew411R7Vp/
(云效Codeup 代碼檢測(cè)視頻)
當(dāng)我們提交完代碼后撞叽,云效Codeup 能自動(dòng)執(zhí)行已開(kāi)啟的代碼檢測(cè)姻成,比如視頻中已開(kāi)啟的依賴包漏洞檢測(cè)插龄,我們也可以手動(dòng)開(kāi)啟源碼漏洞檢測(cè)。
依賴包漏洞檢測(cè)能發(fā)現(xiàn)眾多三方包漏洞科展,會(huì)在詳細(xì)信息中展示疑似的CVE漏洞信息均牢;源碼漏洞檢測(cè)能發(fā)現(xiàn)代碼注入、遠(yuǎn)程命令執(zhí)行才睹、緩沖區(qū)溢出等安全漏洞膨处,并且會(huì)在詳細(xì)信息的右側(cè)展示漏洞在代碼中的影響路徑。
我們可以在依賴包漏洞的詳細(xì)信息中砂竖,通過(guò)一鍵創(chuàng)建代碼評(píng)審真椿,幫助我們快速的生成修復(fù)指定漏洞的代碼變更及其合并請(qǐng)求,評(píng)審描述中會(huì)提供漏洞的解釋信息以及升級(jí)包的兼容性分析乎澄。
03/ 代碼智能技術(shù)的不斷探索
除了上面介紹的已經(jīng)落地到云效的智能化能力突硝,我們與浙江大學(xué)、莫納什大學(xué)置济、南洋理工大學(xué)等高校在代碼生成解恰、代碼搜索、智能評(píng)審等領(lǐng)域進(jìn)行了深入的合作浙于,在多個(gè)領(lǐng)域產(chǎn)出了論文和專利护盈。
比如,我們與南洋理工大學(xué)合作的代碼摘要生成項(xiàng)目羞酗,很多時(shí)候開(kāi)發(fā)者不太喜歡寫注釋腐宋,或者不知道怎么寫注釋,導(dǎo)致代碼的可維護(hù)性不高檀轨,為了幫助開(kāi)發(fā)者更好的理解代碼胸竞,我們期望通過(guò)對(duì)代碼邏輯的學(xué)習(xí)和理解,自動(dòng)生成出代碼片段的摘要注釋参萄。我們會(huì)先從代碼大數(shù)據(jù)中挖掘出一批代碼的片段及其注釋卫枝,構(gòu)建代碼片段檢索庫(kù),然后從檢索庫(kù)中找到與目標(biāo)代碼相似的代碼片段讹挎,并且將目標(biāo)代碼和相似的代碼片段都解析成CPG圖結(jié)構(gòu)校赤,我們會(huì)基于注意力機(jī)制通過(guò)融合算法將兩個(gè)圖結(jié)構(gòu)融合在一起,然后經(jīng)過(guò)圖權(quán)重的靜態(tài)計(jì)算及動(dòng)態(tài)計(jì)算筒溃,并通過(guò)模型獲得對(duì)圖信息的編碼數(shù)據(jù)马篮,最后,將相似代碼片段的摘要注釋進(jìn)行編碼后铡羡,與圖結(jié)構(gòu)的編碼信息聚合在一起积蔚,通過(guò)解碼器就能生成目標(biāo)代碼的摘要注釋。相關(guān)論文《RETRIEVAL-AUGMENTED GENERATION FOR CODE SUMMARIZATION VIA HYBRID GNN》烦周。
開(kāi)發(fā)者花費(fèi)時(shí)間比較多的地方除了寫代碼尽爆,就是調(diào)試代碼怎顾,我們期望通過(guò)代碼缺陷定位去輔助開(kāi)發(fā)者排查缺陷。代碼缺陷定位會(huì)先從代碼變更數(shù)據(jù)中漱贱,挖掘出有效的缺陷代碼作為訓(xùn)練集槐雾,并且將缺陷代碼解析成抽象語(yǔ)法樹(shù),然后將抽象語(yǔ)法樹(shù)按代碼行進(jìn)行拆解幅狮,每一行代碼對(duì)應(yīng)一個(gè)子語(yǔ)法樹(shù)募强,將子語(yǔ)法樹(shù)從葉子節(jié)點(diǎn)到根節(jié)點(diǎn)編碼成多條子路徑,最后崇摄,將每行代碼關(guān)聯(lián)的子路徑放到基于注意力機(jī)制的深度學(xué)習(xí)模型中進(jìn)行訓(xùn)練擎值。當(dāng)需要代碼缺陷定位時(shí),開(kāi)發(fā)者提交代碼后逐抑,我們會(huì)從代碼變更中抽取出變更代碼行的子路徑鸠儿,通過(guò)模型推理,我們就能得到每行代碼的缺陷概率厕氨,從而輔助開(kāi)發(fā)者排查缺陷进每。
除了上面提到的兩個(gè)合作項(xiàng)目,我們與各個(gè)高校在多個(gè)領(lǐng)域進(jìn)行了廣泛的合作命斧。我們期望在不久的將來(lái)田晚,開(kāi)發(fā)者能在云效的智能化研發(fā)平臺(tái)上,只需要提供文字描述或需求文檔国葬,我們就能為其生成出大部分基礎(chǔ)代碼及其依賴項(xiàng)贤徒,并能通過(guò)智能編碼輔助快速的完成代碼填充,代碼缺陷也將無(wú)處遁形胃惜,期望大家可以保持對(duì)云效產(chǎn)品動(dòng)態(tài)的關(guān)注泞莉。
本文由博客一文多發(fā)平臺(tái) OpenWrite 發(fā)布!