周慧聪(1996-), 女, 硕士, 主要研究领域为缺陷定位
郭肇强(1994-), 男, 博士生, 主要研究领域为软件度量, 缺陷定位
梅元清(1980-), 男, 博士生, 副教授, 主要研究领域为软件度量, 缺陷预测
李言辉(1981-), 男, 博士, 助理研究员, CCF专业会员, 主要研究领域为软件演化与维护, 软件测试
陈林(1971-), 男, 博士, 副教授, 博士生导师, CCF高级会员, 主要研究领域为软件分析测试
周毓明(1974-), 男, 博士, 教授, 博士生导师, CCF专业会员, 主要研究领域为软件维护, 测试与分析
周慧聪和郭肇强为共同第一作者
为了降低缺陷定位过程中的人力成本, 研究者们在缺陷报告的基础上提出了许多基于信息检索的缺陷定位模型, 包括使用传统特征和使用深度学习特征进行建模的定位模型. 在评价不同缺陷定位模型时设计的实验中, 现有研究大多忽视了缺陷报告所属的版本与目标源代码的版本之间存在的“版本失配”问题或/和在训练和测试模型时缺陷报告的时间顺序所引发的“数据泄露”问题. 致力于报告现有模型在更加真实的应用场景下的性能表现, 并分析版本失配和数据泄露问题对评估各模型真实性能产生的影响. 选取6个使用传统特征的定位模型(BugLocator、BRTracer、BLUiR、AmaLgam、BLIA、Locus)和1个使用深度学习特征的定位模型(CodeBERT)作为研究对象. 在5个不同实验设置下基于8个开源项目进行系统性的实证分析. 首先, CodeBERT模型直接应用于缺陷定位效果并不理想, 其定位的准确率依赖于目标项目的版本数目和源代码规模. 其次, 版本匹配设置下使用传统特征的定位模型在平均准确率均值(
In order to reduce the labor cost in the process of bug localization, researchers have proposed various automated information retrieval based bug localization models (IRBL), including those models leveraging traditional features and deep learning based features. When evaluating the effectiveness of IRBL models, most of the existing studies neglect the following problems: the software version mismatching between bug reports and the corresponding source code files in the testing data or/and the data leakage caused by the chronological order of bug reports when training and testing their models. This study aims to investigate the performance of existing models in real experiment settings and analyzes the impact of version mismatching and data leakage on the real performance of each model. F irst, six traditional information retrieval-based models (Buglocator, BTRracer, BLUiR, AmaLgam, BLIA, and Locus) and one novel deep learning model (CodeBERT) are selected as the research objects. Then, an empirical analysis is conducted based on eight open-source projects under five different experimental settings. The experimental results demonstrate that the effectiveness of directly applying CodeBERT in bug localization is not as good as expected, since its accuracy depends on the version and source code size of a test project. Second, the results also show that, compared with the traditional version mismatching experimental setting, the traditional information retrieval-based models under the version matching setting can lead to an improviment that is up to 47.2% and 46.0% in terms of
在软件的演化过程中, 软件缺陷的引入不可避免. 这些缺陷的存在会导致软件在工作时触发不可预料的崩溃, 进而引发违背设计预期的行为或者预期功能的丧失, 最终造成一些无法挽回的后果. 为了能及时降低软件缺陷带来的不利影响, 软件维护人员需要在软件产品的更新换代或版本更迭中不断对已经发现的缺陷进行定位和修复来提升软件的质量. 其中, 缺陷定位是进行软件维护的重要步骤, 后续的缺陷修复工作需要在定位到缺陷位置的前提下进行. 同时, 由于项目中的源代码体量通常十分巨大(由成百上千的源文件组成), 手动进行定位需要消耗大量的人力成本[
一种主流的缺陷定位技术即基于信息检索的缺陷定位(information retrieval based bug localization, IRBL)受到研究者的持续关注和研究[
在缺陷定位中所依赖的缺陷报告大多都是由用户撰写并提交的, 因此相较于代码文本, 缺陷报告的内容更偏向于非结构化的自然语言. 近年来, 受到自然语言处理的启发以及深度学习发展的影响, 研究者开始使用深度学习方法去更进一步挖掘缺陷报告中的语义信息代替传统的特征来解决缺陷定位问题[
根据对现有的缺陷定位文献中验证实验的观察, 现有实验在评估IRBL模型时大多存在以下问题, 可能会导致评估结果的失真.
(1) 版本失配问题. 版本失配是指实验中的缺陷报告和其对应的问题代码版本不一致[
(2) 数据泄露问题. 数据泄露是指在实验中评估模型时用到了“未来”的信息[
上述两个问题都会给模型评估带来偏差, 然而在现有的模型评估中忽视了这两个问题[
(1) 针对实验的设置, 整理了清洁的数据集(
(2) 系统地分析对比了6种传统的IRBL模型和CodeBERT模型在不同实验设置下的缺陷定位效果, 分析版本失配与数据泄露两个因素对各模型定位效果的影响.
(3) 本文总结了CodeBERT模型所存在的限制, 针对模型改进提供了建议.
本文第1节介绍缺陷定位的研究背景以及相关的研究工作. 第2节阐述现有研究在进行实验评估中存在的问题. 第3节给出本文的实验设计, 包括实验数据集、实验设置、研究问题以及评估指标. 第4节报告详细的实验结果并回答每个研究问题. 第5节分析该实证研究中存在的效度威胁. 第6节对本文的实验进行总结并对未来的研究点进行展望.
本节首先介绍基于信息检索的缺陷定位的基本知识. 然后分别介绍本文研究的6种使用传统特征的定位模型和最新的基于深度学习框架CodeBERT的定位模型.
信息检索技术被广泛用来构建完成查询任务的模型. 这类模型的工作思路是计算查询语句与目标文档之间的匹配分数来推荐待求的结果. 在缺陷定位领域中, 利用信息检索技术去寻找产生缺陷的代码实体是目前主流的静态缺陷定位模型. 在这类模型中, 缺陷报告被视为查询语句, 源代码文件组成了目标文档库, 其定位过程可以描述如下.
(1) 构建语料库: 首先将每个源代码文件内容进行预处理. 对于某些程序关键词(如int, double)和无意义的停用词(如a和the等)进行移除, 再通过词干分析法将变量名进行单词分割并将单词缩减为词根形式(如isCommitable还原为is和commit). 所有经过处理的词语构成了语料库.
(2) 构建索引: 对所有的源代码文件建立索引. 索引可以帮助模型定位到指定的文件, 并根据文件与查询语句的相似度进行排序.
(3) 构建查询: 在缺陷定位中, 使用缺陷报告来构建查询语句. 通过从缺陷报告中抽取所需要的信息(如标题、描述等), 再使用构建语料库时用到的预处理方法生成最后的查询语句.
(4) 检索和排序: 在基于信息检索缺陷定位模型中, 查询语句会与文档库中的每一个源代码文件都生成一个分数来衡量该文件与查询语句的相关程度. 根据相关程度的得分对所有的文档进行降序排序, 最后反馈给软件维护人员.
维护人员根据模型反馈的排序列表对每个源文件逐个进行审查, 寻找与缺陷相关的文件. 可以看出, IRBL模型如果可以将包含缺陷的源代码文件尽可能地排列在靠前的位置, 维护人员审查代码所需花费的工作量会减少, 整个缺陷定位及修复的进程将被加速.
传统特征指的是研究者通过观察缺陷实例在模型中加入的人工设计的特征, 主要包括版本历史、相似报告、代码结构、堆栈踪迹和文本分段相关的特征. 根据我们前期工作的汇总[
调研的IR-based缺陷定位模型汇总
方法名称 | BugLocator | BRTracer | BLIA | BLUiR | AmaLgam | Locus | |
年份 | 2012 | 2014 | 2017 | 2013 | 2017 | 2016 | |
IR模型 | rVSM | rVSM | rVSM | Indri | Mixed | VSM | |
模型特征 | 版本历史 | - | - | √ | - | √ | √ |
相似报告 | √ | √ | √ | √ | √ | - | |
代码结构 | - | - | √ | √ | √ | √ | |
堆栈踪迹 | - | √ | √ | - | - | - | |
文本分段 | - | √ | √ | - | - | - |
• BugLocator. Zhou等人[
• BRTracer. Wong等人[
• BLUiR. Saha等人[
• AmaLgam. Wang等人[
• BLIA. Youm等人[
• Locus. Wen等人[
这6种使用传统特征的模型被用于本文的实证研究中, 每种模型的默认参数与原文保持一致. 虽然对于IRBL的相关研究[
随着深度学习技术的发展, 近年来研究者们将深度学习技术引入基于信息检索的缺陷定位领域[
• DNNLOC. Lam等人[
• BugTranslator. Xiao等人[
• CNN_Forest. Xiao等人[
以上模型都基于神经网络进行建模. 虽然在他们的原始论文中报告了较好的性能, 我们发现这些模型在实际应用时具有以下3点挑战.
(1) 基于神经网络的模型在搭建时需要设置大量的没有详细说明的参数, 因此这类模型的构建比较复杂.
(2) 几乎所有原始文章中都没有完全将其代码开源, 因此这类模型很难进行复现.
(3) 这类模型的训练具有一定的随机性, 即便是完全相同的设置下, 每次的训练结果也不完全一致.
因为存在这些挑战, 进行模型比较时, 之前的研究者所复现出的基于深度学习的模型在缺陷定位性能上与原始文中的报告的数据有差异[
Feng等人[
CodeBERT模型遵循BERT[
(1) 输入. CodeBERT的输入由自然语言文本、特定的编码语言代码和特殊分隔符组成. 它将自然语言文本和代码语言文本均视作一个词序列. 假设自然语言序列中第
(2) 训练任务. 为了学习文本的语义信息与自然语言和编程语言之间的联系, CodeBERT模型在训练时要实现以下两个训练目标: 屏蔽语言建模(masked language modeling, MLM)和替代标记检测(replaced token detection, RTD).
① 屏蔽语言建模(MLM). 该任务的训练目的是通过未屏蔽的词去预测被屏蔽的词. 首先将NL-PL对构成数据对(
② 替代标记检测(RTD). 该任务是生成替换词来判别是否是原词. 为此, 训练数据为单峰数据(不成对的NL或PL). 由于RTD[
替代标记检测的一个实例
通过在大量代码和自然语言文本上训练屏蔽语言建模(MLM)和替代标记检测(RTD)这两个任务, CodeBERT模型可以更好地理解输入文本的语义信息, 也可以捕捉自然语言和代码语言的联系. 因此, 在该已训练好的预训练模型的基础上, 只需要针对下游任务对预训练模型进行微调, 便可以将CodeBERT应用到各类检索任务中.
使用CodeBERT进行缺陷定位的流程
在测试阶段, 首先, 与训练阶段类似, 将待定位缺陷报告与目标项目中的每一个源代码文件都连接起来, 形成一个二元组句子对<测试报告-源代码文件>输入模型. 然后, 利用CodeBERT模型对句子对进行计算, 并输出一个结果向量[
目前学术界在对基于信息检索的缺陷定位模型进行实验评估的时候, 在实验设置上大多存在两个问题: 其一是版本失配问题, 其二是数据泄露问题. 本节首先介绍传统的实验设置, 然后依次探讨存在的两个问题.
根据缺陷定位模型是否需要训练集, 可以将目前的缺陷定位模型分为无监督模型和有监督模型两类. 在对无监督的定位模型进行评估时, 现有文献[
在对有监督的定位模型进行评估时, 现有文献[
软件项目在更迭过程中会产生许多不同的版本, 不同版本之间的区别很大. 例如, 随着版本的更新, 项目的功能不断地扩充和完善, 其对应的源代码文件数量会越来越庞大(
Number of files for different versions of source code in the project
ROO项目中不同版本源代码的文件数量
现有研究的实验设置中的版本匹配策略
然而, 缺陷报告和代码库中的源文件都是与特定版本的软件相关的. 其中, 缺陷报告是由用户根据特定版本的软件在使用过程中引发的缺陷撰写并提交的. 用户在撰写缺陷报告时, 缺陷报告所对应的版本是用户正在使用的版本. 在大多数情况下, 缺陷报告的目标版本是提交时最新发布的版本[
数据泄露是缺陷定位中另一个十分重要的问题[
Examples of time series of bug reports for different versions in project
MATH项目中不同版本缺陷报告的时间序列样例
在对于需要数据训练的缺陷定位模型, 如基于深度学习的缺陷定位模型, 如果训练数据的时间迟于测试数据, 显然是逻辑错误的. 如果使用这些“未来”的缺陷报告作为训练的数据来构建模型对“过去”的缺陷报告推荐可疑源文件, 那么得出的结论很可能与实际情况不符. 例如, Pendlebury等人[
本节介绍该实证的实验设计, 包括数据集、实验设置、评估指标和研究问题4部分内容.
在2018年, Lee等人[
由于本文的实验需要模拟真实的缺陷定位的环境, 某些项目情况比较特殊(如包含的缺陷报告数目太少), 无法模拟出真实的情况. 因此, 我们需要对该数据集中的项目进行筛选和整理的预处理操作, 从而选择合适的项目进行实验. 以下是我们的预处理步骤.
(1) 过滤掉缺陷报告数目小于100的项目. 报告数目过少会造成评估结果不客观(偏高或者偏低). 例如, 考虑极端的情况, 若某项目仅包含一个缺陷报告, 那么一个定位模型在该项目上的召回率就是1或者0, 均不能准确体现模型的真实性能.
(2) 根据缺陷报告中记录的版本信息对于缺陷报告按版本进行划分, 统计同属一个版本的缺陷报告数量和版本的数量, 并过滤掉在源代码仓库中不对应的版本的缺陷报告.
(3) 对于每一个项目, 去除掉单个版本中报告数目少于10的项目版本. 与(1)同理, 如果该版本中对应的报告数目太少, 该版本上的结果将不够准确, 无法反映真实的定位情况. 同时, 某些项目的版本太多, 使用基于深度学习的方法进行评估时需要耗费大量的工作量, 因此本文中只选取版本数目少于25的项目进行测试.
(4) 根据第3.2节中的实验设置和每个版本的提交时间划分训练集和测试集, 过滤无法提取相应训练集和测试集的版本.
在得到合适的测试的项目和需要进行缺陷定位的版本后, 根据以下步骤实现在同一版本下进行缺陷定位.
① 使用git工具获取项目中所有的tag信息, 获取每个项目版本名以及对应的最新提交时间. 这些时间也是在之后将缺陷报告划分训练集和测试集的基准.
② 将从tag中提取的版本信息与缺陷报告中提取的版本信息进行对照, 过滤在tag中找不到对应版本的缺陷报告, 确保每个缺陷报告都可以找到与它的版本对应的源代码文件.
在筛选出的项目集上针对传统的IRBL方法和基于深度学习的CodeBERT模型设计相关的实验设置, 具体实验设置描述见第3.2节. 对于传统的IRBL方法, 设计两种版本失配和版本匹配的实验对照组来验证版本失配对于该缺陷定位模型的影响. 对于CodeBERT模型设计3种实验设置来分析版本失配和数据泄露两个因素对于定位模型的影响.
本文中选取的项目
项目名称 | 缺陷报告数目 (过滤后) | 源代码文件数量 (最大) | 版本数目 (过滤后) |
注: 与文献[ |
|||
HBase | 477 | 2714 | 18 |
HIVE | 852 | 4651 | 23 |
LANG | 181 | 305 | 9 |
MATH | 217 | 1617 | 9 |
WFCORE | 111 | 3598 | 9 |
BATCH | 279 | 1732 | 14 |
ROO | 615 | 1109 | 19 |
SEC | 293 | 1618 | 19 |
总计 | 3025 | 17344 | 120 |
本节介绍各研究模型的实验设置. 由于本文中要评估的7个基于信息检索缺陷定位模型, 包括6个无监督的使用传统特征的模型和一个有监督的使用深度学习特征的模型(CodeBERT). 因此本文的实验根据模型的特性分为两大类5种具体实验设置.
使用传统特征的无监督模型不需要进行模型的训练, 因此只需要在分版本的情况下对项目进行缺陷定位, 便可以获得在真实情况下(无版本失配问题)各个模型的真实定位性能. 为了同之前研究的实验结果进行对比, 无监督模型在以下两个设置下进行实验.
(1) 版本失配(对照组): 不考虑缺陷报告和源代码文件所包含的版本信息, 所有版本的报告在同一个版本的源代码上进行缺陷定位实验.
(2) 版本匹配(实验组): 根据缺陷报告的版本信息, 在对应版本的源代码上进行缺陷定位, 确保源代码和缺陷报告的版本一致.
基于深度学习的定位模型性能依赖于训练数据, 因此根据第3.1.1节中使用git工具所获取的每个项目版本名以及对应的最新提交时间, 将所有的项目版本根据最新提交时间进行递增排序 (时间早的版本排在前面), 确保用于训练的缺陷报告提交时间早于用于测试的缺陷报告. 基于深度学习的方法(CodeBERT)的评估实验采用以下3种设置划分训练集和测试集.
(1) 邻近版本的实验设置(
新增的CodeBERT定位模型实验设置
(2) 全部版本的实验设置(
(3) 传统的实验设置(对照组): 按照简单的划分测试, 不考虑缺陷报告的时间顺序, 将缺陷报告随机进行划分, 将90%的缺陷报告用于训练, 10%的缺陷报告用于测试, 实验重复进行10次.
在确定了训练集和测试集后, 将每一个缺陷报告的版本信息进行记录. 当使用缺陷报告进行模型训练和测试时, 使用git工具将项目源代码回滚到与缺陷定位一致的版本上. 在缺陷报告与源代码文件版本相同的情况下, 对模型进行训练和测试.
为了公平地比较传统的IRBL模型和CodeBERT模型, Code BERT实验中的第(1)、(2)种设置被设定为版本匹配的情况(即缺陷报告与源代码文件版本一致); 第(3)种设置被设定为版本失配情况(即所有的测试都在同一版本下进行, 缺陷报告与源代码文件版本不一定相同). 在这种设置下, 将传统的IRBL定位模型与CodeBERT定位模型进行对比.
当评估IRBL技术时, 普遍采取将实验结果与ground truth (真实值)比较进行评估. ground truth数据包括开发人员已经修复的bug报告和相关的源代码文件(为修复bug而修改的文件). 在数据集上应用IRBL技术, 并将输出结果与该数据集的ground truth进行比较. 在以往的研究中[
(1) 平均准确率均值
其中,
(2) 首位倒排均值
其中,
为了研究IRBL模型在真实缺陷定位的情景下所表现出来缺陷定位性能, 本文设计了以下3个研究问题.
(1) RQ1: 与传统的IRBL模型相比, CodeBERT缺陷定位的效果如何?
该研究问题的目的是验证CodeBERT模型在缺陷定位方面的效果. 目前基于信息检索的缺陷定位模型较为成熟和主流, 与通过与使用传统特征的IRBL模型对比, 可以直观地体现出CodeBERT模型被应用于缺陷定位任务时表现出的性能. 该研究问题的对比实验分为3部分: ① 版本失配设置下定位效果的对比; ② 版本匹配设置下定位效果的对比和③ 版本匹配下设置下模型消耗时间的对比. 根据实验设置(第3.2节)中的描述, 版本失配对照实验中传统IRBL模型和CodeBERT模型分别采用第3.2.1节(1)和第3.2.2节(3)的设置. 版本匹配对照实验则采用第3.2.1节(2)设置下的传统IRBL模型与在第3.2.2节(1)和第3.2.2节(2)设置下的CodeBERT模型进行对比.
通过上述对比实验, 可以全面地展现CodeBERT模型在进行缺陷定位的效果, 它所存在的局限性以及需要改进的方向. 这些不仅有助于CodeBERT模型进一步优化, 也能够给类似的基于深度学习的缺陷定位模型提供新的思路.
(2) RQ2: 版本失配与数据泄漏是否会影响CodeBERT模型和传统IRBL模型的结果?
该研究问题的目的是调查在缺陷定位任务中, 版本失配与数据泄露两个问题分别对使用传统特征的IRBL模型和CodeBERT模型结果产生的影响. 该研究问题中分别对使用传统特征的IRBL模型和CodeBERT模型进行实验.
• 使用传统特征的IRBL模型. 由于这类模型属于无监督学习模型, 不存在数据泄露的情况, 因此只要考虑版本失配对于模型结果的影响. 该部分实验分为版本失配和版本匹配(见第3.1.1节), 版本失配不需要考虑缺陷报告与定位的源代码版本是否一致, 所有的缺陷报告在同一版本的源代码上进行定位; 版本匹配则是分版本进行缺陷定位实验. 后者比前者更贴近真实的定位情况.
• 对于CodeBERT模型. 对该模型要考虑到数据泄露和版本失配所引起的双重影响. 设置3种实验设置进行对比(第3.2.2节).
该部分的实验结果可以说明越贴近真实情况时模型性能可能会发生的变化. 这也反映了在以往模型评估中实验设置一些细节上的缺陷和不足, 有助于在今后验证实验时的进行完善.
(3) RQ3: 不同参数设置对CodeBERT模型有怎样影响?
该研究问题的目的是寻找对于CodeBERT模型在缺陷定位方面较优的参数设置. 对于基于深度学习的方法, 参数的设置会对实验结果造成很大的影响. 在本文中, CodeBERT模型中的大部分参数采用原论文中[
文本分割值指的是输入句子对中缺陷报告和源代码文件所占的字节数. CodeBERT的输入长度仅是固定的512个字节, 如何将字节数目合理地分配给缺陷报告和源代码文件, 从而可以达到较优的效果是一个值得推敲的问题. 正样本和负样本的输入比例指的是训练模型所用到的正负样本数目之间的一个比例关系. 众所周知, 缺陷一般是由项目中极少部分源代码引起的, 因此缺陷报告只与少部分源代码文件相关, 与绝大部分源代码文件不相关. 这样的现象造成了训练数据正样本和负样本的极度不平衡, 会影响模型的训练和拟合. 虽然CodeBERT模型中本身包含对于不平衡数据的处理, 但是用于训练的正负样本的数量比例需要针对实际项目情况进行调整, 才能有较好的效果.
该部分的实验结果通过对比不同参数设置, 可探索CodeBERT模型在缺陷定位任务上的最佳性能参数范围. 此外, 这些实验参数也能够为后续研究者应用CodeBERT模型进行缺陷定位提供帮助.
本节依次详述第3.4节中提出的每个研究问题对应的实验结果并进行总结.
版本失配下的排序性能对比:
评估指标 | 定位模型 | HBase | HIVE | LANG | MATH | WFCORE | BATCH | ROO | SEC | 平均值 |
BugLocator | 0.404 | 0.344 | 0.599 | 0.364 | 0.428 | 0.484 | 0.429 | 0.426 | 0.435 | |
BRTracer | 0.489 | 0.618 | 0.373 | 0.504 | 0.455 | 0.440 | 0.469 | |||
BLUiR | 0.401 | 0.340 | 0.560 | 0.353 | 0.341 | 0.396 | 0.386 | 0.380 | 0.395 | |
AmaLgam | 0.360 | 0.315 | 0.383 | 0.271 | 0.271 | 0.348 | 0.346 | 0.334 | 0.329 | |
BLIA | 0.378 | 0.363 | 0.383 | |||||||
Locus | 0.619 | 0.377 | 0.446 | 0.475 | 0.412 | 0.562 | 0.483 | |||
CodeBERT | 0.002 | 0.001 | 0.706 | 0.032 | 0.009 | 0.032 | 0.134 | 0.040 | 0.120 | |
BugLocator | 0.302 | 0.255 | 0.506 | 0.281 | 0.314 | 0.342 | 0.349 | 0.336 | 0.336 | |
BRTracer | 0.359 | 0.301 | 0.520 | 0.284 | 0.334 | 0.355 | 0.368 | 0.351 | 0.359 | |
BLUiR | 0.298 | 0.248 | 0.522 | 0.296 | 0.255 | 0.299 | 0.313 | 0.325 | 0.320 | |
AmaLgam | 0.267 | 0.231 | 0.357 | 0.228 | 0.203 | 0.263 | 0.281 | 0.286 | 0.265 | |
BLIA | 0.290 | 0.280 | 0.293 | 0.437 | ||||||
Locus | 0.585 | 0.319 | 0.347 | 0.538 | 0.417 | |||||
CodeBERT | 0.002 | 0.001 | 0.600 | 0.023 | 0.005 | 0.015 | 0.077 | 0.031 | 0.094 |
首先对使用传统特征的IRBL模型的定位效果进行分析. 可以看出, 在版本失配实验设置下, 两种较新提出的IRBL定位模型: BLIA (2017年)和Locus (2016年)的缺陷定位效果较优. 平均来说, BLIA模型的
相比于传统的IRBL模型, CodeBERT模型的缺陷定位效果很差. 传统IRBL定位模型的
版本匹配下的排序性能对比:
观察传统IRBL模型和CodeBERT模型的性能分布可以看出, 前6个箱线图明显高于后2个箱线图, 这说明在版本匹配的设置下, 传统的IRBL方法定位效果依旧明显优于CodeBERT模型. 在111个测试项目版本(除LANG项目所有版本)中, CodeBERT模型
此外, 本文以项目BATCH为例, 比较IRBL方法在版本匹配下所消耗的时间和CodeBERT模型在第3.2.2节中第3种实验设置下所消耗的时间. 在8个测试项目中, BATCH项目最大源文件数目为1732, 拥有14个版本, 属于规模大小中等的项目, 因此选取该项目对比较为合适.
版本匹配下各模型在项目BATCH上消耗时间对比 (s)
版本 | BugLocator | BRTracer | BLUiR | AmaLgam | BLIA | Locus | CodeBERT(3) |
1.0.0-m3 | 5.4 | 6.8 | 13.8 | 21.3 | 6.8 | - | |
1.0.0.m4 | 5.0 | 2.8 | 30.4 | 22.5 | 4.5 | 7880 | |
1.0.0.m5 | 3.2 | 5.3 | 9.5 | 18.6 | 6.5 | 6349 | |
1.0.0.rc1 | 3.9 | 5.1 | 11.8 | 20.3 | 9.1 | 6283 | |
1.0.0.FINAL | 5.3 | 5.8 | 12.7 | 18.1 | 6.5 | 6789 | |
1.1.0.RELEASE | 3.6 | 4.2 | 11.2 | 17.9 | 6.0 | 6493 | |
2.0.0.M3 | 7.6 | 7.9 | 18.7 | 24.2 | 13.4 | 4200 | |
1.0.1.RELEASE | 2.8 | 4.5 | 11.7 | 20.0 | 8.7 | 4096 | |
2.0.0.RC1 | 12.9 | 11.8 | 22.8 | 27.1 | 11.9 | 6603 | |
2.0.0.RELEASE | 6.0 | 8.6 | 27.5 | 22.3 | 16.4 | 6015 | |
2.1.0.RELEASE | 7.2 | 8.6 | 17.6 | 21.4 | 15.8 | 4830 | |
2.1.1.RELEASE | 4.5 | 6.3 | 17.6 | 26.8 | 9.5 | 4220 | |
2.1.7.RELEASE | 4.8 | 6.5 | 21.3 | 21.5 | 11.3 | 3969 | |
2.1.8.RELEASE | 4.6 | 6.0 | 40.8 | 23.6 | 11.1 | 3448 | |
平均值 | 5.5 | 6.4 | 19.1 | 21.8 | 9.8 | 5475 |
以上结果表明: 在大多数的测试项目中CodeBERT的效果完全比不上传统的IRBL模型. CodeBERT模型需要大量的计算资源和时间, 并且在源代码文件数量较大(文件数量超过1000)的项目上几乎没有定位效果, 只有对于源代码文件数目较少的测试项目集上(如LANG), CodeBERT才会具有一定的定位效果. CodeBERT的定位效果在不同规模的测试项目上差异较大, 而传统的IRBL模型在不同规模的测试项目上表现较为稳定.
版本失配设置与版本匹配设置下传统IRBL模型的排序性能对比:
评价指标 | 定位模型 | HBase | HIVE | LANG | MATH | WFCORE | BATCH | ROO | SEC | 平均值 |
BugLocator | 0.457↑ | 0.410↑ | 0.739↑ | 0.581↑ | 0.420↓ | 0.534↑ | 0.514↑ | 0.557↑ | 0.527↑ | |
BRTracer | 0.520↑ | 0.739↑ | 0.637↑ | 0.610↑ | ||||||
BLUiR | 0.463↑ | 0.439↑ | 0.684↑ | 0.620↑ | 0.348↑ | 0.551↑ | 0.498↑ | 0.532↑ | 0.517↑ | |
AmaLgam | 0.463↑ | 0.439↑ | 0.698↑ | 0.620↑ | 0.348↑ | 0.273↓ | 0.498↑ | 0.534↑ | 0.484↑ | |
BLIA | 0.315↓ | 0.346↓ | 0.380↓ | 0.496↓ | 0.494↓ | 0.534↓ | ||||
Locus | 0.471↑ | 0.796↑ | 0.641↑ | 0.437↓ | 0.449↓ | 0.406↓ | 0.602↑ | 0.543↑ | ||
BugLocator | 0.350↑ | 0.298↑ | 0.624↑ | 0.438↑ | 0.312↓ | 0.350↑ | 0.437↑ | 0.414↑ | 0.403↑ | |
BRTracer | 0.388↑ | 0.629↑ | 0.456↑ | 0.320↓ | 0.359↑ | 0.450↑ | ||||
BLUiR | 0.347↑ | 0.323↑ | 0.635↑ | 0.511↑ | 0.272↑ | 0.424↑ | 0.439↑ | 0.421↑ | ||
AmaLgam | 0.347↑ | 0.324↑ | 0.575↑ | 0.510↑ | 0.272↑ | 0.202↓ | 0.425↑ | 0.441↑ | 0.387↑ | |
BLIA | 0.238↓ | 0.265↓ | 0.678↓ | 0.300↑ | 0.378↓ | 0.438↓ | 0.425↓ | |||
Locus | 0.338↑ | 0.379↑ | 0.294↓ | 0.348↑ | 0.429↓ | 0.408↓ |
文献[
版本失配与版本匹配下CodeBERT的排序性能对比:
评价指标 | 定位模型 | HBase | HIVE | LANG | MATH | WFCORE | BATCH | ROO | SEC | 平均值 |
CodeBERT(1) | - | 0.207↓ | ||||||||
CodeBERT(2) | 0.019↑ | - | 0.077↑ | 0.018↑ | 0.123↑ | 0.125↑ | 0.115↑ | 0.111↓ | ||
CodeBERT(1) | - | 0.175↓ | ||||||||
CodeBERT(2) | 0.010↑ | - | 0.048↑ | 0.013↑ | 0.074↑ | 0.079↑ | 0.081↑ | 0.078↓ |
此外, Zhang等人[
根据实验对比得出以下结论.
(1)对于传统的IRBL模型, 虽然版本与版本之间的定位效果相差较大, 但整体而言, 版本匹配的实验设置模型下的结果比版本失配的实验设置下的模型结果要好. 版本失配会拉低定位模型的整体效果. 版本匹配的实验设置比版本失配的实验设置更贴近真实的情况. 因此, 传统的缺陷定位模型(如BugLocator, BRTracer等)的真实定位性能其实是被低估了.
(2)对于CodeBERT模型, 可以发现在对于部分评估指标较低的测试项目, 第1种实验设置(邻近版本的测试)下实验结果是3种实验设置下效果最优的. 对于相对评估指标较高的测试项目, 第3种实验设置(传统的测试)下的效果最好.
多种参数组合在LANG项目上的性能
根据实验结果, 在参数组合为(50, 1)下, 模型在项目LANG上定位效果最差,
实验结果表明: 对于每一组缺陷报告和源代码文件的输入对, 512个字节中25个字节分配给缺陷报告文本, 剩下的字节分配给源代码文本. 在训练模型时输入的负文本数量和正文本数量比例为3:1时, 模型的拟合和测试效果是最优的.
本节主要讨论先前的相关研究工作[
Lee等人[
(1) 实验项目选取不当. 文献[
(2) 研究对象类型单一. 文献[
Tu等人[
(1) 调研由时间顺序紊乱引发的数据泄露. 在实践中, 在一个用户提交缺陷报告给缺陷追踪数据库后, 开源项目管理人员审核缺陷报告, 之后分配给开发者解决. 在开发者拿到缺陷报告后, 此时才进行缺陷定位. 由上述描述可见, 缺陷定位是针对开发者而不是常规意义下的用户的. 在开发者拿到缺陷报告之前, 用户或者开源项目管理人员是可以对缺陷报告的相关字段进行修改的. 因此, 在我们研究中, “数据泄露”指在缺陷定位实际发生的时间点使用了该时间点之后的数据来训练神经信息检索模型, 即在训练时间点使用了还没有出现的缺陷报告进行模型的训练.
(2) 使用更多的数据集进行分析. 文献[
本节主要对实验过程中可能影响实验结论有效性的威胁因素进行分析, 包括构建效度、内部效度和外部效度3个方面.
构建效度是指实验中涉及的独立变量和依赖变量的获取过程的有效性. 本文中独立变量是指缺陷报告和代码文件, 依赖变量是指缺陷报告与对应缺陷代码之间的链接关系, 也就是实验中用到的数据集. 该数据集收集于Apache2、Spring3和JBoss4的软件社区, 这些项目是由Lee等人[
为了确保使用符合真实场景的数据集, 我们对原始数据集进行了筛选和划分. 在版本匹配的实验设置中, 根据缺陷报告所获取的版本信息, 通过git将源代码回滚到相应的版本. 有些缺陷报告的版本无法找到相对应的源代码版本. 因此, 为了尽可能确保每个版本都能获得相对应的源代码版本, 人工对每一个缺陷报告的版本进行检查, 过滤其中一些实在无法找到对应源代码文件的版本. 由于实验设置对于实验数据的限制, 可能会导致最后实验结果的差异.
在CodeBERT模型的实验设置中, 还要通过版本和时间划分训练集和测试集. 这里所选的时间是通过git获取tag标签的提交时间作为基准, 这导致了可能测试集和训练集划分得不合理性(例如训练集数据过少等情况). 虽然本文尽力保证实验设置得客观性, 然而受到数据集的限制, 不能保证每一种模型都完全达到完全理想的定位效果.
关于版本匹配问题, 本文中涉及两方面因素无法避免. 一方面, 在用户提交缺陷报告过程中, 可能会存在缺陷报告版本信息缺失的情况. 某些缺陷报告的版本信息是后期开发人员进行完善的[
内部效度是指在实验中存在会对结果准确性产生影响的因素. 本实验中的影响因素主要指各个模型的实现准确性. 本文对6种使用传统特征IRBL模型和一个基于CodeBERT预训练模型的定位模型进行实证研究. 因为使用传统特征的IRBL模型的代码已经被其原作者开源, 所以这6种模型的实现应该是可靠的. 本文中它们对应的实验结果与其他研究者的结果数据虽略有差异, 但总体结论基本一致, 其结果能够反映每个模型的真实性能表现.
对于使用深度学习的CodeBERT模型来说, 原作者提供了模型的API接口[
外部效度是指本文的实验结论是否可以推广到其他的定位模型和项目. 本文中用到的实验项目完全来自开放软件社区中的8个开源的Java项目. 这些项目的开发过程都比较规范, 而且对于开发过程以及其过程中的缺陷都有较为详细的信息记录. 因此, 本文的结论有一定的代表性. 然而, 对于IRBL的方法来说, 每种定位模型都有各自的偏好和优势, 所以在本文中得出的结论也许不一定完全适用于其他所有的项目. 比如CodeBERT模型对于不同的项目, 定位效果差异比较大. 因此对于CodeBERT模型是否可以应用于缺陷定位任务, 还需要更多的实验数据来进行验证.
CodeBERT模型并不是完全为解决缺陷定位问题而设计的, 在其性能上比不上其他基于深度学习的缺陷定位模型, 如2016年提出的NPCNN[
如何通过缺陷报告来定位项目中的缺陷一直是一个热门问题. 为了能够使用更自动化的方法帮助软件开发者能快速定位缺陷, 研究者提出了许多模型. 然而对于各种IRBL模型的评估却在实验设置上存在问题, 影响最后模型评估的客观性. 本文通过不同的实验设置, 在模拟真实的环境下, 评估6种传统的IRBL缺陷定位模型(BugLocator、BRTracer、BLUiR、AmaLgam、BLIA、Locus)和深度学习模型CodeBERT在8个测试项目上的缺陷定位效果. 根据实验结果, 得出以下结论.
(1) 对传统的非深度学习的定位模型而言, 其真实的定位性能被低估.
(2) CodeBERT模型之间用于缺陷定位效果受到测试数据集的限制, 版本数目越多, 源代码数目越大的项目, 缺陷定位效果越差.
(3) CodeBERT模型的缺陷定位效果会受到版本失配和数据泄露两方面的双重影响. 在定位情况较好的项目中, 数据泄露会导致定位效果过于乐观. 同时, 在定位情况不理想的项目中, 版本匹配的设置可以更好捕捉缺陷报告和源代码之间的联系, 使定位效果优于简单的划分验证的设置.
在未来研究中, 我们将会进行以下两个方面的工作.
(1) 本文的实验结果验证了在实验中版本失配和数据泄露问题会对基于信息检索的缺陷定位模型的评估产生影响. 然而, 这两个因素是否会对其他类型的缺陷定位模型产生影响需要进一步的验证. 因此, 在未来工作中我们想要分析其他定位模型是否会因为版本失配和数据泄露而导致定位结果不准确.
(2) 本文是对于CodeBERT模型在缺陷定位问题上的初步尝试, 因此存在较大的提升空间. 首先, 在特征提取方面, 输入长度的限制导致特征提取的不完善, 以此影响模型的后续性能. 在后续工作中, 我们考虑在CodeBERT模型前加入一个新的神经网络(如LSTM)用于提取特征. 另外, CodeBERT模型对于源代码数目较多的大型项目效果较差, 且消耗时间巨大. 如何用更有效率的方法提高大规模项目的训练结果也是我们的一个未来研究目标.
致谢 感谢期刊编辑以及匿名审稿专家提出的宝贵意见.
Youm KC, Ahn J, Lee E. Improved bug localization based on code change histories and bug reports. Information and Software Technology, 2017, 82: 177−192. [doi: 10.1016/j.infsof.2016.11.002]
http://www.jos.org.cn/1000-9825/6087.htm]]>
http://www.jos.org.cn/1000-9825/6087.htm]]>
http://www.jos.org.cn/1000-9825/6081.htm]]>
http://www.jos.org.cn/1000-9825/6081.htm]]>
http://www.jos.org.cn/1000-9825/6130.htm]]>
http://www.jos.org.cn/1000-9825/6130.htm]]>
Chaparro O, Florez JM, Marcus A. Using bug descriptions to reformulate queries during text-retrieval-based bug localization. Empirical Software Engineering, 2019, 24(5): 2947-3007.
Xiao Y, Keung J, Bennin KE, Mi Q. Machine translation-based bug localization technique for bridging lexical gap. Information and Software Technology, 2018, 99: 58−61. [doi: 10.1016/j.infsof.2018.03.003]
Xiao Y, Keung J, Bennin KE, Mi Q. Improving bug localization with word embedding and enhanced convolutional neural networks. Information and Software Technology, 2019, 105: 17−29. [doi: 10.1016/j.infsof.2018.08.002]
http://www.jos.org.cn/1000-9825/5727.htm]]>
http://www.jos.org.cn/1000-9825/5727.htm]]>
Mitra B, Craswell N. An introduction to neural information retrieval. Foundations and Trends® in Information Retrieval, 2018, 13(1): 1−126. [doi: 10.1561/1500000061]
Kaufman S, Rosset S, Perlich C, Stitelman O. Leakage in data mining: Formulation, detection, and avoidance. ACM Transactions on Knowledge Discovery from Data, 2012, 6(4): 15. [doi: 10.1145/2382577.2382579]
https://machinelearningmastery.com/data-leakage-machine-learning/]]>
https://en.wikipedia.org/wiki/Leakage_(machine_learning)]]>
Huo X, Li M, Zhou ZH. Control flow graph embedding based on multi-instance decomposition for bug localization. Proceedings of the AAAI Conference on Artificial Intelligence, 2020, 34(4): 4223−4230. [doi: 10.1609/aaai.v34i04.5844]