| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 技术分享 | 以标准为指导的 JS 引擎一致性测试 -> 正文阅读 |
|
[开发测试]技术分享 | 以标准为指导的 JS 引擎一致性测试 |
目录 本文以技术文章的方式回顾汤战勇老师在 SIG-编程语言测试 技术沙龙上的分享,回顾视频也已经上传 B 站:https://www.bilibili.com/video/BV1Ev411n7LK,欢迎小伙伴们点开观看。 大家好,我是来自西北大学的汤战勇,非常感谢华为编程语言实验室的邀请,很高兴有机会在这里给大家分享我们团队关于 JS 引擎测试方面的工作 ——?COMFORT?[1]。 COMFORT?(COMpiler?Fuzzing fOr javascRipT) 是我们团队提出的一个全新的编译器模糊测试框架,基于 ECMAScript Specification 来指导如何检测 JS 引擎的缺陷。COMFORT 利用了基于深度学习的语言模型的最新进展,自动生成 JS 测试代码。我们将 COMFORT 应用到 10 个主流的 JS 引擎上,在 200 小时的自动并发测试运行中,我们在被测的 10 个 JS 引擎中均发现了 bugs:共发现 158 个 JS 引擎 bugs,其中 129 个已通过验证,115 个已被修复。另外,COMFORT 生成的 21 个测试用例已经添加到官方 ECMAScript 的一致性测试套件 Test262 [2] 中。 我们已将 COMFORT 的代码和数据开源,欢迎大家试用。 #?引言?#JS 语言是目前最流行的开发语言之一,截止 2021 年第一季度的统计,超过 4000W 的开发者,Github 上有超过 470W 的代码仓库。 除了常见的四种主流的浏览器引擎(比如 Apple Safari 中的 JavaScriptCore,Google Chrome 中的 V8,Microsoft Edge 中的 ChakraCore,Firefox 中的 SpiderMonkey),在很多的移动和嵌入式系统中还有广泛适用特定浏览器的 JS 引擎(比如 Hermes,QuickJS,Rhino,Nashorn,JerryScript,Graaljs),其中有些 JS 引擎是为了适应特定的轻量级应用。 ?为了保证 JS 脚本在各个浏览器中都能够执行,开发 JS 引擎需要遵循一定的开发规范(或者是标准)。可以理解的是,和大多数程序开发人员的开发的软件一样,JS 引擎不可避免的也会产生 bugs 或者是漏洞。如何检测 JS 引擎中的 bug 是研究人员一直关注的问题。 # 如何选择 JS 引擎的测试方法?# Bug 检测的方法有很多,常见的有?程序分析、软件测试、形式化证明?等,这些方法均能发现软件的缺陷。其中?软件测试?是目前被广泛使用的程序缺陷的检测方法,包括?黑盒测试、灰盒测试?和?白盒测试?等方法。 ?模糊测试 fuzzing?是自动缺陷检测的重要的方法和途径之一 [4, 5, 6]。TSE2019 上有研究人员对目前的模糊测试的工具做了个整体的展示,我们看到,目前这个领域一直都比较热门,研究人员不断的尝试和改进已有的模糊测试方法,以求触发更多的软件缺陷。 ?对于给定的编译器(JS 引擎),如果执行某一个测试用例,可能输出的结果有几种,包括正常输出、异常、Crash,以及也有可能出现执行超时情况。如果 JS 引擎运行结果 crash 或者超时,我们很容易判断引擎可能存在 bugs。但是,如果我们发现引擎输出结果、或者抛出异常,又该如何判断所输出的结果或抛出的异常是否正确呢? ?目前看来,为了检测引擎的 bugs,在模糊测试框架中,使用?差分测试?是较为有效的手段之一 [7, 8, 9]。利用?多数投票表决?的方法快速的判断哪些引擎的输出存在问题(与其它不一致的行为),然后加以验证。 #?设计 JS 引擎的模糊测试用例生成技术?#如何产生有效的高质量的测试用例一直是目前模糊测试面临的挑战。?对于 JS 引擎的差分模糊测试而言,其用例由?程序?和相应的?输入?两方面构成,且测试用例的输入对于被测对象的代码覆盖尤其重要。所以,从一定程度上讲,生成正确的输入较为困难。但同时,我们也发现输入类型正确的数据对发现引擎的 bugs 非常重要。 ?如何能够输入类型正确的数据呢?我们首先想到了?JS 引擎的开发规范,我们希望通过利用标准来知道测试用例中数据的生成,从而产生高质量的测试用例。 以一个简单的 case 为例,这是一个由 GPT-2 预训练模型生成的例子:
其中,
通过分析?ECMA-262?中对应的规则(即上述规则中的第五条)发现,若参数长度(代码示例中的? 在大多数我们测试过的 JS 引擎上,的确输出了满足预期的结果(比如 Google V8 [11],ChakraCore [12],JavaScriptCore [13],SpiderMonkey [14])。然而, 最新版本的 Rhino JS 引擎 [15] 执行此示例代码后,会打印一个空字符串,这里就是一个标准的一致性错误(Conformance Bug)。 要生成能暴露该 bug 的测试用例,fuzzer 需要知道代码的上下文,比如,需要生成一个? COMFORT?通过使用?ECMA-262?来指导人工提取标准的规则,从而高效地找到?参数类型?和?对应的边界条件的值,成功地生成可暴露 Rhino 中该 bug 的测试用例,该用例并未在原本的 Test262 测试套中。 #?测试方法的详细说明?#图 8 简单展示了?COMFORT?测试方法及用例生成技术的大致思路: ?COMFORT?的设计目的是使用语言规范来指导测试用例的生成。具体来讲:
#?模型训练与 JS 代码生成?如图 9 所示,测试用例生成的步骤为: 模型选择?基于独立自然语言文档预训练过的语言模型 —— GPT-2 [16]。对比 DeepSmith [17], GPT-2 可以建模出源码中? 模型训练?为了收集训练数据以移植预训练的 GPT-2 来生成 JS 程序,我们在以 JS 为主要编程语言的 GitHub 项目中选择了前 4000 个星数最多的项目,提取出大约 14k 个 JS 程序。我们使用收集到的 JS 程序更新预训练 GPT-2 模型的最后两个全连接层的权重,同时保持其他层的权重不变。 JS 程序生成?使用经过训练的 GPT-2 生成 JS 测试程序。每个测试程序都包含一个 JS 函数(例如,前面代码示例中第 1-4 行的?
#?ECMA-262 规范分析和提取我们实现了一个 ECMA-262 解析器,用以从 ECMA-262 规范中分析和提取 JS API 的规则。在我们的实现中,采用了 ECMA-262 文档 的 HTML 版本。解析步骤如下:
按照如是步骤,我们提取出涵盖了 ECMA-262 第 10 版(2019 年版本)中约 82% 的 API 和? #?测试数据生成我们的测试数据以为 JS 函数的变量赋值的形式嵌入到 JS 代码中。除了生成变量外,我们还会生成调用传入给定参数函数的代码,并打印结果。具体算法如下:
对于输入 JS 测试程序中的每个语句:
对于每种参数类型,我们依据:
为了使变量值发生突变,我们通过遍历 JS 代码中的?控制流?和?数据流图(上述算法中的第 8 行),将传递给函数的参数与函数的定义相关联。然后将这些参数值和输入的 JS 测试程序? #?差分测试测试数据生成后,接下来就可以对各个引擎进行差分测试了。图 12 展现出在 JS 引擎上执行测试用例时,可能会出现的七种运行结果:
??????????? ?实际的测试过程中,我们会对? #?测试用例裁剪为了帮助开发人员更好更快地定位 bug,我们开发了一种简单而有效的方法来减小可暴露 bug 测试用例的大小。具体做法是:
重复此过程至达到某个固定点,在该固定点,代码无法进行额外的删减,同时仍然可以再现与原始测试用例相同的 bug。 另外,还有一些工具如 HDD [20] 和 Perses [21] 可用来减少测试用例。 #?过滤误报随机生成的代码通常会产生触发相同编译器错误的测试用例。为了减少开发人员的参与,我们采用了一个自动化方案来过滤可能导致相同错误编译行为的测试用例。 具体来说,我们基于历史的可暴露 bug 测试用例构建了一个树状分类器,可以识别出已存在树中可导致相同 bug 的测试用例。图 13 展示了一个树状的三层过滤器,可以预测当前测试用例是否会触发一个已经被测过的 bug。
当一个测试用例在测试运行期间触发了一个 bug 行为,我们会将该测试用例遍历此树,以查看当前测试用例的路径是否已经存在与先前的测试用例集中:
对于后一种情况,我们会根据测试用例触发的 bug 向树中添加一个新的叶子节点。 我们上述基于多维特征实现的测试用例过滤方法,已创建了一个由 2,300 个叶决策节点组成的树状知识库。这些规则已经帮助我们过滤了数以万计的重复错误编译行为,显著减少了检查测试用例以确认错误的开销和人工参与的成本,提高了差分模糊测试系统的效率。 #?实验结果展示?#针对 10 个 JS 引擎的结果比对如下(所有被测试的 JS 引擎都声称与 ECMA-262 版本兼容): Bug 类型统计分析: Bug 数量 Top 10 的 API 类型: 受影响的编译器组件有: 两个已被确认和修复的 bugs:
对比当前的几种测试方法缺陷发现能力:
参考[1] Guixin Ye, Zhanyong Tang, Shin Hwei Tan, Songfang Huang, Dingyi Fang,Xiaoyang Sun, Lizhong Bian, Haibo Wang, and Zheng Wang. Automatedconformance testing for javascript engines via deep compiler fuzzing.CoRR,abs/2104.07460, 2021. [2] Test262: ECMAScript Test Suite (ECMA TR/104). https://github.com/tc39/test262. [3] GitHut 2.0 Language Stats in 2021 Q1 https://madnight.github.io/githut/#/pull_requests/2021/1 [4] Junjie Chen, Wenxiang Hu, Dan Hao, Yingfei Xiong, Hongyu Zhang, Lu Zhang, and Bing Xie. 2016. An empirical comparison of compiler testing techniques. In Proceedings of the 38th International Conference on Software Engineering (ICSE). 180–190. https://doi.org/10.1145/2884781.2884878 [5] Yang Chen, Alex Groce, Chaoqiang Zhang, Weng-Keen Wong, Xiaoli Fern, Eric Eide, and John Regehr. 2013. Taming compiler fuzzers. In Proceedings of the 34th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI). 197–208. https://doi.org/10.1145/2491956.2462173 [6] Valentin Jean Marie Manes, HyungSeok Han, Choongwoo Han, Sang Kil Cha, Manuel Egele, Edward J. Schwartz, and Maverick Woo. 2019. The Art, Science, and Engineering of Fuzzing: A Survey. IEEE Transactions on Software Engineering (2019), 1–1. https://doi.org/10.1109/TSE.2019.2946563 [7] Vu Le, Mehrdad Afshari, and Zhendong Su. 2014. Compiler Validation via Equivalence modulo Inputs. In Proceedings of the 35th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI). 216–226. https://doi.org/10.1145/2594291.2594334 [8] Georg Ofenbeck, Tiark Rompf, and Markus Püschel. 2016. RandIR: differential testing for embedded compilers. In Proceedings of the 7th ACM SIGPLAN Symposium on Scala (Scala). 21–30. https://doi.org/10.1145/2998392.2998397 [9] Chengnian Sun, Vu Le, and Zhendong Su. 2016. Finding and analyzing compiler warning defects. In Proceedings of the 38th IEEE/ACM International Conference on Software Engineering (ICSE). IEEE, 203–213. https://doi.org/10.1145/2884781.2884879 [10] ECMAScript 2015 Specification https://262.ecma-international.org/6.0/ [11] Google V8 https://v8.dev/ [12] ChakraCore https://github.com/chakra-core/ChakraCore [13] JavaScriptCore https://developer.apple.com/documentation/javascriptcore [14] SpiderMonkey https://spidermonkey.dev/ [15] Rhino JS Engine with ECMAScript 2020 https://github.com/mozilla/rhino [16] Alec Radford, Jeffrey Wu, Rewon Child, David Luan, Dario Amodei, and Ilya Sutskever. 2019. Language models are unsupervised multitask learners. OpenAI Blog 1, 8 (2019), 9. https://openai.com/blog/better-language-models/ [17] Chris Cummins, Pavlos Petoumenos, Alastair Murray, and Hugh Leather. 2018. Compiler fuzzing through deep learning. In Proceedings of the 27th ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA). 95–105. https://doi.org/10.1145/3213846.3213848 [18] JSHint: A JavaScript Code Quality Tool. https://jshint.com/ [19] Tika https://tika.apache.org/ [20] Ghassan Misherghi and Zhendong Su. 2006. HDD: hierarchical delta debugging. In Proceedings of the 28th International Conference on Software Engineering (ICSE). 142–151. https://doi.org/10.1145/1134285.1134307 [21] Chengnian Sun, Yuanbo Li, Qirun Zhang, Tianxiao Gu, and Zhendong Su. 2018. Perses: Syntax-guided program reduction. In Proceedings of the 40th International Conference on Software Engineering (ICSE). 361–371. https://doi.org/10.1145/3180155.3180236 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 20:31:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |