客户端JavaScriptBugs的成因及后果研究外文翻译资料

 2022-01-17 21:44:30

英语原文共 17 页,剩余内容已隐藏,支付完成后下载完整资料


客户端JavaScriptBugs的成因及后果研究

Frolin S.Ocariza Jr.,IEEE学生成员,Kartik Bajaj,IEEE学生成员,

Karthik Pattabiraman,IEEE高级成员,Ali Mesbah,IEEE成员

摘要——客户端JavaScript被广泛应用于Web应用中,以提高用户的交互性和简化客户端与服务器之间的通信。不幸的是,众所周知JavaScript容易出错。虽然先前的研究已经证明了JavaScript错误的普遍存在,但并没有试图确定它们的原因和后果。我们研究的目标是了解JavaScript错误的根源和影响,以及结果如何影响JavaScript程序员、测试人员和工具开发人员。我们对19个bug库的502个bug报告进行了实证研究。对bug报告进行彻底的检查,以分类和提取关于每个bug的原因(错误)和后果(故障和影响)的信息。我们的结果表明,大多数JavaScript错误(68%)与DOM相关,这意味着它们是由JavaScript代码与文档对象模型(DOM)之间的错误交互引起的。此外,80%的影响最大的JavaScript错误与DOM相关。最后,大多数JavaScript错误来自于程序员在JavaScript代码本身所犯的错误,而不是其他Web应用程序组件。这些结果表明JavaScript程序员和测试人员需要能够帮助他们对DOM进行推理的工具。此外,开发人员可以使用我们发现的错误模式为JavaScript设计更强大的静态分析工具。

关键字:错误,JavaScript,文档对象模型(DOM),错误报告,实证研究

1导言

EB开发人员通常依赖JavaScript来增强客户机上Web应用程序的交互性。例如,JavaScript用于为不同的Web应用程序组件(如按钮、链接和输入框)分配事件处理程序,在用户与其组件交互时有效地定义Web应用程序的功能。此外,JavaScript还可以用于向服务器发送异步HTTP请求,并使用结果响应更新网页的内容。

JavaScript包含了与传统语言不同的几个特性。首先,JavaScript代码在异步模型下执行。这允许在用户与Web应用程序组件交互时按需执行事件处理程序。第二,JavaScript的大部分设计是为了与称为文档对象模型(DocumentObjectModel,DOM)的外部实体进行交互。该实体是一个动态树状结构,包括Web应用程序中的组件以及它们的组织方式。使用DOMAPI调用,可以使用JavaScript访问或操作存储在DOM中的组件,从而允许网页更改而不需要重新加载页面。

虽然上面的特性允许Web应用程序具有高度的交互性,但它们也为JavaScript代码中的错误引入了额外的途径。在先前的研究[1]中,我们从50个流行的Web应用程序中收集JavaScript控制台消息(即异常),以了解Web应用程序对JavaScript错误的容易程度以及这些应用程序中出现了哪些类型的JavaScript错误。虽然这项研究指出了JavaScript错误的普遍存在,但它没有探讨它们的影响或根本原因,也没有分析它们所造成的失败类型。了解故障的根源和影响对于开发人员、测试人员以及工具构建人员提高Web应用程序的可靠性至关重要。

在本文中,我们的目标是发现JavaScript错误(错误)在Web应用程序中的原因,并分析它们的后果(失败和影响)。为此,我们对500多个公开发布的JavaScript bug报告进行了实证研究。我们选择bug报告,因为它们通常包含关于JavaScript错误的详细信息,并且还显示Web应用程序的行为;这些信息很难从JavaScript控制台消息或静态分析中提取。此外,我们只搜索标记为“固定”的bug报告,从而消除虚假或多余的错误报告。

然而,研究bug报告的一个主要挑战是,很少有Web应用程序公开它们的bug存储库。即使是那些这样做的人,也常常以临时的方式对报告进行分类,这使得从报告[2]中摘取有关细节具有挑战性。因此,我们系统地收集错误报告并对其格式进行标准化,以便对其进行研究。

我们的工作作出了以下主要贡献:

我们收集并系统地分类了来自15个Web应用程序和4个JavaScript库的502个bug报告,并将报告以标准格式进行分类;

我们将JavaScript错误分类为多个类别。我们发现一个类别占主导地位,另一类是DOM相关的JavaScript错误(更详细的下面);

