1、大语言模型时代的变异分析王博 北京交通大学演讲嘉宾王博北京交通大学计算机与信息技术学院讲师、硕士生导师,CCF专业会员、CCF系统软件专委执行委员、CCF开源发展委员会执行委员。分别于北京大学、中国科学技术大学和中南大学获得博士、硕士和学士学位。研究兴趣为软件测试与调试,已在ASE、ISSTA、TOSEM、软件学报等发表多篇论文。担任ASE、FSE、ICST、Internetware 等软件工程重要会议PC,担任TSE、TOSEM、TDSC、EMSE、JSS、ASEJ、IET Software、JSME、软件学报等多个期刊审稿人。获得ISSTA 2017 杰出论文奖,全国大学生系统能力大赛优秀
2、指导教师和北京市高校优质教案。目 录CONTENTS1.背景2.痛点3.解决思路4.具体实现5.总结与展望背景PART 01软件正确性至关重要欧空局 Ariane 5波音 737 Max 坠机海湾战争中爱国者飞弹7.23事故 软件缺陷已经导致很多灾难性后果 保障软件的正确性十分重要 当我们说软件是正确的:程序的行为符合正确性规约(specification)保障正确性的方法1.形式化方法2.软件测试输入域 correctint foo(int a,int b)return a+b;测试是不完备的!输入域 correctFormal Method:(a=0&b=0)|(a=0)|(a=0&b=0
3、&a+b=0)|(a=0&b=0&a+b=0)Testing:foo(0,1)=1;foo(INT_MAX,1)=ERROR;foo(INT_MAX-1,1)=INT_MAX;foo(INT_MAX,INT_MIN)=-1;形式化方法成本很高测试质量直接影响到软件质量 核心问题是:我们如何度量测试的好坏?测试质量达标的系统才有一定的可信度 测试集约减 测试排序 我们朴素的愿望:希望测试能发现真实缺陷 但是在发现之前,真实的缺陷对于我们是未知的“测试可以非常有效地显示bug存在,但却无法证明bug的不存在”我们可以使用一些指标,间接地度量测试质量 测试覆盖 变异测试:用人造缺陷发现率估计真实缺陷
4、发现率变异测试概览程序生成变异体(mutant):变异算子(mutation operator)MutantsMutantsMutants变异体每个变异体是原始程序的小型文法改动变异测试概览程序生成变异体(mutant):变异算子(mutation operator)MutantsMutantsMutants变异体Execute test suiteExecute test suite执行测试测试集被测试集杀死的变异的比例:变异分数(Mutation score)变异测试在软件测试中的发展 变异测试自 1971 年被 DeMillo 和 Hamlet 提出以来,是软件测试中的重要方法 修改位置
5、:从一阶变异(first order)到高阶(higher-order),支持修改多处 在单元测试中:面向高级语言源码:C、Java、Python、JS 面向中间表示:Java bytecode,LLVM-IR 从桌面应用到 Android、MPI、智能合约程序等 从单元测试扩展到其他测试阶段:集成测试 设计阶段(例如在基于模型的软件开发过程中针对设计FSM的变异)从变异测试到变异分析 基于变异的缺陷自动定位(mutation-based fault localization)是变异测试的衍生技术 缺陷自动定位:给定测试集(至少有一个未通过测试)和程序,返回程序中的语句出错可疑度分数。传统定位
6、方法:基于测试覆盖信息对语句排序(spectrum-based fault localization)基于变异的方法:通过观察变异对测试结果的改变计算可疑度 若一个变异使失败测试通过了,那更可能是变异了出错语句从变异测试到变异分析程序自动修复变异测试基于变异的缺陷定位软件产品线测试变异分析工具和标准程序集 变异测试 C 语言:Proteum(108 mutation operators)Milu(Higher-order)WinMut(IR-based)Java 语言:MuJavaMajor By Rene JustJavaLanch(IR-based)By ZellerPITest(Comm