報告聚焦 AI 大模型領域,對過去一年的技術演進動態、技術趨勢、以及開源開發者生態資料進行多方位的總結和梳理。
在第二章《TOP 101-2024 大模型觀點》中,螞蟻集團程式分析團隊技術專家,香港科技大學博士謝筱恆探討了大模型生成程式碼的安全性與質量問題,並分析相關技術手段與未來發展方向。
全文如下:
大模型生成程式碼的安全與質量
隨著人工智慧技術的快速發展,基於大型預訓練模型的程式碼生成工具,如 OpenAI 的 Codex 和 GitHub 的 Copilot,已成為開發者的重要助手,能顯著地提升開發者的開發效率。
然而,這些工具在帶來便利的同時,也帶來了程式碼安全性和質量的新挑戰。根據 IDC 資料,82% 的開發者已使用帶有智慧程式碼生成功能的工具,而這些開發者中的 71% 表示其超過 40% 的程式碼由這些工具生成。
GitClear 研究檢查了 2020 年 1 月至 2023 年 12 月間最初編寫的 1.53 億行程式碼,在 AI 輔助程式設計使用者激增期間,程式碼翻轉(即需在兩週內修復或恢復的程式碼)情況明顯增加,這也表明程式碼穩定性在下降。
同時,Snyk 的調查顯示,超半陣列織 “偶爾” 或 “頻繁” 地遭遇了因低質量 AI 生成程式碼引發的安全問題。
本文將探討大模型生成程式碼的安全性與質量問題,並分析相關技術手段與未來發展方向。
大模型基於 Transformer 架構,經過大規模程式碼資料集的預訓練,能夠理解並生成符合上下文邏輯的程式碼。然而,這些模型並不具備真正的程式設計理解能力,而是透過學習大量程式碼樣本中的模式進行生成。因此,生成的程式碼可能存在如下的安全和質量問題。
程式碼質量不穩定。大模型生成的程式碼有時存在語法錯誤、邏輯問題或無法透過測試的情況。例如,生成的程式碼可能缺少必要的語法元素(如括號、分號)而無法編譯,或在執行時因邏輯錯誤導致意外行為。此外,許多生成的程式碼在功能測試中無法透過,增加開發者的修復工作量,降低了效率。
缺乏上下文理解。大模型通常基於輸入的表面模式生成程式碼,缺乏對業務邏輯和系統架構的深度理解。這導致生成的程式碼可能不符合專案的整體編碼規範,無法正確呼叫已有模組或介面,甚至與現有功能重複。在複雜專案中,這種缺乏上下文的生成方式使程式碼的直接可用性較低,開發者需要投入額外精力進行適配和修改。
安全隱患。生成程式碼在處理使用者輸入、檔案操作和網路請求等敏感操作時,容易忽略安全性,導致潛在漏洞。例如,未對使用者輸入進行驗證可能引發 SQL 注入或 XSS 攻擊,檔案路徑處理不當可能導致目錄遍歷或未授權的檔案讀寫,網路請求中未正確加密資料可能導致資訊洩露。這些問題增加了程式碼在生產環境中的風險,可能被惡意利用。
法律和版權問題。大模型生成的程式碼可能基於公開程式碼庫或開源專案,而這些程式碼可能受到版權保護,存在侵權風險。例如,生成的程式碼可能直接複製開原始碼片段,未遵守相關開源協議,或與受版權保護的程式碼高度相似,從而引發法律爭議。這可能導致開發者或組織面臨智慧財產權訴訟及相關損失。
模型訓練資料的質量。大模型的程式碼生成能力極大程度依賴於訓練資料的質量。如果模型訓練時使用的資料集包含不良的程式碼模式、不規範的編碼風格或者過時的技術,生成的程式碼往往會繼承這些問題,導致質量較差。例如,模型可能生成帶有潛在安全漏洞的程式碼(如未驗證使用者輸入的 SQL 查詢),或使用已經被淘汰的技術框架和方法(如不安全的加密演算法)。此外,訓練資料中若缺少高質量的程式碼示例,生成結果可能在可維護性、效能和測試性方面表現不佳。
上下文理解的侷限性。大模型的程式碼生成通常基於短期上下文(如使用者輸入的一段描述或程式碼片段),缺乏對整體系統架構和長期上下文的理解。這種侷限性使得其在複雜專案中難以生成高質量的程式碼。例如,在大型軟體專案中,模型可能忽略全域性變數的依賴關係、模組間的互動邏輯或編碼規範,導致生成的程式碼無法融入現有的系統環境。此外,模型難以理解業務需求背後的深層邏輯,可能生成表面上正確但實際不可用的程式碼,從而給開發者帶來額外的修改和除錯工作。
缺乏除錯能力。與人類開發者不同,大模型無法主動除錯或驗證自己生成的程式碼,因而可能生成帶有隱藏邏輯錯誤的程式碼,而這些錯誤往往難以快速定位和修復。例如,生成的程式碼可能在邊界條件下表現異常,或者因函式呼叫錯誤導致執行時崩潰。這種缺乏除錯能力的特性,使得開發者需要手動排查生成程式碼的潛在問題,增加了工作負擔。此外,生成程式碼可能未遵循最佳實踐(如缺乏註釋或測試用例),進一步加大了除錯難度。
為提升大模型生成程式碼的安全性與質量,業界與學術界提出了多種解決方案,涵蓋工具研發、模型改進和技術研究等多個方面。
生成程式碼的安全性驗證與質量評估。工業界已開發了多種程式碼分析工具,如 Black Duck 和 AWS 提供的服務,能夠幫助開發者檢測並修復 AI 生成程式碼中的安全漏洞。工具如 CodeQL 和 CodeFuse-Query 支援透過自定義查詢快速定位安全隱患,並以高效能的語法和語義分析能力提供即時反饋。這些工具不僅速度快,還支援定製化查詢,並能無縫整合到開發環境和持續整合工具鏈中,自動化地檢查和最佳化生成程式碼的安全性與質量。此外,研究者也在探索透過形式化驗證、符號執行等技術對生成程式碼進行安全審查,並利用 AI 自動評估程式碼質量,特別是關注可維護性和效能等指標。
結合安全編碼實踐的生成模型。將常見的安全編碼準則融入大模型的訓練中,是提升生成程式碼安全性和可靠性的關鍵。例如,透過在模型訓練資料中引入安全編碼示例,增強模型在處理使用者輸入、檔案操作、網路請求等場景下的安全性。同時,近年來的研究還表明,結合大模型的程式語義理解能力,透過提示工程技術,可以引導模型輸出更高質量的程式碼分析結果,如檢測原始碼中的潛在漏洞。這類研究不僅提升了大模型的程式碼分析能力,也為開發者提供了新的技術手段。
自動除錯與修復功能的整合。開發整合自動除錯與修復功能的程式碼生成工具,是保障程式碼質量的重要方向。這些工具可以在程式碼生成後,自動檢測並修復潛在錯誤,減少開發者手動修復的負擔。例如,CodeFuse 的編譯診斷修復 Agent 可以基於程式碼分析發現質量和安全問題,然後基於預設規則或模型預測直接修復漏洞,從而提高程式碼的穩定性和可用性。
多模態模型的應用與上下文理解。未來的程式碼生成模型可能結合程式碼、自然語言和影像等多模態資訊,進一步提高生成程式碼的準確性和上下文理解能力。例如,透過結合專案文件、架構設計圖和程式碼片段,模型可以更全面地理解開發環境,從而生成更符合業務邏輯或系統架構的程式碼。
可解釋性與審計功能的增強。提升程式碼生成模型的可解釋性與透明性是增強信任度的核心方向。例如,透過提供審計機制,開發者可以追溯生成程式碼的來源並瞭解模型的決策過程。這不僅有助於發現潛在問題,還能幫助開發者更高效地驗證程式碼的安全性和質量。
大模型生成程式碼在提高開發效率、降低程式設計門檻等方面展現出了巨大的潛力。然而,程式碼的安全性與質量問題仍然是亟待解決的挑戰。透過結合靜態分析、強化學習、模型最佳化等技術手段,可以在一定程度上提升生成程式碼的安全性和質量。
未來的研究應聚焦於模型的可解釋性、安全性最佳化、多模態融合等方向,以充分發揮大模型在程式碼生成領域的優勢。同時,開發者在使用大模型生成程式碼時,應保持審慎態度,結合自身專業知識,對生成的程式碼進行仔細的審查和測試,確保程式碼的可靠性和安全性。
謝筱恆
螞蟻集團程式分析團隊技術專家,香港科技大學博士。螞蟻程式分析團隊致力於打造螞蟻的先進、專業、普惠的程式分析系統,過去四年團隊發表 30 + 篇國際頂會論文,技術能力廣泛應用於變更影響評估、安全風險檢測、程式碼自動修復、構建程式知識圖譜以及智慧問答系統等多個方面。在智慧研發時代,我們正在全力推進軟體工程和 AI 智慧結合的技術演進,努力幫螞蟻打造軟體工程 3.0 時代的研發新正規化。
閱讀完整報告:https://talk.gitee.com/report/china-open-source-2024-annual-report.pdf