我们分析了有多少bug可以被归类为类型错误,这有助于我们评估为JavaScript添加严格类型系统的编程语言的有用性,例如类型记录[3]和DART[4];

我们定量分析了JavaScript错误的本质(即原因和后果)和影响;

在适当的情况下,我们对我们分析的每个bug报告特征执行时间分析。这一分析的结果将表明多年来技术的变化如何为这些特性确定了趋势,使我们能够看到我们在提高客户端JavaScript的可靠性方面是否朝着正确的方向发展;

我们分析了结果对JavaScript代码的开发人员、测试人员和工具开发人员的影响。

我们的结果表明,大约68%的JavaScript错误是DOM相关的错误,这是JavaScript代码与DOM之间交互出错的结果。一个简单的例子是使用不正确的ID检索DOM元素,这可能导致空异常。此外,我们发现与DOM相关的故障占Web应用程序中影响最大的故障的80%左右。最后,我们发现大多数错误是由JavaScript代码而不是服务器端代码/HTML引起的,并且有一些反复出现的编程模式导致了这些错误。

除了我们的ESEMrsquo;13论文[5]中描述的bug报告研究的结果(目前的工作是一个扩展)之外,我们还发现一个小的但不可忽略的百分比(33%)的错误报告是类型错误,我们在第2节中对此进行了描述。此外,在我们的时间分析中,我们观察到了某些指标的下降趋势(例如浏览器专用性)和其他指标的上升趋势(例如JavaScript代码中所犯错误的数量)。

2背景和动机

本节提供关于现代Web应用程序结构的背景信息,以及JavaScript如何在此类应用程序中使用。我们还定义了本文中使用的术语,如JavaScript错误、故障、失败和影响。

最后,我们描述了我们的研究目标和动机。

2.1 Web应用程序

现代web应用程序包含三个客户端组件:(1)HTML代码,定义网页的初始元素及其结构;(2)css代码,定义这些元素的初始样式;(3)JavaScript代码,它在web应用程序中定义客户端功能。这些客户端组件可以由程序员手工编写,也可以由服务器端(例如PHP)代码自动生成。

文档对象模型(DocumentObjectModel)是一种动态树数据结构,它定义了Web应用程序中的元素、它们的属性(包括它们的样式信息)以及元素的结构方式。最初,DOM包含HTML代码中定义的元素,这些元素被分配给CSS代码中定义的样式信息。但是,JavaScript可以通过使用DOMAPI调用来操作DOM的初始状态。例如,可以通过调用getElementById()方法通过其ID访问DOM中的一个元素。然后可以使用setAttribute()方法修改检索到的DOM元素的属性。此外,可以将元素添加到DOM中或从DOM中删除JavaScript代码。

通常,从DOM检索元素或属性的JavaScript方法或属性称为DOM访问方法/属性。这些方法/属性的示例包括getElementById()、getElementsByTagName()和parentNode。类似地,用于更新DOM中值的JavaScript方法或属性(例如,其结构、元素的属性等)。称为DOM更新方法/属性。示例包括setAttribute()、innerHTML和replacechild()。访问和更新方法/属性共同构成DOMAPI。

2.2 JavaScript Bugs

JavaScript特别容易出错,因为它是一种弱类型语言,这使得该语言具有灵活性,但也为在重要操作中使用非类型化变量(MIS)提供了可能性。此外,可以在执行过程中动态创建JavaScript代码(例如,通过使用val),这可能导致只能在运行时检测到的错误。此外,JavaScript代码与DOM进行了广泛的交互,这使得测试/调试非常困难,这导致了我们在研究中发现的许多错误。

JavaScript Bug序列在本文中,我们使用“bug”这个术语作为一个所有的术语,它与Web应用程序的功能不理想的行为有关。下面的序列描述JavaScript bug的进展情况,以及我们用来描述这个序列的术语:

1)程序员在正在编写或生成的代码中的某个点犯了错误。这些错误可以从简单的错误,如印刷错误或语法错误,到更复杂的错误,如逻辑或语义错误。错误可以在JavaScript代码中提交,也可以在其他位置提交,例如HTML代码或服务器端代码(例如PHP)。

2)例如,错误可以传播到JavaScript变量、JavaScript方法或属性的参数或赋值,或者JavaScript代码执行过程中JavaScript方法的返回值。因此,到这一点,错误已经传播到一个错误。

