CodeWisdom-技术分享
万万没想到!编译错误竟然还没灭绝???
复旦大学CodeWisdom团队的代码分析和挖掘小组针对开源软件项目持续集成过程中出现的编译错误,进行了大规模的经验研究。该研究分析了常见的编译错误类型、修复代价以及修复模式,研究结果对于开发人员和研究人员具有一定的启示作用。基于该研究的论文“A Large-Scale Empirical Study of Compiler Errors in Continuous Integration”发表在软件工程领域的顶级国际会议FSE 2019上。
论文作者包括复旦大学的张晨、陈碧欢、陈琳琳、彭鑫、赵文耘。
论文链接地址:
https://dl.acm.org/citation.cfm?id=3338917(阅读原文进入论文主页)
有bug了!
每个人都有自己的死穴。对于程序猿来说,这句话绝对在死穴排行榜上名列前茅。看着一份份染着鲜血的bug日志,血压都升高了。
而持续集成(CI)就像是一个故意惩罚程序猿的魔鬼,让bug日志的暴风雨,比往日来的更猛烈了一些。
我们先来看看啥叫CI, CI是一种软件开发实践,它要求开发人员频繁的编译、静态分析、测试和集成变更代码。
相信聪明的你一眼看穿了CI的”本质”,可不就是更多的bug报告嘛!
但是事情往往不像表面看上去那样简单。由于CI频繁的构建代码,使得bug能被尽早发现,反而降低了程序猿负担。瞧!这一个个bug是不是变的可爱起来?
由于可以自动化构建过程,确保软件开发的速度和质量,CI得到了广泛的使用。尽管CI已被广泛使用,但它仍然存在许多问题。比如,CI构建经常失败。
编译错误作为导致构建失败的主要原因之一,我们对其还缺乏了解,例如常见的编译错误类型、修复代价以及修复模式。
因此,在这项研究中,我们爬取了Github上3,799个开源Java项目的Travis CI构建数据,从四个角度:频率、分布、修复代价以及修复模式,对编译错误进行了分析。
总数据量大概三四个TB吧,有需要的联系我们哦~
废话不多说,看看结果吧~
图1展示了编译错误出现的频率。75%的项目的构建出现过编译器错误。在失败的构建中,11%是由编译错误引起的。
嗯,看起来编译错误出现的还挺频繁的。咦?明明IDE会提醒代码中的编译错误,怎么还有这么多?毕竟总有些程序猿喜欢特立独行,偏偏不用IDE嘛!此外,你电脑的运行环境和CI的环境往往有一些差别,这可能导致问题在CI构建时才暴露出来哦!
图1 频率
图2展示了常见的编译错误类型。最常见的错误类型是cant.resolve,占比54%。当编译器无法识别代码中的符号时,会报出此错误。doesnt.exist占比15.9%,该错误发生的原因是因为编译器无法找到代码中引用的包。在所有出现的编译错误中,最常见的10种类型占比90.2%。
所以,聪明的你知道在研究编译错误时,该针对哪些类型了吧。
图2 分布
图3展示了10种最常见编译错误类型的修复时间,从左到右,修复时间由18分钟增长至97分钟。相比expected, doesnt.exist 和cant.resolve等错误, does.not.override.abstract 和method.does.not.override.superclass需要花费两倍以上的修复时间,因为它们的修复往往会涉及方法中逻辑代码的实现。
看起来,程序猿小哥哥和程序媛小姐姐似乎在碰到靠右边的错误类型时,更需要帮助呢~相信你开发的自动debug和修复工具会大大加快他们的工作效率。
图3 修复代价
图4展示了常见编译错误的修复模式,第一列代表错误类型,第二列简要描述了该错误类型,第三列展示了相应的修复模式。我们发现大多数修复模式都很简单,只涉及几行代码的更改,这表明自动修复常见的编译器错误是可行的。但是,每种编译错误都对应多种修复方式,就拿cant.reslove来说吧,它有10种修复模式,这意味着对于每一个该类型的错误,你都有10种手段来解决,那究竟哪种是程序猿真正想要的?想想就让人头大。
图4 修复模式
当前IDE已经提供了一定的编译器错误修复功能。我们测试了两种被广泛使用的IDE, Eclipse和IntelliJ IDEA,来确定它们能否提供我们确定的修复模式作为修复建议,以及在不借助人工帮助的情况下,是否能够自动修复错误,上图中第四至第七栏展示了相关结果。
在48种修复模式中,Eclipse和IntelliJ IDEA分别提供32种和29种修复模式。在提供的模式中,Eclipse和IntelliJ IDEA只支持7种和4种模式的自动修复。从结果可以看出,当前IDE对于编译错误修复提供的支持非常有限。我们总结的修复模式可以用来进一步完善IDE的相关功能。
IDE的自动修复功能实在是要加把劲啊!
CodeWisdom
欢迎关注CodeWisdom,Codewisdom平台由复旦大学软件工程实验室运营,提供智能化软件开发平台及线上沙龙相关资讯,关注可了解更多智能化软件开发的最新消息~