✓Artifact evaluated by FSE
Discovering Bug Patterns in JavaScript
Quinn Hanam
University of British Columbia Vancouver, BC, Canada qhanam@ece.ubc.ca
Fernando S. de M. Britolowast; Univ. Federal da Paraiacute;ba Joatilde;o Pessoa, PB, Brazil
Ali Mesbah
University of British Columbia Vancouver, BC, Canada amesbah@ece.ubc.ca
ABSTRACT
JavaScript has become the most popular language used by developers for client and server side programming. The lan- guage, however, still lacks proper support in the form of warnings about potential bugs in the code. Most bug find- ing tools in use today cover bug patterns that are discov- ered by reading best practices or through developer intu- ition and anecdotal observation. As such, it is still unclear which bugs happen frequently in practice and which are important for developers to be fixed. We propose a novel semi-automatic technique, called BugAID, for discovering the most prevalent and detectable bug patterns. BugAID is based on unsupervised machine learning using language- construct-based changes distilled from AST differencing of bug fixes in the code. We present a large-scale study of common bug patterns by mining 105K commits from 134 server-side JavaScript projects. We discover 219 bug fixing change types and discuss 13 pervasive bug patterns that oc- cur across multiple projects and can likely be prevented with better tool support. Our findings are useful for improving tools and techniques to prevent common bugs in JavaScript, guiding tool integration for IDEs, and making developers aware of common mistakes involved with programming in JavaScript.
CCS Concepts
bull;Software and its engineering → Software testing and debugging; Empirical software validation;
Keywords
Bug patterns, JavaScript, Node.js, data mining, static anal- ysis
lowast;This author was a visiting student at the University of British Columbia, when this work was done.
Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than ACM must be honored. Abstracting with credit is permitted. To copy otherwise, or republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from Permissions@acm.org.
FSErsquo;16, November 13–18, 2016, Seattle, WA, USA
Qc 2016 ACM. 978-1-4503-4218-6/16/11...$15.00
http://dx.doi.org/10.1145/2950290.2950308
INTRODUCTION
A recent survey of more than 26K developers conducted by Stack Overflow found that JavaScript is the most-used pro- gramming language [54]. JavaScript is the language used in- side the browser but it is also becoming popular as a desktop and server-side language thanks to the Node.js1 platform.
Despite this, JavaScript currently lacks IDE support [12] in the form of analysis alerts that warn the developer about potential bugs in their code. Such alerts are common to compiled, strongly typed languages such as Java in the form of compilers and bug finding tools like FindBugs [13]. The lack of tool support for JavaScript is in part due to several challenges that are unique to JavaScript including, but not limited to weak typing [22, 49], dynamic field access and cre- ation [51], higher order functions, dynamic code evaluation and execution [50], and event-driven and asynchronous flow of control [5, 16].
Recent research advances have made the use of static anal- ysis on JavaScript more practical [12, 21, 25, 32, 40, 47, 53], while other techniques mitigate the analysis challenges by using a dynamic or hybrid approach [4, 17, 34]. As toolsmiths begin to develop the first bug finding tools for JavaScript, it is unclear which bugs require the most atten- tion. Unlike the most popular statically typed languages (e.g., [15, 48, 56]), there is little research studying bugs in JavaScript. While DOM API interactions have been shown to dominate bugs in client-side JavaScript [46], to the best of our knowledge, there is no work studying common bug patterns in JavaScript in general. The goals of this pa- per are twofold, namely, (1) developing a systematic semi- automated approach for discovering pervasive bug patterns;
- discovering bug patterns in server-side JavaScript that occur frequently across projects. We accomplish these goals in two parts.
First, we propose a novel semi-automatic approach to dis- cover common bug patterns. Our approach, called BugAID, mines version control repositories and discovers bugs that are frequently repaired by developers. Our insight that ma- kes this approach effective is that instances of bug pat- terns cau-sed by language misuse can be grouped together by changes to language constructs in the bug fixing com- mit. Using this intuition, BugAID creates feature vectors of language construct changes and uses unsupervised ma- chine learning to group them into ranked clusters of bug patterns. By inspecting these clusters, we create natural language descriptions of pervasive bug patterns.
Second, we produce the first ranked list of frequently oc-
curring bugs for a programming language by performing
剩余内容已隐藏,支付完成后下载完整资料
在JavaScript中发现错误模式
奎因· 哈南(Quinn Hanam)
大学不列颠哥伦比亚省温哥华,不列颠哥伦比亚省,加拿大qhanam@ece.ubc.ca
费尔南多· 德·M· 布里托* 大学 巴西PB 联邦大街(帕拉联邦州)Joatilde;oPessoa
阿里· 梅斯巴(Ali Mesbah)
英国大学哥伦比亚省温哥华,不列颠哥伦比亚省,加拿大amesbah@ece.ubc.ca
抽象
JavaScript的已成为使用最流行的语言的开发人员对客户端和服务器端编程。在LAN- 有瓜葛,但仍缺乏的形式适当支持有关在代码中潜在的错误警告。大多数错误find- 使用工具在使用今天盖错误模式被discov- ERED 通过阅读最佳做法或通过开发intu- 银行足球比赛和日常观察。因此,目前尚不清楚哪些错误在实践中经常发生,哪些错误对于开发人员来说很重要。我们 提出一种新颖的半自动技术,称为BugAID ,以发现最普遍和可检测的错误模式。BugAID 是基于在无监督机器学习使用语言- 基于结构,改变蒸馏从AST 差分的代码中的bug修复。我们通过挖掘134个服务器端JavaScript 项目中的105K提交,对常见的错误模式进行了大规模研究。我们发现219种错误固定变化类型和商谈13个普遍的错误模式是OC- CUR 跨越多个项目,并能容易地防止有更好的工具支持。我们的研究结果是改善有用的工具和技术,以防止常见的错误在JavaScript中,引导工具集成的IDE,并使开发者意识到的常见错误涉及与编程中的JavaScript。
CCS 概念
bull; 软件及其工程→ 软件测试和调试;实证软件验证;
关键词
错误的模式,JavaScript中,Node.js的,数据挖掘,静态anal- ysis
1. 引言
一个最近的调查中更超过26K 开发商进行的堆栈溢出发现,JavaScript是最常用的亲gramming语言[54]。JavaScript是语言使用IN- 侧的浏览器,但它是也成为流行作为一个桌面和服务器端语言感谢Node.js的1 台。
尽管如此,JavaScript目前仍缺乏分析警报形式的IDE支持[12],这些警报会警告开发人员有关其代码中潜在的错误。这样的警报对于诸如Java之类的经过编译的强类型语言是很常见的,形式是编译器和诸如FindBugs [13]之类的错误查找工具。对JavaScript缺乏工具支持的部分原因是JavaScript特有的一些挑战,包括但不限于弱类型[ 22、49],动态字段访问和创建[51],高阶函数,动态代码评估和执行[50],以及事件驱动和异步控制流[ 5,16]。
最近的研究进展已经作出了使用的静态分析的JavaScript更实际的[12,21,25,32,40,47,53],而其它技术减轻分析挑战通过使用动态或混合方法[4,17 ,34]。随着工具匠开始开发第一个针对JavaScript的错误查找工具,目前尚不清楚哪些错误需要最多的关注。与最流行的静态类型语言(例如[15、48、56])不同,很少有研究研究JavaScript中的错误。据我们所知,虽然DOM API交互已被证明是占主导地位的客户端JavaScript错误[46],但一般来说,没有研究通用JavaScript模式的工作。该文件的目标是双重的,即:(1)开发一种系统的半自动化方法来发现普遍的错误模式;
(2)发现跨项目经常发生的服务器端JavaScript错误模式。我们实现这些目标的2 件。
首先,我们提出了一个新颖的半自动化的方法来解散盖常见的错误模式。我们的方法称为BugAID ,它会挖掘版本控制存储库并发现开发人员经常修复的错误。我们认为使这种方法有效的见解是,可以通过更改错误修复委员会中的语言结构,将由于语言滥用而导致的错误模式实例组合在一起。利用这种直觉,BugAID 可以创建语言结构更改的特征向量,并使用无监督的机器学习将它们分组为错误模式的排名簇。通过检查这些集群,我们创建了普遍的错误模式的自然语言描述。
其次,我们生成了频繁出现的排名第一的列表
2. 跨项目错误模式
软件漏洞可以分组通过他们的错(根本错误的原因),他们的失败(他们如何在OUT-放清单),或它们的修复。一组沿着这些二mensions之一缺陷被称为到作为一个缺陷类[35]。缺陷类别很重要,因为它们使我们可以在设计减轻缺陷的技术时对缺陷进行分组。对于例如,静态缺陷的发现工具倾向于寻找分组缺陷类 的故障,动态的bug查找工具针对缺陷类别分组的故障症状,并自动修复工具修复分组缺陷类别的修复。
我们对这项工作的兴趣在于可以在多个项目中检测到的缺陷类别。我们将这些缺陷类称为跨项目错误模式。
定义1(跨项目错误模式)中的图案的源代码即产生不正确的行为,具有consis- 10吨故障和 修复, 以及 发生 跨 多个项目。
✷
我们包括在我们的缺陷类别的错,因为跨项目工具根据自己的错误通常发现的缺陷情况。我们也将修复包括在缺陷类中,因为为了有效,跨项目的错误查找工具还应产生可操作的警报[ 19,24,29,52]。
1个函数(obj ,iterator ,callback ){
2 回调= 回调|| op ;
3 obj = obj || [];
4 v a r n e x t K e y = _ k e y I t e r a t o r (ob j );
5 i f (li m i t lt; = 0 ){
6 返回回调(null );
7 }
图1:一个潜在类型错误在_keyIterator 第4行被修复由初始化OBJ ,如果它是在falsey线3。
考虑异步Node.js项目中图1中的错误修复。在此之前的修复,参数 OBJ 可能 具有的价值不确定的行4.当字段或方法上访问未定义的JavaScript对象,一个TypeError异常。如果obj 未定义,则在_keyIterator 方法中引发此类错误。在第3行,开发人员通过检查obj 是否可以定义以及是否将其初始化为空数组来 修复该错误。 我们 考虑这个
一个跨项目的错误模式,因为它有一个具体的例子故障- 解引用一个非价值,一个一致的修复
- 检查,如果该值的OBJ 是不确定的,并且可以被看到在很多的JavaScript 项目。
3. 方法
精液静态分析的论文通过恩格勒[8]和Hov- ermeyer [20] 就不能提供一个系统的方法,以discov- e圈和选择普遍错误模式检测。在发布十多年之后,许多流行的跨项目错误发现工具都选择了一组缺陷类别,以根据最佳实践或通过开发人员的直觉和观察进行检测。FindBugs [20]和DLint [17] 就是这种情况。
因为软件公司的目标是使利润最大化,所以他们应该部署工具以发现成本最高的缺陷类别。Monperrus描述了2个缺陷类别的指标,有助于成本为国语- quency 与其中一个缺陷类出现和所述严重性的缺陷类的。频繁的缺陷类别导致高mainte- 楠成本而严重缺陷类导致在高produc- 灰损失[35]。的问题,我们都感兴趣的是怎么做,我们系统地探索频繁发生错误的模式?
3.1 减少搜索空间
一种方法是搜索开发人员经常修复的错误模式。这可以通过检查项目历史中的源代码更改来完成。还有,但是,使用这种方法的一个问题。所有的bug重新的检查在一个项目中的历史对由人类可能需要数天为一个项目,几千提交。这意味着手动检查的一个足够组的项目代表进行略去用于语言是不可行的。我们因此必须降低其搜索空间,我们寻找频繁出现bug模式。由于错误模式具有一致的修复功能,因此我们可以根据修复的模式对错误模式进行分组,以减少搜索空间。通过提取错误修复提交的源代码更改,可以自动观察到修复[33]。我们专注于提交而不是错误报告,因为开发人员经常忽略从提交到错误报告的链接,或者一开始就不创建错误报告 [7]。
首先,我们减少搜索空间通过只考虑提交,语句1到6之间国防部-指明分数(即,插入,删除或更新)。如果为零语句被修改,则提交没有修改任何代码,而重复跨项目的修理已被证明含有6个或更少的改性片段[39]。
搜索空间现在应该排除许多维修是不是跨项目重复。但是,有可能仍然是很多的错误模式是根本不会出现频繁或相关的是在整个搜索支离破碎错误模式的空间,使得手工检查挑战。接下来,我们CON- 代尔自动分组相关的错误模式。
3.2 分组跨项目的错误模式
鉴于一个大数目的提交与1-6 修改国有发言:,我们的目标是小组bug修复使用相同的错误模式的提交。因为我们不具备先天knowl- 什么存在的错误模式的边缘,要实现这一目标 ,我们使用机器学习进行聚类分析。的挑战我们面选择最佳特征向量和聚类算法,使得(1)提交一个数量人类必须检查被最小化和(2)的数的
通过检查群集而调用的错误模式已最大化。理想情况下,每个群集将包含一个错误模式的所有实例(完美调用),并且仅包含一个错误模式的实例(完美精度)。
那么我们的特征向量应该是什么样?我们的特征向量必须捕获未知的语义变化,同时忽略噪声,例如变量名和控制流中的微小差异 。天真的方法是使用源代码差异方法,例如线路电平差异或AST差异。正如我们在工作初期发现的那样,这种方法没有考虑变化的语义,因此极易受到噪声的影响。更好的方法 是变更分类,将语义添加到由 源代码 差异标识的源代码变更中。
Java 已经存在变更分类方法。Fluri和Gall [14]确定了可以在各种Java 实体上执行的41种基本更改类型,并使用这些基本更改来发现更复杂的更改[15]。金等 等 [27] 通过创建基本变更事实数据库并使用Datalog指定更复杂的变更类型来增强这种方法。但是,我们希望以检测未知的变化类型。从这种情况下,这两种方法都受到影响,是- 事业的最低水平变化类型,其他们使用,这我们称之为基本变型(旅战斗队),必须要手动指定(或势在必行声明)。这种方法受到这些预定义的BCT的限制,并且无法通过扩展数据来扩展以捕获新的模式 。
3.3 学习变更类型
我们的直觉是,通过将语言模型中的信息与源代码差异中的信息相结合,我们可以自动学习BCT 。我们介绍了用于捕获旅战斗队以下的抽象。在我们的摘要中,所有BCT均由以下组件组成:
语言构造类型:要修改的语言工件或概念的类型。对于JavaScript中,模型的语言可包括保留的话,API 伪影(例如,方法和字段名),语句类型,OP-erators,行为(例如,自动浇铸行为),甚至编码约定(例如,错误第一协议) 。
语言构造背景:在语境中它的出现语言结构。对于例如,保留字这可以在许多不同的环境中使用,例如一个分支条件内或作为一个 参数。
修改类型:如何在语言结构是国防部- 指明分数被提交。此信息由源代码差异工具计算。
名称: 我们分配给语言结构的名称。
假设一次提交中发生分类更改的顺序无关紧要,我们可以将更 复杂的更改类型(即由一个或多个BCT组成的更改类型)表示为一词袋,其
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[409644],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。