3)错误直接导致JavaScript异常

1.JavaScript是一种基于ECMAScript标准的脚本语言,它用于其他应用程序,如桌面小部件,甚至Web服务器。然而,我们仅限于在Web应用程序的客户端使用JavaScript。

(代码终止失败)或输出中的损坏(与输出相关的故障)。这就是所谓的失败。

图一 与JavaScript bug报告关联的错误、错误和失败的示例

图一显示了在Moodle中报告的与JavaScript bug报告关联的错误、错误和失败的真实示例。

Moodle Web应用程序。注意,对于与输出相关的故障,相关的输出可以是许多事情的一个或多个组合,包括DOM、服务器数据或重要的JavaScript变量。我们将使用上述错误-故障模型来对JavaScript错误进行分类,如第3节所述。

DOM相关的故障。我们将DOM相关的错误定义如下:

定义1(DOM相关故障)。如果相应的错误导致调用DOMAPI方法DAM(或导致对DOMAPI属性DAP的赋值),因此传递给DAM的参数P(或分配给DAP的值A)不正确,则JavaScript bug B被视为已传播到与DOM相关的错误。

换句话说,如果JavaScript错误传播到DOM Access/UPDATE方法的参数或DOM Access/UPDATE属性的赋值-从而导致不正确的检索或DOM元素的错误更新-则该错误被称为已传播到与DOM相关的错误。例如,如果一个错误最终导致DOM访问方法getElementById()的参数表示一个不存在的ID,并且在使用错误参数执行期间调用该方法,则该错误已传播到与DOM相关的错误中。但是,如果错误未传播到DOM访问/更新方法/属性中,则该错误被视为已传播到与DOM无关的错误中。请注意,基于此定义,JavaScript代码中存在大量DOM交互并不一定意味着存在很大百分比的DOM相关错误,因为并非所有错误都会传播到代码中的任何DOMAPI方法调用。

类型故障。我们还对确定类型断层的普遍性感兴趣,我们将其定义如下:

定义2(故障类型)。如果JavaScript代码中存在语句L,则JavaScript bug B被视为已传播到类型错误,以便在执行再生成B的代码时,语句L引用表达式或者应该是类型t1的变量E,但E在运行时的实际类型是t2。

换句话说,如果JavaScript代码在执行过程中错误地假定某个值属于某种类型,则会发生类型错误。请注意,我们对类型的比较与Pradel等人的一致类型定义有一些相似之处[6]。特别是,我们都区分了不同的“类型类别”,例如原始类型和自定义类型;我们将在3.4节中进一步详细描述这一点。

严重程度。虽然故障的表现是明确的,并且主要是客观的(即抛出或不抛出异常;输出包含正确的值或不包含),但故障的严重程度是主观的,并且取决于使用Web应用程序的上下文。例如,如果一个异常发生在一个“新闻工具”web应用程序部件中,那么它可能被归类为非严重异常;但是,如果这个新闻代码被用于一些重要的东西-比如股票数据-同样的异常现在可能被归类为严重的。在本文中,我们将把严重程度称为失败的影响。我们在对Web应用程序的内容和预期功能进行定性分析的基础上确定影响。

2.3目标和动机

我们这项工作的总体目标是了解Web应用程序中客户端JavaScript错误的来源和影响。为此,我们对部署的Web应用程序中的JavaScript bug报告进行了实证研究。有几个因素促使我们追求这一目标。首先,了解JavaScript错误的根源可以帮助开发人员意识到需要避免的编程缺陷,其结果可以为更好的JavaScript调试技术铺平道路。其次,分析影响可以引导开发人员和测试人员注意到影响最大的错误,从而使这些故障能够尽早被检测到。最后,我们有理由相信JavaScript错误的根源和影响与传统语言不同,因为JavaScript的允许性及其许多独特的特性(例如事件驱动模型;与DOM的交互;动态代码创建等)。

其他工作通过控制台消息或静态分析[7]、[8]、[9]、[10]研究JavaScript错误。但是,bug报告包含有关故障的根源和应用程序的预期行为的详细信息,这些技术中缺少这些信息。此外,它们通常包含与故障相关联的修复,这对于进一步理解它非常有用,例如,用于确定修复时间。

3实验方法

我们描述了我们的JavaScri

全文共32924字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[1163]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。