1、基于大模型的软件缺陷定位与修复罗 丹|杭州逻界科技有限公司演讲嘉宾罗丹杭州逻界科技有限公司 CEO杭州逻界科技有限公司创始人,长期从事程序分析和编译优化领域的研究,研制多款特定领域的编译优化与缺陷修复工具。目 录CONTENTS1.背 景2.缺陷定位技术3.自动化生成修复建议4.总结与展望背景PART 01背景 软件缺陷u 随着软件使用范围的不断扩大和复杂度的不断提高,软件缺陷问题频发,造成巨大损失美国大选投票机系统缺陷导致6000张选票登记错误英国卫生服务系统缺陷导致密接人群未得到提醒程序缺陷导致Starliner飞船首飞失败背景 软件调试u 软件调试是解决软件缺陷的主要手段,在软件实现过程
2、中占据约50%的成本Testing program,17%Editing file,37%Localizing bugs,46%软件缺陷定位与修复u 缺陷定位是软件调试的关键步骤,在软件调试中可占据46%的时间缺陷定位在软件调试时间中占46%2软件实现过程中软件调试开销占50%1计划分析设计实现测试维护软件缺陷定位与修复 对企业软件研发具有重要意义背景 传统软件缺陷自动定位方法面临瓶颈u 对程序语义信息运用不充分u 缺乏与缺陷相关的专家知识u 场景局限于软件项目内部传统缺陷定位方法发展情况如何突破当前缺陷定位方法面临的性能瓶颈?基于程序频谱的缺陷定位方法基于程序依赖关系的缺陷定位方法基于机器学
3、习的缺陷定位方法背景代码理解大语言模型能够将代码功能转化为清晰、详细的自然语言解释 大语言模型提供了新的机遇缺陷定位需要具备的能力private boolean canRemoveArgFromCallSites(Node function,int argIndex)Definition definition=getFunctionDefinition(function);for(UseSite site:defFinder.getUseSites(definition)if(isModifiableCallSite(site)Node arg=getArgumentForCallOrNewO
4、rDotCall(site,argIndex);if(arg!=null&NodeUtil.mayHaveSideEffects(arg,compiler)return false;else return false;这段Java代码的功能是判断在JavaScript代码分析或修改的上下文中,是否可以从一个函数的所有调用点(call sites)中安全地移除一个指定的参数。具体的功能解释如下:1.获取函数定义:首先,通过调用getFunctionDefinition(function)获取传入的function节点所代表的JavaScript函数的定义。2.遍历使用点:接着,使用defFind
5、er.getUseSites(definition)获取这个函数定义的所有使用点(即函数被调用的地方)。3.检查每个使用点:对于函数的每个使用点,代码检查这个点是否是可修改的调用点,通过调用isModifiableCallSite(site)。如果某个调用点不可修改,则函数直接返回false,表示无法移除参数。4.分析参数:如果调用点可修改,代码会使用getArgumentForCallOrNewOrDotCall(site,argIndex)获取该点的指定索引(argIndex)上的参数。5.副作用检查:最关键的逻辑是检查参数是否可能有副作用,通过调用NodeUtil.mayHaveSide
6、Effects(arg,compiler)。副作用是指在执行过程中对状态的改变或与外部系统的可观察交互。如果参数有副作用,移除它是不安全的,方法将返回false。6.最终决定:如果在所有调用点中的参数都没有副作用,方法将得出结论,认为安全地移除参数是可行的,并将返回true。“Where Is the Bug and How Is It Fixed?”3背景代码理解大语言模型能够分析函数间的调用关系,并“推理”得出结果 大语言模型提供了新的机遇缺陷定位需要具备的能力public class Calculator public static void main(String args)doubl