ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???

e2755372be8ddd9a0f7c56f2afe991dc.png

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日志,血压都升高了。

582329537ac671e242e95ba6233d8f4f.gif582329537ac671e242e95ba6233d8f4f.gifb80ff6936e67deea2fb9ad9d920f644a.png582329537ac671e242e95ba6233d8f4f.gif582329537ac671e242e95ba6233d8f4f.gif

而持续集成(CI)就像是一个故意惩罚程序猿的魔鬼,让bug日志的暴风雨,比往日来的更猛烈了一些。

我们先来看看啥叫CI, CI是一种软件开发实践,它要求开发人员频繁的编译、静态分析、测试和集成变更代码。

相信聪明的你一眼看穿了CI的”本质”,可不就是更多的bug报告嘛!

但是事情往往不像表面看上去那样简单。由于CI频繁的构建代码,使得bug能被尽早发现,反而降低了程序猿负担。瞧!这一个个bug是不是变的可爱起来?

由于可以自动化构建过程,确保软件开发的速度和质量,CI得到了广泛的使用。尽管CI已被广泛使用,但它仍然存在许多问题。比如,CI构建经常失败。

编译错误作为导致构建失败的主要原因之一,我们对其还缺乏了解,例如常见的编译错误类型、修复代价以及修复模式。

f8ac166d8ff74bca37fd9db43585de70.png

因此,在这项研究中,我们爬取了Github上3,799个开源Java项目的Travis CI构建数据,从四个角度:频率、分布、修复代价以及修复模式,对编译错误进行了分析。

a699c7cee4febba8be17f4af6c07e424.gif

总数据量大概三四个TB吧,有需要的联系我们哦~

ea77b6fe622458e8be0a1b3a2bfd4d77.png

废话不多说,看看结果吧~

图1展示了编译错误出现的频率。75%的项目的构建出现过编译器错误。在失败的构建中,11%是由编译错误引起的。

嗯,看起来编译错误出现的还挺频繁的。咦?明明IDE会提醒代码中的编译错误,怎么还有这么多?毕竟总有些程序猿喜欢特立独行,偏偏不用IDE嘛!此外,你电脑的运行环境和CI的环境往往有一些差别,这可能导致问题在CI构建时才暴露出来哦!

2a4001fbab3ed4b0d759e9831e39e2a5.png

图1 频率

图2展示了常见的编译错误类型。最常见的错误类型是cant.resolve,占比54%。当编译器无法识别代码中的符号时,会报出此错误。doesnt.exist占比15.9%,该错误发生的原因是因为编译器无法找到代码中引用的包。在所有出现的编译错误中,最常见的10种类型占比90.2%。

所以,聪明的你知道在研究编译错误时,该针对哪些类型了吧。

1052e1e199983ad6dd0f7fc29d31cf2f.png

图2 分布

图3展示了10种最常见编译错误类型的修复时间,从左到右,修复时间由18分钟增长至97分钟。相比expected, doesnt.exist 和cant.resolve等错误, does.not.override.abstract 和method.does.not.override.superclass需要花费两倍以上的修复时间,因为它们的修复往往会涉及方法中逻辑代码的实现。

看起来,程序猿小哥哥和程序媛小姐姐似乎在碰到靠右边的错误类型时,更需要帮助呢~相信你开发的自动debug和修复工具会大大加快他们的工作效率。

5b4094b33d9312925fc3399295c2537b.png

图3 修复代价

图4展示了常见编译错误的修复模式,第一列代表错误类型,第二列简要描述了该错误类型,第三列展示了相应的修复模式。我们发现大多数修复模式都很简单,只涉及几行代码的更改,这表明自动修复常见的编译器错误是可行的。但是,每种编译错误都对应多种修复方式,就拿cant.reslove来说吧,它有10种修复模式,这意味着对于每一个该类型的错误,你都有10种手段来解决,那究竟哪种是程序猿真正想要的?想想就让人头大。

92dbb8d6d9a78e1752cee94c6d6b1a64.png

图4 修复模式

