大模型在代码缺陷检测领域的实践

静态代码扫描(SA)能快速识别代码缺陷,如空指针访问、数组越界等,以较高ROI保障质量及提升交付效率。当前扫描能力主要依赖人工经验生成规则,泛化能力弱且迭代滞后,导致漏出。本文提出基于代码知识图谱解决给机器学什么的问题,以及基于代码大模型解决机器怎么学的问题,让计算机像人一样看懂代码,并自动发现代码中的缺陷,给出提示,以期达到更小的人力成本,更好的效果泛化和更高的问题召回。

01

代码缺陷检测背景介绍

静态代码扫描(SA)指在软件工程中,程序员写好源代码后,在不运行计算机程序的条件下,对程序进行分析检查。通过在代码测试之前,在编码阶段就介入SA,提前发现并修复代码问题,有效减少测试时间,提高研发效率,发现BUG越晚,修复的成本越大。

图片

MEG的SA能力于2018年建立,支持C++、GO等语言,建设100+个规则,覆盖大部分MEG的模块,一定程度保障线上质量。当前检测主要依赖人工生成规则,存在人工编写成本高,以及泛化能力弱且迭代滞后,导致问题漏出。2022年Q2,我们团队尝试引入大模型:通过代码语言大模型,实现机器自主检测缺陷,提升泛化能力和迭代效率,减少人工编写规则的成本。接下来,为大家带来相关介绍。

技术交流

建了大模型技术交流群!想要进交流群、获取原版资料的同学,可以直接加微信号:dkl88194。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、添加微信号:dkl88194,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

在这里插入图片描述

02

基于规则的代码缺陷检测主要问题

随着缺陷规则增多,覆盖的语言和模块增多,有两个突出的痛点急需解决:

1、每种规则都需人工根据经验和后续的漏出分析维护,成本较高;以空指针场景为例,人工编写的规则代码共4439行,维护的回归case共227个,但Q2仍有3个bug漏出。我们如何引入大模型减少开发成本,提质增效?

2、有效率偏低,扫描的能力有限(如断链、框架保证非空、复杂场景静态很难识别等,且风险的接受不同,扫描的部分高风险问题存在修复意愿低,对用户造成打扰。我们如何通过模型,从历史误报中学习经验,进行过滤,减少打扰,提升召回?

03

解决方案

为了解决2个痛点问题,提出对应的解决方案。

3.1 基于大模型的缺陷自动扫描

如何让计算机像人一样看懂代码,并自动发现代码中的缺陷,给出提示。要让计算机自主进行缺陷检测,核心需要解决2个技术难题:

【学什么】给计算机输入什么内容,能让计算机更快、更好的学习;主要依托代码知识图谱提取目标变量相关的片段,减少机器学习需要的样本量,提升学习的准确性。

【怎么学】针对输入的内容,采用什么算法,能让机器像人一样读懂多种程序语言,并完成检测任务;采用深度学习的方法,主要包含预训练和微调两部分。预训练技术让计算机在海量无标签的样本中学习到多种语言的通用代码语义,本项目主要采用开源的预训练大模型。微调技术通过给大模型输入缺陷检测的样本,从而得到适配场景的大模型,让机器自主的进行缺陷识别。

图片

3.1.1 代码知识图谱提取片段

为了平衡模型性能和资源,不同大模型允许输入的token量级不同,如Bert模型限制512个token,因此,需要对输入进行缩减。代码知识图谱是基于程序分析手段,对业务源代码经过模糊或精准的词法分析、语法分析和语义分析后,结合依赖分析、关系挖掘等手段,构建得到的软件白盒代码知识网。图谱提供了多种数据访问方式,用户可以低成本的访问代码数据。

借助于代码知识图谱能力,可以根据不同场景制定不同的与目标变量或目标场景相关的上下文源码获取能力,提取的关键步骤包括:

  • 构建被分析代码的知识图谱

  • 目标变量检测识别:在变更代码中识别目标变量,作为待检测变量

  • 变量依赖分析:基于控制流和数据流的与目标变量相关的依赖变量分析

  • 特征语句提取和剪枝

图片

以空指针风险检测为例,最终得到如下样例的代码切片信息:

图片

3.1.2 采用大模型学习算法进行缺陷预测

大模型检测缺陷有两种思路:

1、一种是通过判别式的方法,识别是否有缺陷以及缺陷类型;

2、一种是通过生成式的方法,构建prompt,让程序自动扫描所有相关缺陷。

本项目主要采用判别式的方法,并在实践中证明该方法具有一定可行性。生成式的方法同步实验中,接下来分别介绍两种思路的一些实践。

3.1.2.1 判别式的方法

通过分类的思想,基于模型,从历史的样本中学习规律,从而预测新样本的类别。深度学习众多算法中,如TextCNN、LSTM等,应该采用哪一种?我们通过多组对比实验,最终选择效果最佳的BERT代码大模型。

图片

△模型效果

采用BERT进行缺陷检测共含3步,分别是预训练、微调和推理。

  • 预训练阶段采用开源的多语言大模型,已较好的学习多种程序语言的语义。

  • 微调阶段,给模型输入上述通过代码知识图谱提取的变量使用点相关的切片,以及是否有缺陷或者缺陷类型的标签,生成微调模型,让机器具备做检测任务的能力。输入的格式:

 {"slices": [{"line":"行代码内容", "loc": "行号"}]"mark": {"label":"样本标签", "module_name""代码库名", "commit_id""代码版本", "file_path""文件名", "risk_happend_line""发生异常的行"}}
  • 推理阶段,分析使用点目标变量的相关切片,通过微调模型进行预测,得到使用点是否有缺陷,以及缺陷类型

模型上线后,用户对结果反馈状态包括误报和接受,采集真实反馈样本,加入微调模型自动训练,从而到达自动迭代、快速学习新知识的目的。

图片

3.1.2.2 生成式的方法

生成式模型百花齐发,有闭源的如chatgpt、文心一言,有开源的如llama、bloom和starcode等。我们主要尝试文心一言、llama和bloom,通过prompt(few shot、引入思维链、指定抽象的引导规则)和微调的方式,探索模型在空指针缺陷检测的预测效果。整体f1测度不高,最佳的bloom61.69%,相比Bert路线的80%有差距,且模型的稳定性较差。因生成式路线有自身的优势,如参数量大存在智能涌现具有更强的推理能力,允许输入的token量不断增加可减少对切片清洗的依赖,可与修复一起结合等,我们预判在缺陷检测场景生成式是个趋势,接下来我们将继续优化,不断尝试prompt和微调,通过更合适的引导,更好的激发模型的潜力,从而提升生成式方法在检测场景的效果。

图片

3.2 采用规则+机器学习进行误报过滤

缺陷检测场景识别的缺陷是风险,存在接受度问题,如何过滤掉其中低风险问题,是个难题。通过分析误报和修复的样本,我们采集误报相关的特征,如指针类型,模块误报率、文件误报率等跟误报相关的10+特征,训练机器学习模型(逻辑回归),判断是否需要过滤.

整体方案架构图如下:

图片

04

业务落地

基于AI的代码缺陷检测能力可以集成进入code管理平台,每次代码提交,展示可能存在的代码缺陷,阻塞合入,并采集研发人员的反馈,便于模型迭代。

05

收益和展望

5.1 收益

通过理论和实践证明,让计算机自主学习程序语言并完成缺陷检测任务具有一定可行性。

1、本项目的方法已在IEEE AITest Conference 2023发表论文:

《Leveraging Deep Learning Models for Cross-function Null Pointer Risks Detection》(https://ieeeaitest.com/accepted-papers/)

2、实际落地效果:2023Q2 C++空指针场景已覆盖1100+模块,修复问题数662个,相比规则型静态代码扫描召回占比26.9%,增量召回484个,重合度26.8%,初步证明AI的召回能力,打开了大模型做代码缺陷检测的大门,同时也验证大模型具备传统规则的扩召回、低成本的优势,可形成标记+训练+检测的自闭环。

5.2 展望

基于5.1收益,给了我们用大模型做代码缺陷检测的信心,后续我们继续在以下几个方面加强:

1、扩展更多语言和场景,如除零、死循环、数组越界场景,并在多语言go、java等进行快速训练,并进行发布;

2、随着生成式模型的兴起,也会逐渐积累有效的问题和修复数据,贡献文心通用大模型,进行预训练和微调,以探索生成式模型在智能缺陷检测与修复领域的应用;

3、同时将调研更多基础切片技术,拿到更多丰富有效代码切片,以提升准召率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/130764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据Doris(十六):Doris表的数据划分

文章目录 Doris表的数据划分 一、Partition 二、 Bucket 三、PROPERTIES 四、 ENGINE Doris表的数据划分 Doris支持单分区和复合分

【深度学习】快速制作图像标签数据集以及训练

快速制作图像标签数据集以及训练 制作DataSet 先从网络收集十张图片 每种十张 定义dataSet和dataloader import glob import torch from torch.utils import data from PIL import Image import numpy as np from torchvision import transforms import matplotlib.pyplot…

CAD操作技巧学习总结

1&#xff0c;已知一个圆&#xff0c;画该圆切线。 L命令画直线&#xff0c;再tan指令确定第一个点为切点&#xff0c;依次输入&#xff08;长度&#xff09;<&#xff08;角度&#xff09;&#xff0c;如55<-45,负号为顺时针。 2&#xff0c;中心点偏移。 O命令偏移&am…

go语言 | grpc原理介绍(三)

了解 gRPC 通信模式中的消息流 gRPC 支持四种通信模式&#xff0c;分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。 简单 RPC 在gRPC中&#xff0c;一个简单的RPC调用遵循请求-响应模型&#xff0c;通常涉及以下几个关键步骤和组件&#xff1a; 请求头&a…

鸿蒙LiteOs读源码教程+向LiteOS中添加一个简单的基于线程运行时的短作业优先调度策略

一、鸿蒙Liteos读源码教程 鸿蒙的源码是放在openharmony文件夹下&#xff0c;openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。 内核是操作系统的核心部分&#xff0c;所以像负责&#xff1a;资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在…

升级 MacOS 系统后,playCover 内游戏打不开了如何解决

我们有些小伙伴在升级了 macOS 系统后大概率会遇到之前能够正常使用的 playCover 突然游戏打不开了&#xff0c;最近 mac 刚刚正式推出了 MacOS 14.1 ,导致很多用户打开游戏会闪退&#xff0c;我们其实只需要更新一下 playCover 就可以解决 playCover 正式版更新会比较慢所以我…

基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python 计算机竞赛

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

【rust/esp32】初识slint ui框架并在st7789 lcd上显示

文章目录 说在前面关于slint关于no-std关于dma准备工作相关依赖代码结果参考 说在前面 esp32版本&#xff1a;s3运行环境&#xff1a;no-std开发环境&#xff1a;wsl2LCD模块&#xff1a;ST7789V2 240*280 LCDSlint版本&#xff1a;master分支github地址&#xff1a;这里 关于s…

【音视频 | opus】opus编码的Ogg封装文件详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

汇编语言(举个栗子)

汇编语言&#xff08;Assembly Language&#xff09;是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言&#xff0c;亦称为符号语言。在汇编语言中&#xff0c;用助记符代替机器指令的操作码&#xff0c;用地址符号或标号代替指令或操作数的地址。在不同…

基于51单片机土壤湿度检测及自动浇花系统仿真(带时间显示)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机浇花 获取完整源码源文件仿真源文件原理图源文件论文报告等 单片机土壤湿度检测及自动浇花系统仿真&#xff08;带时间显示&#xff09; 具体功能&#xff1a; &#xff08;1&#xff09;液晶第一行显示实际湿度&am…

信道编码译码及MATLAB仿真

文章目录 前言一、什么是信道编码&#xff1f;二、信道编码的基本逻辑—冗余数据1、奇偶检验码2、重复码 三、编码率四、4G 和 5G 的信道编码1、卷积码2、维特比译码&#xff08;Viterbi&#xff09;—— 概率译码3、LTE 的咬尾卷积码4、LTE 的 turbo 码 五、MATLAB 仿真1、plo…

0008Java安卓程序设计-ssm基于Android平台的健康管理系统

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,…

Git 的基本操作 ——命令行

Git 的工作流程 详解如下&#xff1a; 本地仓库&#xff1a;是在开发人员自己电脑上的Git仓库,存放我们的代码(.git 隐藏文件夹就是我们的本地仓库) 远程仓库&#xff1a;是在远程服务器上的Git仓库,存放代码(可以是github.com或者gitee.com 上的仓库,或者自己该公司的服务器…

【ElasticSearch系列-05】SpringBoot整合elasticSearch

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…

PTA:前序序列创建二叉树

前序序列创建二叉树 题目输入格式输出格式输入样例&#xff08;及其对应的二叉树&#xff09;输出样例 代码 题目 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以二叉链表存储&#xff09;。 例如如下的先序遍…

SpringCloudAlibaba - 项目完整搭建(Nacos + OpenFeign + Getway + Sentinel)

目录 一、SpringCloudAlibaba 项目完整搭建 1.1、初始化项目 1.1.1、创建工程 1.1.2、配置父工程的 pom.xml 1.1.3、创建子模块 1.2、user 微服务 1.2.1、配置 pom.xml 1.2.2、创建 application.yml 配置文件 1.2.3、创建启动类 1.2.4、测试 1.3、product 微服务 1…

如何使用CodeceptJS、Playwright和GitHub Actions构建端到端测试流水线

介绍 端到端测试是软件开发的一个重要方面&#xff0c;因为它确保系统的所有组件都能正确运行。CodeceptJS是一个高效且强大的端到端自动化框架&#xff0c;与Playwright 结合使用时&#xff0c;它成为自动化Web、移动甚至桌面 (Electron.js) 应用程序比较好用的工具。 在本文中…

代码随想录算法训练营第23期day38|动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

目录 一、动态规划理论基础 1.动态规划的解题步骤 2.动态规划应该如何debug 二、&#xff08;leetcode 509&#xff09;斐波那契数 1.递归解法 2.动态规划 1&#xff09;确定dp数组以及下标的含义 2&#xff09;确定递推公式 3&#xff09;dp数组如何初始化 4&#x…

C++虚表与虚表指针详解

类的虚表 每个包含了虚函数的类都包含一个虚表。 当一个类&#xff08;B&#xff09;继承另一个类&#xff08;A&#xff09;时&#xff0c;类B会继承类A的函数的调用权。所以如果一个基类包含了虚函数&#xff0c;那么其继承类也可调用这些虚函数&#xff0c;换句话说&…