学校网站建设介绍范文,wordpress 后台500,网站开发技术服务合同范本,在线logo静态代码扫描(SA)能快速识别代码缺陷#xff0c;如空指针访问、数组越界等#xff0c;以较高ROI保障质量及提升交付效率。当前扫描能力主要依赖人工经验生成规则#xff0c;泛化能力弱且迭代滞后#xff0c;导致漏出。本文提出基于代码知识图谱解决给机器学什么的问题…静态代码扫描(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、同时将调研更多基础切片技术拿到更多丰富有效代码切片以提升准召率。