当前IDE已经提供了一定的编译器错误修复功能。我们测试了两种被广泛使用的IDE, Eclipse和IntelliJ IDEA,来确定它们能否提供我们确定的修复模式作为修复建议,以及在不借助人工帮助的情况下,是否能够自动修复错误,上图中第四至第七栏展示了相关结果。

在48种修复模式中,Eclipse和IntelliJ IDEA分别提供32种和29种修复模式。在提供的模式中,Eclipse和IntelliJ IDEA只支持7种和4种模式的自动修复。从结果可以看出,当前IDE对于编译错误修复提供的支持非常有限。我们总结的修复模式可以用来进一步完善IDE的相关功能。

IDE的自动修复功能实在是要加把劲啊!

5e737aba1774e8372df5155f85f78e70.png

CodeWisdom

93d238254dc471026d0329507f12364c.pngfc5797987de6d0b2a94de7c59e076c0b.png

欢迎关注CodeWisdom,Codewisdom平台由复旦大学软件工程实验室运营,提供智能化软件开发平台及线上沙龙相关资讯,关注可了解更多智能化软件开发的最新消息~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昆仑通态触摸屏数据转发上传_嵌_ModbusTcpIp数据转发 昆仑通态屏与屏之间通讯 - 下载 - 搜珍网...

嵌_ModbusTcpIp数据转发/通_通/发送方.MCG嵌_ModbusTcpIp数据转发/通_通/接收方.MCG嵌_ModbusTcpIp数据转发/通_通/驱动路径说明.txt嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModbusTCPIPSlave.chm嵌_ModbusTcpIp数据转发/通_通/ModBusTcp数据转发设备/ModBusTCPIP…

直接用自己服务器做图床可以吗_图床有什么用,图片放自己的服务器上不可以吗?...

什么是图床服务器:图床就是图片在线存储服务器,主要是用来节省流量的,一些可以把图片存放到网上并且引用到其他网站使用的服务,就像以前的网络相册。一般用图床的,都是图片之类的静态文件非常多,把图片存储…

高职信息安全比赛攻防思路_高职信息安全技术应用技能竞赛.doc

高职信息安全技术应用技能竞赛.doc高职信息安全技术应用技能竞赛规程、评分标准及选手须知一、竞赛规程调整说明2011湖南省职业院校技能竞赛高职信息安全技术应用(以下简称“省赛”)竞赛规程,原则上采用“2011年全国职业院校技能大赛”高职信息安全技术应用(以下简称…

华宝小t股票机器人_华宝小T股票机器人

我试过两个品种,签约后会在管理介面标注算法对你持仓品种的效果(下挂多户时只支持添加默认主账户的持仓,且只限股票),我试了两个标注为优秀的,一个益生股份,一个宏辉果蔬。单个品种下限大概是6万左右,会提示…

catia直线测距怎么调出来_CATIA怎么测量两线夹角.

在几何学中,角是由两条有公共端点的射线组成的图形。这两条射线叫做角的边,它们的公共端点叫做角的顶点。一般的角会假设在欧几里得平面上,但在欧几里得几何中也可以定义角。角在几何学和三角学中有着广泛的应用。它是轴对称图形,…

深入剖析 linux GCC 4.4 的 STL string

转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Write技术。 平台:x86_64-redhat-linuxgcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)…

java scanner以回车结束_请问Scanner在输入回车后,如何才能退出?

