大语言模型时代的变异分析
背景
软件正确性至关重要,软件缺陷可能导致灾难性后果。保障软件正确性的方法包括形式化方法和软件测试,其中测试是不完备的。测试质量直接影响软件质量,变异测试通过人造缺陷发现率估计真实缺陷发现率。
痛点
变异分析面临三大挑战:
- 生成高质量的变异:现有方法生成的变异过于简单或基于有限数据,难以接近真实 Bug。
- 可扩展性低:变异分析的计算复杂度高,难以应用于实际规模程序。
- 等价变异体:等价变异体增加测试成本并影响变异分数计算的精确度。
解决思路
- 面向挑战1:大模型时代的变异生成:利用大模型在代码理解和变换上的能力生成更接近真实 Bug 的变异。
- 面向挑战2:基于共享计算的加速:通过共享冗余计算加速变异分析过程。
具体实现
基于大模型的变异生成
- 模型设置:选用 GPT-3.5-Turbo、GPT-4-Turbo 等模型,通过 API Token 购买或租用服务器。
- 数据集:面向 Java 语言,使用 Defects4J 和 ConDefects 数据集。
- 对比方法:涵盖基于规则、基于学习和基于小规模预训练模型的变异生成方法。
- 评估指标:包括生成代价、可用性、变换多样性、与真实缺陷的语法和行为相似度。
- 实验结果:大模型生成的变异在行为上接近真实 Bug,但仍有提升空间,可通过 prompt-engineering、LLM 微调和多智能体应用改进。
基于共享计算的加速
- 标准变异分析中的冗余计算:存在大量重复执行测试的情况。
- 分支流计算:通过在首次变异处 fork 进程,共享前序计算,减少冗余。
- AccMut:基于等价模态状态(EMS)聚类变异,但存在大量冗余计算。
- WinMut:扩大分析范围至基本块,仅比较可能影响结果的变量,减少进程数量和开销。
- WinMut 实验效果:比 AccMut 加速 5.57 倍,使用更少进程。
- WinMut-Turbo:进一步优化 Fork 后计算,预计加速 30%。
总结和展望
- 基于大模型的变异生成:大模型在生成行为上接近真实 Bug,但需通过 prompt-engineering、LLM 微调和多智能体应用改进。
- 面向大模型的复杂变异加速:当前加速方法有局限性,未来需优化复杂变异分析,进一步提升效率。