CN113157565B - 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 - Google Patents
一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 Download PDFInfo
- Publication number
- CN113157565B CN113157565B CN202110308117.6A CN202110308117A CN113157565B CN 113157565 B CN113157565 B CN 113157565B CN 202110308117 A CN202110308117 A CN 202110308117A CN 113157565 B CN113157565 B CN 113157565B
- Authority
- CN
- China
- Prior art keywords
- case
- engine
- seed
- mutation
- test
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/04—Architecture, e.g. interconnection topology
- G06N3/044—Recurrent networks, e.g. Hopfield networks
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/95—Retrieval from the web
- G06F16/951—Indexing; Web crawling techniques
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06N—COMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
- G06N3/00—Computing arrangements based on biological models
- G06N3/02—Neural networks
- G06N3/08—Learning methods
- G06N3/084—Backpropagation, e.g. using gradient descent
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- General Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Biophysics (AREA)
- Evolutionary Computation (AREA)
- Biomedical Technology (AREA)
- Molecular Biology (AREA)
- Computing Systems (AREA)
- Computational Linguistics (AREA)
- Life Sciences & Earth Sciences (AREA)
- Mathematical Physics (AREA)
- Software Systems (AREA)
- Health & Medical Sciences (AREA)
- Databases & Information Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于种子用例突变的反馈式JS引擎模糊测试方法及装置,包括数据收集与预处理、模型训练、用例突变以及模糊测试四个主要阶段。该方法使用预先训练好的神经语言模型,根据从种子用例中截取的代码上文自动地续写下文,从而突变生成新的测试用例,克服随机突变方法中存在的大量无效突变的问题。随后通过差分模糊测试的方式检测JS引擎的缺陷。在测试过程中不断反馈式地扩充种子用例池,以增大种子用例对引擎的测试范围,从而对引擎进行更加全面的测试。经试验表明,使用本方法能够有效地检测出JS引擎的缺陷,在实际的测试过程中发现了四大主流JS引擎共计23个软件缺陷。
Description
技术领域
本发明涉及计算机技术领域,涉及一种软件测试方法,特别涉及一种基于种子用例突变的反馈式JS引擎模糊测试方法及装置。
背景技术
JavaScript(JS)语言是目前世界上最流行的前端脚本语言,它通常用来支持用户与Web页面进行交互,是Web应用程序的最重要组成部分之一。JS语言的成功离不开性能强大的JS引擎的支持,JS引擎是嵌入在Web浏览器内部,作为JS代码的解释器,来负责执JS代码,以实现对Web页面元素的动态控制。
随着JS语言的不断发展,除了嵌入在浏览器内部,JS引擎也被应用到许多其他场景中,例如Chrome V8引擎就被用来作为Node.js的内核,以便于在服务器端运行JS代码;Hermes引擎专注于移动端,为基于React Native开发的安卓应用带来更快更好的用户体验;另外,还有JerryScript等专为小内存设备开发的JS引擎,以及Rhino、Nashorn和GraalJS等内嵌在Java开发工具包(JDK,Java Development Kit)中的用于多语言融合编程的JS引擎,它们在不同的领域内发挥着重要的作用。
JS引擎的应用越广泛,就越有必要保障其执行的正确性,即需要对其进行缺陷检测。传统的软件测试方法主要通过人工编写测试用例,然后通过下断言的方式来对软件缺陷进行检测,这种手动的测试方法不仅需要大量的人工参与,而且难以长期进行。而模糊测试技术是一种新式的自动化测试技术,它的核心思想是将自动生成的大量随机用例输入到待测目标程序中执行,同时对程序的执行过程进行监控,当程序出现非预期的行为时便将其记录下来,并对其进行人工分析以判断是否为软件缺陷。模糊测试过程中仅需要较少的人工参与,便能够自动地对软件进行长期不间断的全面测试,是当前最有效的缺陷检测手段之一。
模糊测试的关键在于如何产生新的测试用例,其直接决定了模糊测试的效果。目前的主流的用例产生方法主要有两类:生成式方法和突变式方法。生成式方法通常是由人工根据经验和专家知识来编写语法规则或者生成模板,然后依据规则和模板来随机产生新的测试用例。生成式方法的缺点很明显,一方面其需要耗费大量的人力来编写规则或模板,另一方面其对专家知识的要求很高,提高了使用门槛。而突变式方法是指在原始用例的基础上,通过对其进行某些修改或者调整,使得测试用例呈现出新的行为的一种用例产生方法。传统的突变式方法通常通过对原始用例进行随机修改来实现,这种方法实现简单但测试效率很低,因为很多突变后的用例都是相似的,并不能触发新的缺陷,属于无效突变。
并且,模糊测试方法也有一定缺陷,即由于模糊测试是一种自动化测试,所以在长期的测试过程中会积累大量需要人工分析的可疑用例,而这些用例中可能会存在许多重复,会耗费大量不必要的人工成本,因此需要对其建立科学的用例去重方法,以减少人工成本。
发明内容
针对现有的用例生成和模糊测试方法存在的问题,本发明的目的在于提供一种基于种子用例突变的反馈式JS引擎模糊测试方法及装置,来对JS引擎的缺陷进行检测,以保证JS引擎执行的正确性,并且使用尽可能科学的可疑用例去重方法来尽可能地减少用例分析过程中的人工成本。
为了实现上述任务,本发明采取如下技术解决方案:
一种基于种子用例突变的反馈式JS引擎模糊测试方法,包括如下步骤:
S1、数据收集与预处理:
获取源代码得到语料库数据,获取途径为GitHub上开源的JS代码仓库;语料库数据预处理后得到训练数据集;
获取测试用例源代码得到种子用例数据,获取途径为JS引擎本身的测试套件;种子用例数据预处理后得到种子用例池;
S2、模型训练:
S1中的训练数据集训练基于LSTM结构的神经语言模型;
S3、用例突变:
从S1的种子用例池中随机选取种子用例,随机选取种子用例的突变点;基于突变点利用S2训练好的基于LSTM结构的神经语言模型续写源代码形成测试用例;
S4、模糊测试:
以测试用例作为输入,至少两个JS引擎执行输入;
如果每个JS引擎执行结果均一致,则执行S3;
至少有一个JS引擎执行结果不一致,则比对测试用例的用例状态码与种子用例池中的用例状态码,如果重复,则执行S3;如果不重复,一方面该测试用例加入种子用例池,另一方面对该测试用例进行人工分析。
可选的,S3具体包括:
种子用例池中随机选择一个种子用例作为种子文件,在种子文件上随机选取突变点,根据突变点对种子文件进行截取获得代码上文;
S2训练得到的基于LSTM结构的神经语言模型根据代码上文续写代码下文,形成测试用例。
可选的,模型训练语料数据预处理包括关键词过滤、非英文数据过滤、注释移除、代码格式统一、语法过滤和长度过滤;
种子用例数据预处理包括关键词过滤、非英文数据过滤、注释移除、代码格式统一、语法过滤、长度过滤和个性化消除。
可选的,所述的引擎执行结果包括:
英文名称 | 中文名称 | 类别描述 |
Pass | 通过 | 引擎正常执行完该用例 |
Timeout | 超时 | 引擎执行该用例超时 |
Crash | 崩溃 | 引擎执行该用例崩溃 |
RuntimeError | 运行时错误 | 引擎执行该用例时抛出运行时异常 |
可选的,所述的用例状态码为:
一种基于种子用例突变的反馈式JS引擎模糊测试装置,所述的装置包括:数据收集与预处理模块、模型训练模块、用例突变模块和模糊测试模块;
该装置执行本发明任一所述的基于种子用例突变的反馈式JS引擎模糊测试方法。
可选的,所述的数据收集与预处理模块执行数据收集与预处理程序,包括:
获取源代码得到语料库数据,获取途径为GitHub上开源的JS代码仓库;语料库数据预处理后得到训练数据集;
获取测试用例源代码得到种子用例数据,获取途径为JS引擎本身的测试套件;种子用例数据预处理后得到种子用例池。
可选的,所述的模型训练模块执行模型训练程序,包括:
训练数据集训练基于LSTM结构的神经语言模型。
可选的,所述的用例突变模块执行用例突变程序,包括:
种子用例池中随机选择一个种子用例作为种子文件,在种子文件上随机选取突变点,根据突变点对种子文件进行截取获得代码上文;
训练得到的基于LSTM结构的神经语言模型根据代码上文续写代码下文,形成测试用例。
可选的,所述的模糊测试模型用于执行模糊测试程序,包括:
以测试用例作为输入,至少两个JS引擎执行输入;
如果每个JS引擎执行结果均一致,则执行S3;
至少有一个JS引擎执行结果不一致,则比对测试用例的用例状态码与种子用例池中的用例状态码,如果重复,则执行S3;如果不重复,一方面该测试用例加入种子用例池,另一方面对该测试用例进行人工分析。
本发明和现有技术相比,技术创新点主要在于:
使用神经语言模型基于种子用例突变的方式来产生新的测试用例,能够克服传统的用例突变方式中存在的无效突变的问题,因为新的用例内容都是由模型根据自动学习的编码规范以及给定的代码上文来续写的,而不是单纯地在原始用例上进行随机突变;另外,在测试过程中会反馈式地扩充种子用例池,以增大种子用例对引擎的测试范围,从而对引擎进行更加全面的测试,增加了用例触发引擎缺陷的可能性。最后,本发明设计了一种有效的用例去重方法,通过该方法能够只保留独特的可疑用例,尽可能地减少测试过程中的人工成本,从而提升发现缺陷的效率。
附图说明
附图是用来提供对本公开的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本公开,但并不构成对本公开的限制。在附图中:
图1是本发明的基于种子用例突变的反馈式JS引擎模糊测试方法的流程图;
以下结合附图和实施例对发明作进一步的详细说明。
具体实施方式
以下结合具体实施例和附图对本发明的具体方案进行说明:
本发明的基于种子用例突变的反馈式JS引擎模糊测试方法,主要分为数据收集与预处理、模型训练、用例突变以及模糊测试这四个主要阶段,其中:
数据收集与处理阶段:从GitHub的开源项目以及JS引擎本身的测试套件中收集本方法需要的数据,并按规则对其进行预处理;数据收集阶段主要收集两种类型的数据:第一类是作为模型训练的语料库数据,该数据主要从GitHub上开源的JS代码仓库中获得,规模较大;第二类是作为用例突变的种子用例数据,该数据主要从JS引擎本身的测试套件中获得,数据规模较小;
随后需要对两类数据分别进行预处理,主要的预处理步骤包括按关键词过滤、非英文数据过滤、注释移除、代码格式统一、语法过滤和长度过滤。额外地,对第二类数据还需要进行个性化消除,因为其是直接从各个JS引擎的源代码中获得的,而各个JS引擎分别有其不同的实现特性,因此需要消除这些特性以提高种子用例的普遍适用性。
模型训练阶段:利用数据收集阶段获得的第一类数据(即语料库数据)来训练一个基于LSTM结构的神经语言模型,该模型能够从大量的语料库数据中自动地学习JS语言的语法和语义信息,从而能够完成基于代码上文自动生成下文的任务。
用例突变阶段:首先从数据收集阶段获得的第二类数据(即种子用例数据)中随机选择一个种子用例作为种子文件,随后在种子文件上随机选取突变点,根据突变点对种子文件进行截取以获得相应的代码上文。最后使用模型训练阶段得到的LSTM模型来根据代码上文续写下文,从而产生新的测试用例。不断重复本过程,便能源源不断地产生新的测试用例。
模糊测试阶段:将用例突变阶段产生的多个测试用例,依次分别输入到至少两个主流JS引擎中去执行,并对执行结果进行统计。正常情况下,每个引擎执行同一个用例的结果应当是一致的;因此,假如结果中出现了不一致,则认为该用例可能触发了某个引擎的缺陷。接着需要将该测试用例与种子池中的所有种子用例的用例状态码进行比较,如果不同,说明该用例呈现出了一种全新的行为,因此便反馈式地将该用例加入种子用例池,以扩大种子用例池中用例对引擎的测试范围,并将该用例视为不重复的可疑用例保存下来。在最后阶段,需要人工地对所有不重复的可疑用例进行分析,以确定可能存在的引擎缺陷的位置和原因,便于向引擎供应商提交缺陷报告。
参见图1,本实例给出一种基于种子用例突变的反馈式JS引擎模糊测试方法,主要包括数据收集与预处理、模型训练、用例突变以及模糊测试等四个主要阶段,以下是具体的实施过程。
1、数据收集与预处理
1.1相关工具介绍
在数据收集与预处理阶段需要借助一些现有的工具,主要包含以下几种:
(1)Esprima与Escodegen
二者都是JS的第三方库,其中Esprima是一种标准的ECMAScript解析器,用于对JS代码进行词法或语法分析,使用它能够将JS代码解析为对应的抽象语法树;Escodegen则能够将JS的抽象语法树还原为JS代码。二者往往搭配使用。
(2)Uglifyjs
UglifyJS是JS的第三方库,它是集JS解释器、代码最小化、代码压缩、代码美化等多种功能于一身的实用工具。使用它可以方便地对代码进行美化。
(3)Git
Git是一种版本控制工具,主要功能是对源代码进行版本控制,以提高开发者的效率。使用它能够方便地从GitHub平台上下载代码仓库。
1.2数据收集步骤描述
本方法需要收集两种类型的数据:第一类数据是作为模型训练的语料库数据,该数据主要从GitHub上开源的JS获得;第二类数据是作为用例突变的种子用例的数据,该数据主要从JS引擎本身的测试套件中获得;
第一类数据的收集步骤如下:
(1)使用浏览器访问GitHub平台的JavaScript主题分类,并按照Star数目对其中的仓库进行排序(即https://github.com/topics/javascript?l=javascript&o=desc&s=stars);
(2)编写网络爬虫,获取到该页面中排名前4000的仓库名称;
(3)编写下载脚本,使用Git工具执行“gitclone”命令,依次下载这4000个仓库的源代码。
第二类数据的收集方法如下:
(1)查阅资料,了解当前主要的JS引擎的源码信息;
(2)依次下载这些JS引擎的项目源码到本地;
(3)浏览引擎源码的目录,找到其JS测试套件所在的目录,其中的测试用例将会在预处理后作为种子文件。
1.3数据预处理步骤描述
收集到两类数据后,需要对其进行预处理。两类数据的预处理步骤基本相同,如下:
(1)JS类型文件提取:无论是JS代码仓库还是引擎的项目源码中都包含JS以外类型的文件,因此首先需要将其中的JS文件提取出来;
(2)数据清洗:需要人工浏览数据,对数据中的不规范的和无效代码进行统计并设立关键词,按关键词过滤掉此类数据;
(3)非英文数据过滤:即过滤掉所有包含非英文字符的JS文件;因为GitHub仓库是由来自世界各地的开发者上传的,所以难免会有英文之外的语言,这些非英文数据会给模型训练带来误导,所以预先去掉;
(4)注释移除:代码注释会干扰模型学习,所以需要去掉。本方法使用Esprima和Escodegen工具来完成去注释任务;
(5)代码格式统一:不同仓库中的JS数据由不同的人员编写,所以可能存在不同的代码格式,为了模型能够更好地学习,需要对代码格式进行统一。本方法使用Uglifyjs工具来完成统一格式的任务;
(6)语法过滤:收集到的JS代码数据都是人工编写的,因此难免会有错误。本方法使用Esprima来对每个JS文件做一次语法检查,过滤掉其中存在语法错误的用例;
(7)长度过滤:过长和过短的数据都不利于模型学习,因此需要最后对数据按字符长度进行一次过滤,去掉过长和过短的数据。
(8)个性化消除:针对第二类数据特有的预处理步骤,由于第二类数据都是从不同的JS引擎中收集到的,而不同的JS引擎的功能又存在差异,所以需要人工指定规则对这些个性化的差异进行消除。例如对于从ChakraCore引擎的项目源码中获取到的数据就需要使用“print”替换掉“WScript.Echo”语句,因为前者是所有JS引擎通用的语法,而后者只是ChakraCore引擎独有的特性。
经过上述步骤,得到了处理后的两类数据,其中第一类数据将作为模型的训练数据,第二类数据将共同组成种子用例池,为模糊测试过程提供种子文件。
2、模型训练
模型训练阶段负责完成神经语言模型的训练,该模型能够从JS代码语料库中自动地学习JS的语法、语义信息,以及编码规范。训练好的模型能够用来基于给定的代码上文自动续写下文,完成新用例的生成任务。
2.1模型选择
神经语言模型是一类模型的统称,并没有要求具体的模型结构,本实施例选择LSTM(Long Short Term MemoryNetworks,长短期记忆网络)模型来具体实现。LSTM是一种特殊的RNN(Recurrent Neural Networks,循环神经网络)模型,它通过门控神经单元来选择性地对信息进行遗忘和添加,通过这种方式它能够学习数据间到更长期的依赖关系,克服了传统RNN模型存在的难以处理长序列数据的问题。因此选择该模型作为神经语言模型的实现方案。
2.2模型实现与训练
LSTM作为一种流行的深度学习模型,现在主流的深度学习框架都内置了其实现。本实施例采用Pytorch框架来具体实现,模型整体由词嵌入层、LSTM层和全连接输出层三部分构成。词嵌入层负责将Token编码成向量,便于向模型中输入,此处设置词嵌入维度为256;LSTM层完成具体的计算和权重参数的调整,此处设置层数为2,每层的神经元个数为512;全连接层负责将每一步得到权重参数进行计算后,并获得一个概率分布,便于进行下一个Token的预测,此处设置神经元个数为256。
在模型实现后便可以开始训练过程。训练数据为提前处理好的第一类数据,本实施例设置训练的批处理大小为128,使用交叉熵计算损失函数、Adam优化器进行权重参数的优化,训练50个迭代。最终,经过约24小时的训练,得到了一个表现优秀的神经语言模型,该模型能够完成根据代码上文自动续写代码下文的任务。
3、用例突变
用例突变步骤负责利用突变方法产生新的测试用例,其主要实施步骤如下:
(1)选取种子用例:新用例是基于种子用例突变得到的,故首先要确定一个种子用例。在上一步数据预处理步骤中已经构建好了种子用例池,因此此处只需要从中随机选取一个用例作为本次突变的种子即可。
(2)确定突变点和代码上文:拿到了种子用例,就需要从中确定突变点,以获得用于生成的代码上文。突变点实际上就是一个字符的索引序号,从种子用例的开始处到突变点索引的这一部分代码内容就是代码上文。突变点的选取可以是随机的,也可以按照某种特定规则。得到突变点后,便可以截取出对应的代码上文,用于下一步生成,如下所示:
(3)生成新用例:即基于上一步获得的代码上文,使用训练好的神经语言模型来自动地续写下文,之后将上下文拼接以获得最终的新用例。
4、模糊测试
在得到了新用例之后便需要对其进行模糊测试,因此需要构建一个模糊测试系统,该系统能够自动地将用例输入到多个JS引擎中执行,并对执行过程结果进行统计和分析,以比较用例的执行结果是否一致。当发生不一致时需要对用例进行是否重复的检查,并将通过检查的用例重新加入到种子池中。
模糊测试系统的具体实施步骤如下:
(1)配置JS引擎:要对JS引擎进行测试,首先必须要安装配置好待测的所有引擎,引擎的具体配置过程可以参考各个引擎的官方说明。本文总共对如表4.1所示的四个主流JS引擎进行了测试。
表4.1:四个主流JS引擎的相关信息
引擎开发商 | 引擎名称 | 对应浏览器名称 |
Apple | JavaScriptCore | Safari |
MicroSoft | ChakraCore | Edge |
V8 | Chrome | |
Mozilla | SpiderMonkey | Firefox |
(2)实现用例执行和结果监控模块:本模块负责将生成用例同时交给多个引擎去执行,并统计执行的结果。在通常情况下,Linux操作系统中每个程序的执行结果都由返回值(returncode)、标准输出(stdout)和标准错误(stderr)三部分组成,其中返回值标志着程序本次的执行状态,比如0代表程序正常执行没有抛出异常,-9代表程序超时,-11表示程序崩溃等;标准输出中保存着本次执行的输出打印信息;而标准错误则保存着本次执行过程中所抛出的异常信息,因此结果监控模块便需要对这三部分信息进行记录。
特别需要注意的是,不同的引擎对于执行结果有不同的实现方式,并不完全按照上述的三部分内容呈现。例如,ChakraCore引擎在执行用例时即使存在异常,其返回值也仍然为0;V8引擎在执行用例时,抛出的异常信息将保存在stdout中,而stderr内容一直为空,因此在统计执行结果时需要额外注意。
(4)实现执行结果分析模块:本模块负责完成多个用例执行结果的分析功能,即判断多个引擎对同一个用例的执行结果是否一致。其实现思路是利用返回值、标准输出和标准错误这三个结果信息来对每个引擎的执行结果进行分类,按照类别来判断多个结果是否一致,这里共分为如表4.2所示的四个类别:
表4.2:引擎执行结果的四种类别
四个引擎执行同一个用例,得到四个执行结果,并分别进行分类。当四个结果的类别不完全相同时,便认为触发了行为不一致,便将该用例记录下来,进行下一步去重。
(5)实现可疑用例去重模块:本模块负责完成可疑用例的去重功能,由于在模糊测试过程中可能会记录大量的可疑用例,而这些用例中可能存在行为重复的情况,直接对其进行人工分析会浪费很多时间,因此需要对其进行去重。在本方法中,去重使用的是状态码判别法,即通过状态码是否相同来判断两个用例是否重复。状态码是将引擎的执行结果的四大类别中的运行时错误(RuntimeError)进行细分后得到的。本方法规定了九种不同的状态,如表5.1所示。
表5.1:引擎执行结果的九种状态
状态码 | 英文名称 | 中文名称 | 状态描述 |
1 | Pass | 通过 | 引擎正常执行完该用例 |
2 | Timeout | 超时 | 引擎执行该用例超时 |
3 | SyntaxError | 语法错误 | 引擎执行时抛出语法错误 |
4 | RangeError | 范围错误 | 引擎执行时抛出范围错误 |
5 | ReferenceError | 引用错误 | 引擎执行时抛出引用错误 |
6 | TypeError | 类型错误 | 引擎执行时抛出类型错误 |
7 | URIError | 标识符错误 | 引擎执行时抛出标识符错误 |
8 | OtherError | 其他错误 | 引擎执行时抛出其他错误(如自定义错误) |
9 | Crash | 崩溃 | 引擎执行时崩溃 |
四个引擎分别执行同一个用例,会得到四个执行结果,其分类后便会有四个状态码,将这四个状态码合并作为该用例最终的状态码。例如,执行同一个用例,JavaScriptCore引擎通过(对应状态码1),而其余三个引擎都抛出引用错误(对应状态码5),则确定该用例最终的状态码就是“1555”,假如两个用例的状态码完全相同,则将其视为重复。
本方法会预先将种子池中的所有种子用例执行一遍模糊测试,记录下每个种子用例的状态码。每当出现一个新的可疑用例,便会将该用例的状态码与种子池中用例的状态码进行对比,若该状态码已存在,说明该用例的行为已经在种子池中出现过了,便将该用例视为重复并将其丢弃;假如该状态码在种子池中没有出现过,便将其视为新的有效可疑用例,接着会将其作为新的种子加入到种子池中,这种“反馈式”的过程能够不断地增大种子池用例的代码覆盖范围,从而触发更多的引擎缺陷。
另外,新的有效可疑用例将会交由下一步进行人工分析。
(5)人工分析:对于可疑用例需要进行人工分析,确定其是否真的是引擎缺陷,以及对缺陷进行定位和分析,并向引擎开发商提交缺陷报告。人工分析的通常步骤包括用例精简、缺陷定位、查找标准、编写并提交报告等。首先需要根据执行结果对用例进行不断地精简,以便于对有问题的代码进行定位,随后查询该代码对应的ECMAScript-262标准,分析其行为是否符合标准的预期。假如不符合则说明该引擎确实存在缺陷,之后便编写缺陷报告,并提交给开发商。
6、实验部分
6.1硬件平台
本实施例中的实验平台是一台搭载主频为3.6GHz的Intel i7-7820x处理器和Ubuntu 18.04(内核版本4.15)操作系统的高性能服务器。服务器的运行内存为64GB,存储内存为2TB,图形显示卡为四张RTX 2080Ti。
6.2实验结果
(1)缺陷检测结果
在本实施例中,申请人对4个主流JS引擎进行了约300个小时的测试。表6.1展示了在各个不同引擎上检测出的缺陷的统计情况。截止2021年3月,共检测出23个不同的缺陷,其中21个已被引擎开发人员确认。
表6.1:四大引擎的缺陷检测结果统计表
JS引擎 | 提交数量 | 确认数量 |
V8 | 2 | 1 |
ChakraCore | 10 | 10 |
JavaScriptCore | 10 | 9 |
SpiderMonkey | 1 | 1 |
总计 | 23 | 21 |
(2)已发现的缺陷实例展示
(a)TypeError.prototype.toString
原始的种子用例:
触发缺陷的生成用例(已精简过):
此生成用例是基于种子用例的前两行(即下划线部分)突变得来的。该用例2~3行对TypeError的toString方法进行了重写,5~6行触发了一个TypeError。ChakraCore引擎在执行该用例时,没有抛出任何异常,也没有打印任何信息,不符合代码的执行逻辑。此Bug已经被ChakraCore开发人员确认并修复。
(b)%TypedArray%.prototype.set
原始的种子用例:
触发缺陷的生成用例(已精简过):
此生成用例是基于种子用例的前两行(即下划线部分)突变得来的。该生成用例的第1行定义了一个Int32Array类型的数组,并在第3行调用%TypedArray%.prototype.set方法,且传入参数是一个整数值a.length。此用例其他引擎都能正常执行完,而V8引擎却会在第三行抛出一个TypeError,其根本原因是V8在实现该方法时遗漏了将该方法的第一个参数强制转换为对象的步骤,导致后续执行时数据类型不正确,故抛出TypeError。
以上结合附图详细描述了本公开的优选实施方式,但是,本公开并不限于上述实施方式中的具体细节,在本公开的技术构思范围内,可以对本公开的技术方案进行多种简单变型,这些简单变型均属于本公开的保护范围。
另外需要说明的是,在上述具体实施方式中所描述的各个具体技术特征,在不矛盾的情况下,可以通过任何合适的方式进行组合,为了避免不必要的重复,本公开对各种可能的组合方式不再另行说明。
此外,本公开的各种不同的实施方式之间也可以进行任意组合,只要其不违背本公开的思想,其同样应当视为本公开所公开的内容。
Claims (10)
1.一种基于种子用例突变的反馈式JS引擎模糊测试方法,其特征在于,包括如下步骤:
S1、数据收集与预处理:
获取源代码得到语料库数据,获取途径为GitHub上开源的JS代码仓库;语料库数据预处理后得到训练数据集;
获取测试用例源代码得到种子用例数据,获取途径为JS引擎本身的测试套件;种子用例数据预处理后得到种子用例池;
S2、模型训练:
S1中的训练数据集训练基于LSTM结构的神经语言模型;
S3、用例突变:
从S1的种子用例池中随机选取种子用例,随机选取种子用例的突变点;基于突变点利用S2训练好的基于LSTM结构的神经语言模型续写源代码形成测试用例;
S4、模糊测试:
以测试用例作为输入,至少两个JS引擎执行输入;
如果每个JS引擎执行结果均一致,则执行S3;
至少有一个JS引擎执行结果不一致,则比对测试用例的用例状态码与种子用例池中的用例状态码,如果重复,则执行S3;如果不重复,一方面该测试用例加入种子用例池,另一方面对该测试用例进行人工分析。
2.根据权利要求1所述的基于种子用例突变的反馈式JS引擎模糊测试方法,其特征在于,S3具体包括:
种子用例池中随机选择一个种子用例作为种子文件,在种子文件上随机选取突变点,根据突变点对种子文件进行截取获得代码上文;
S2训练得到的基于LSTM结构的神经语言模型根据代码上文续写代码下文,形成测试用例。
3.根据权利要求1或2所述的基于种子用例突变的反馈式JS引擎模糊测试方法,其特征在于,模型训练语料数据预处理包括关键词过滤、非英文数据过滤、注释移除、代码格式统一、语法过滤和长度过滤;
种子用例数据预处理包括关键词过滤、非英文数据过滤、注释移除、代码格式统一、语法过滤、长度过滤和个性化消除。
4.根据权利要求1或2所述的基于种子用例突变的反馈式JS引擎模糊测试方法,其特征在于,所述的引擎执行结果包括:
。
5.根据权利要求1或2所述的基于种子用例突变的反馈式JS引擎模糊测试方法,其特征在于,所示的用例状态码为:
。
6.一种基于种子用例突变的反馈式JS引擎模糊测试装置,其特征在于,所述的装置包括:数据收集与预处理模块、模型训练模块、用例突变模块和模糊测试模块;
该装置执行权利要求1-5任一所述的基于种子用例突变的反馈式JS引擎模糊测试方法。
7.根据权利要求6所述的基于种子用例突变的反馈式JS引擎模糊测试装置,其特征在于,所述的数据收集与预处理模块执行数据收集与预处理程序,包括:
获取源代码得到语料库数据,获取途径为GitHub上开源的JS代码仓库;语料库数据预处理后得到训练数据集;
获取测试用例源代码得到种子用例数据,获取途径为JS引擎本身的测试套件;种子用例数据预处理后得到种子用例池。
8.根据权利要求6所述的基于种子用例突变的反馈式JS引擎模糊测试装置,其特征在于,所述的模型训练模块执行模型训练程序,包括:
训练数据集训练基于LSTM结构的神经语言模型。
9.根据权利要求6所述的基于种子用例突变的反馈式JS引擎模糊测试装置,其特征在于,所述的用例突变模块执行用例突变程序,包括:
种子用例池中随机选择一个种子用例作为种子文件,在种子文件上随机选取突变点,根据突变点对种子文件进行截取获得代码上文;
训练得到的基于LSTM结构的神经语言模型根据代码上文续写代码下文,形成测试用例。
10.根据权利要求6所述的基于种子用例突变的反馈式JS引擎模糊测试装置,其特征在于,所述的模糊测试模块用于执行模糊测试程序,包括:
以测试用例作为输入,至少两个JS引擎执行输入;
如果每个JS引擎执行结果均一致,则执行S3;
至少有一个JS引擎执行结果不一致,则比对测试用例的用例状态码与种子用例池中的用例状态码,如果重复,则执行S3;如果不重复,一方面该测试用例加入种子用例池,另一方面对该测试用例进行人工分析。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110308117.6A CN113157565B (zh) | 2021-03-23 | 2021-03-23 | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110308117.6A CN113157565B (zh) | 2021-03-23 | 2021-03-23 | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113157565A CN113157565A (zh) | 2021-07-23 |
CN113157565B true CN113157565B (zh) | 2023-02-07 |
Family
ID=76888192
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110308117.6A Active CN113157565B (zh) | 2021-03-23 | 2021-03-23 | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113157565B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114385491A (zh) * | 2021-12-30 | 2022-04-22 | 大连理工大学 | 一种基于深度学习的js转译器缺陷检测方法 |
CN115858405A (zh) * | 2023-03-03 | 2023-03-28 | 中国电子科技集团公司第三十研究所 | 一种用于代码测试的语法感知模糊测试方法及系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH04198588A (ja) * | 1990-11-28 | 1992-07-17 | Okumura Corp | シールド機の掘進速度制御方法 |
CN109460662A (zh) * | 2018-11-05 | 2019-03-12 | 杭州安恒信息技术股份有限公司 | 一种基于路径反馈的Javascript引擎模糊测试方法和装置 |
CN110399300A (zh) * | 2019-07-22 | 2019-11-01 | 南京大学 | 一种基于动态类型感知的Python软件模糊测试方法 |
CN112104525A (zh) * | 2020-09-18 | 2020-12-18 | 西安科技大学 | 基于序列生成对抗网络的dnp3协议模糊测试方法 |
CN112416806A (zh) * | 2020-12-09 | 2021-02-26 | 西北大学 | 一种基于标准文档分析的js引擎模糊测试方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8336102B2 (en) * | 2007-06-01 | 2012-12-18 | Microsoft Corporation | Delivering malformed data for fuzz testing to software applications |
US10452526B2 (en) * | 2017-06-15 | 2019-10-22 | Microsoft Technology Licensing, Llc | Machine learning for constrained mutation-based fuzz testing |
US10394694B2 (en) * | 2018-01-15 | 2019-08-27 | Fujitsu Limited | Unexplored branch search in hybrid fuzz testing of software binaries |
-
2021
- 2021-03-23 CN CN202110308117.6A patent/CN113157565B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH04198588A (ja) * | 1990-11-28 | 1992-07-17 | Okumura Corp | シールド機の掘進速度制御方法 |
CN109460662A (zh) * | 2018-11-05 | 2019-03-12 | 杭州安恒信息技术股份有限公司 | 一种基于路径反馈的Javascript引擎模糊测试方法和装置 |
CN110399300A (zh) * | 2019-07-22 | 2019-11-01 | 南京大学 | 一种基于动态类型感知的Python软件模糊测试方法 |
CN112104525A (zh) * | 2020-09-18 | 2020-12-18 | 西安科技大学 | 基于序列生成对抗网络的dnp3协议模糊测试方法 |
CN112416806A (zh) * | 2020-12-09 | 2021-02-26 | 西北大学 | 一种基于标准文档分析的js引擎模糊测试方法 |
Non-Patent Citations (3)
Title |
---|
Javascript Malware Detection Using A High-Level Fuzzy Petri Net;Victor R. L. Shen;《2018 International Conference on Machine Learning and Cybernetics (ICMLC)》;20181111;全文 * |
一种动静结合的高代码覆盖率模糊测试方法;韩等;《信息安全研究》;20160805(第08期);全文 * |
语义感知的JavaScript引擎模糊测试技术研究;王允超;《信息工程大学学报》;20200630;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN113157565A (zh) | 2021-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Russell et al. | Automated vulnerability detection in source code using deep representation learning | |
Tufano et al. | On learning meaningful code changes via neural machine translation | |
Cummins et al. | Compiler fuzzing through deep learning | |
CN109144882B (zh) | 一种基于程序不变量的软件故障定位方法及装置 | |
CN102804147A (zh) | 执行abap源代码的代码检查的代码检查执行系统 | |
CN112416806B (zh) | 一种基于标准文档分析的js引擎模糊测试方法 | |
CN113157565B (zh) | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 | |
CN111459799A (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
Jebnoun et al. | The scent of deep learning code: An empirical study | |
US20090217246A1 (en) | Evaluating Software Programming Skills | |
CN109857641A (zh) | 对程序源文件进行缺陷检测的方法及装置 | |
Fry et al. | Clustering static analysis defect reports to reduce maintenance costs | |
Marmolejos et al. | On the use of textual feature extraction techniques to support the automated detection of refactoring documentation | |
CN117555720B (zh) | 代码修复方法、装置、设备及介质 | |
CN114385491A (zh) | 一种基于深度学习的js转译器缺陷检测方法 | |
US11550703B2 (en) | Test package analyzer | |
CN112131122B (zh) | 一种源代码缺陷检测工具误报评估方法及装置 | |
CN112131120B (zh) | 一种源代码缺陷检测方法及装置 | |
CN113238937A (zh) | 一种基于代码精简与误报过滤的编译器模糊测试方法 | |
US11599814B2 (en) | Automated exception featurization and search | |
CN109032946B (zh) | 一种测试方法和装置、计算机可读存储介质 | |
Hoq et al. | Detecting chatgpt-generated code in a cs1 course | |
CN112464237A (zh) | 一种静态代码安全诊断方法及装置 | |
CN113778454A (zh) | 一种人工智能实验平台的自动评测方法及系统 | |
Nguyen et al. | Recommendation of exception handling code in mobile app development |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |