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

news2024/11/25 3:02:55

静态代码扫描(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.coloradmin.cn/o/1170960.html

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

相关文章

基础课19——客服系统知识库的搭建流程

1.收集整理业务数据 注意:我们在做业务数据收集时,往往是甲方提供给我们的,这时就需要确定一个标准,否则对知识库梳理工作会带来很大的难度,建议和甲方沟通确认一个双方都统一的知识库原材料。 2.创建知识库 在创建知…

JavaScript函数传递的秘密武器:apply、call和bind的完全指南

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续…

MySQL:一文掌握MySQL索引

目录 概念优缺点索引的数据结构Hash索引有序数组索引二叉搜索树平衡二叉树B树B树 索引的物理结构MyISAM存储引擎InnoDB存储引擎 索引的分类页、区、段change buffer 和索引回表和覆盖索引索引优化面试题索引哪些情况下会失效什么是索引下推主键选择自增和uuid的区别 概念 官方…

一键混剪软件、根据模板批量剪辑、多种分割、多种合并、多种混剪、文案提取、文字转语音等

在这个短视频时代,视频剪辑已经成为了一个炙手可热的行业。但是,对于大多数人来说,视频剪辑是一项既复杂又繁琐的工作。不过,现在有了我们的新伙伴——视频闪闪,一键混剪软件,您将迎来全新的视频剪辑体验&a…

Spring源码编译步骤

Spring源码学习 一、Gradle 为什么下载gradle呢?我们平时不都是用maven吗?原因只有一个,spring源码是用gradle构建的,所以,你想看spring源码必须安装和学会使用gradle,那么,让我们开始gradle之…

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…

通讯录(C语言文件版本)(超详细过程)

❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️ ❇️❇️❇️❇️ 不同的信念 ❇️❇️❇️❇️ ❇️❇️❇️ 决定不同的命运 ❇️❇️❇️ ❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️ &#x1f4d6;通讯录 ✅具备的功能 ℹ️需要的头文件名 #include<…

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否是完全二叉树的算法

完全二叉树&#xff1a;就是每层横着划过去是连起来的&#xff0c;中间不会断开 比如下面的左图就是完全二叉树 再比如下面的右图就是非完全二叉树 那我们可以采用层序遍历的方法&#xff0c;借助一个辅助队列 当辅助队列不空的时候&#xff0c;出队头元素&#xff0c;入队头…

开发知识点-PHP从小白到拍簧片

从小白到拍簧片 位异或运算&#xff08;^ &#xff09;引用符号(&)strlen() 函数base64_encode预定义 $_POST 变量session_start($array);操作符php 命令set_time_limit(7200)isset()PHP 命名空间(namespace)new 实例化类extends 继承 一个类使用另一个类方法error_reporti…

如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压…

ADO实战指南

这里写目录标题 ADO概念ADO主要对象对象间的相互联系对象模型示意图 关键代码关于代码中的一些问题设置字符串连接对象OLE DB是什么&#xff1f;与ADO的关系是什么&#xff1f;执行命令时&#xff0c;使用连接对象来访问数据库。close与nothing做了什么事&#xff1f;连接对象为…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

torch安装

https://download.pytorch.org/whl/torch_stable.html cp36 是python3.6的意思 python3.6对应torch1.8

外卖系统内部机理揭秘:了解更多

外卖系统是一个涉及多个环节和技术的复杂系统&#xff0c;包括前端用户交互、后端数据处理、订单管理和配送等多个方面。 技术架构概述&#xff1a; 前端应用程序&#xff1a; 包括用户界面和餐厅界面&#xff0c;常见的技术包括 HTML、CSS、JavaScript 和前端框架&#xff…

【入门Flink】- 06Flink作业提交流程【待完善】

Standalone 会话模式作业提交流程 代码生成任务的过程&#xff1a; 逻辑流图&#xff08;StreamGraph&#xff09;→ 作业图&#xff08;JobGraph&#xff09;→ 执行图&#xff08;ExecutionGraph&#xff09;→物理图&#xff08;Physical Graph&#xff09;。 作业图算子链…

【漏洞复现】Aapache_Tomcat_AJP协议_文件包含漏洞(CVE-2020-1938)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号CVE-2020-1938漏洞名称Aapache_Tomcat_AJP文件包含漏洞漏洞评级高…

el-select 搜索无选项时 请求接口添加输入的值

el-select 搜索无选项时 请求接口添加输入的值 <template><div class"flex"><el-select class"w250" v-model"state.brand.id" placeholder"请选择" clearable filterable :filter-method"handleQu…

关闭Dell xps 系列笔记本触控屏

【电脑】->【管理】->【设备管理器】 右键 禁用选择即可

怎么测量直线模组的精度?

直线模组是一款比较多变的一种产品&#xff0c;适合多种行业&#xff0c;同时它也适合比较多的环境&#xff0c;是一种比较全面的直线运动的装置。直线模组是非常精密的自动化机械设备&#xff0c;在实践中&#xff0c;应该要严格把握具体精度&#xff0c;并且在必要的时候&…

CDN加速是否对SEO有正面影响

当谈到网站性能优化和SEO&#xff08;搜索引擎优化&#xff09;时&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速无疑是一个重要的话题。CDN是一种分布式网络基础设施&#xff0c;它通过将网站内容分发到全球各地的边缘服务器&#xff0c;从而加速内容的传递。在这篇…