package com.imooc;import java.util.Scanner;/*kernal* 功能描述:* 为指定成绩加分,直到分数大于等于 60 为止,* 输出加分前和加分后的成绩,并统计加分的次数.*/public class addScore {public static void main(String[] args) {System.out…

HTML列表标记符有哪些,在HTML中,表格标记符为( )

3. (2017高一上东台月考) 阅读下面一段资料,判断在给出的几种说法中不正确的是( )资料:IP电话与传统电话IP电话是按国际互联网协议规定的网络技术内容开通的电话业务,中文翻译为网络电话或互联网电话,它是利用国际互联网Inetrne…

Linq 实现左连接,右连接

左连接: var LeftJoin from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals dept.ID into JoinedEmpDept from dept in JoinedEmpDept.DefaultIfEmpty() select new { EmployeeName emp.Name, DepartmentName dept ! null ? de…

python怎样执行curl命令_python curl命令

今天下午来到,运行了curl -i url:port ,然后返回的信息,用json.loads()解析,出报一下错误:Traceback (most recent call last):File "test1.py", line 12, in decodejson json.loads(str1)File "/usr/…

用计算机心如止水,计算机网络数据链路层

1、数据链路层使用的信道类型:点对点信道(1对1)广播信道(1对多),如:集线器、交换机2、链路与数据链路:链路:点对点的物理线路段,中间无任何其他交换结点数据链路:通信协议 软件 硬件(一般用适…

Java中Integer类的方法

java.lang 类 Integerjava.lang.Objectjava.lang.Numberjava.lang.Integer全部已实现的接口&#xff1a; Serializable, Comparable<Integer> public final class Integerextends Numberimplements Comparable<Integer>Integer 类在对象中包装了一个基本类型 int 的…

openfeign ribbon 负载_SpringCloud教程(三)声明式访问Feign、负载均衡Ribbon

0-前言eureka实际上已经集成了负载均衡调度框架Ribbon&#xff1b;我们有了各个微服务了&#xff0c;那怎么来调用他们呢&#xff0c;一种方法是可以使用 RestTemplate(如&#xff1a;String str restTemplate.getForObject(“http://localhost:8763/user/hello”,String.class…

HTML5的little,HTML 5

The following example, the top ten movies are listed (in reverseorder). Note the way the list is given a title by using aThe top 10 movies of all timeJosie and the Pussycats, 2001Црна мачка, бели мачор, 1998A Bugs Life, 1998Toy Story, 199…

MYC编译器源码分析之程序入口

前文.NET框架源码解读之MYC编译器讲了MyC编译器的架构&#xff0c;整个编译器是用C#语言写的&#xff0c;上图列出了MyC编译器编译一个C源文件的过程&#xff0c;编译主路径如下&#xff1a; 首先是入口Main函数用来解析命令行参数&#xff0c;读取源文件&#xff0c;并开始编译…

easyui tree动态加载_动态路由:Gin vs SpringMVC

这两天在接触Gin&#xff0c;对它的动态路由功能比较感兴趣&#xff0c;特意做了笔记&#xff0c;顺便跟SpringMVC作下对比。1.简介Gin是使用Go/golang语言实现的HTTP Web框架。接口简洁,性能极高。截止1.4.0版本,包含测试代码,仅14K,其中测试代码9K左右,也就是说框架源码仅5K左…

伍德里奇---计量经济学第6章部分计算机习题详解(stata),伍德里奇---计量经济学第6章部分计算机习题详解(STATA)...

所以&#xff0c;log bwg t7.5840.0180npvis?0.00041npvis20.0254mage?0.00041mage20.1370.00370.000120.0093 (0.00015)n1764&#xff0c;R20.0256&#xff0c;R20.0234。当孩子的出生体重最大时&#xff0c;对应的年龄为mage? β12β20.0254[2?0.00041] 30.96&#xff0c…

经验原石_哔哩哔哩(b站)手机版经验原石怎么样获得?在哪里使用?有期限吗?...

大家都知道原石是一种道具&#xff0c;但是怎么用&#xff0c;有什么用大家却不太清楚接下来我就给大家介绍一下原石有什么用。那就是原石是可以用来增我们加头衔经验的&#xff0c;大家都知道头衔有两种&#xff0c;一种是可以升级的&#xff0c;一种是不可以升级的。我们的这…

vue菜单点击html,基于vue.js实现侧边菜单栏

侧边菜单栏应该是很多项目里必不可少的 自己手写了一个下面是效果图下面就说一下实现的过程 还是比较简单的首先导入一下需要的文件接下来就是我的html主页系统用户管理权限设置操作日志设备运行日志防区 防区管理警报 历史报警曲线报表统计警情处理设备然后是css* {margin: 0;…

centos7 mysql启动失败_Mysql主从复制

​好在&#xff0c;别人如何分析我&#xff0c;跟我本身是一点关系也没有的。(by 三毛)主从复制的常见用途1.数据备份对备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能取代备份2.负载均衡(读写分离)通过MySQL主从复制,可以把写操作放在主库(master)&#xff0c…