基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测的制作方法

文档序号:9375480阅读:447来源:国知局
基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测的制作方法
【技术领域】
[0001] 本发明属于计算机技术领域,尤其是软件工程技术领域。本发明提供了一种基于 静态分析和动态运行的、用于检测Web应用中JavaScript代码原子性违反的方法,能够保 证Web应用的质量并提升性能。
【背景技术】
[0002] Web应用的飞速发展得益于服务器端语言(如PHP)和客户端语言(如 JavaScript)的强大支撑。相比于传统笨重的Java Web开发,如今的Web开发更多使用轻 量级Web框架,对于前端脚本语言JavaScript而言,既是机遇,也是挑战。
[0003] JavaScript (以下简称JS)是一个基于事件的脚本语言,其闭包和异步的特性是 支持快速Web开发的利器。
[0004] 闭包是指外部有权访问另一个函数作用域中变量的函数。对于一般的程序设计语 言,函数内部可直接访问的都是定义在外部的全局变量,而定义在函数内部的局部变量只 能由该函数使用。JS通过闭包的机制允许外部函数调用一个定义在函数内部的局部变量, 其调用方式是:通过在函数中声明另一个返回函数,返回需要被调用的变量。闭包的使用可 以保证单个作用域的独立使用,但也会造成异步调用中变量使用不明确的问题。
[0005] 异步调用是指多个函数的执行并不存在同步顺序的关联,每个函数在接收到参 数被调用时都立即执行,且并不妨碍其它函数的调用执行,函数执行完,通过回调函数即 可返回结果,不需要考虑正在执行的其它函数。JS异步调用中最普遍、最有效的应用是 Ajax (Asynchronous JavaScript and XML,异步 JS 和 XML)。Ajax 允许客户端异步地发送 请求,而不会阻塞浏览器端连续地接收服务器的回应。通过后台和数据库进行数据交换, Ajax可以使网页实现异步更新,这意味着用户可以在不重新加载整个网页的情况下,对网 页的局部内容进行更新;同时在和后台进行数据交换时,浏览器不必处于阻塞状态,用户可 以自由地选择其它的操作。
[0006] 异步调用也存在一些问题,比如不确定性:Ajax中执行回调函数只依据接收到的 回应消息,一旦调用过程中丢失了回应消息,回调函数就会一直处在挂起的状态,整个服务 都将中断。这不仅会影响客户前端的体验,而且可能产生额外的负载,甚至造成系统的瘫 痪。因此,这种机制虽然能使前端用户有一个平滑的体验,但也会由于不可预料的网络延迟 产生事故。
[0007] 异步调用的问题,从前端用户的角度上可以看作是原子性违反的问题:用户通常 默认将一个含异步调用的操作当作是一个连续的事件交互,而当多个异步调用发生冲突, 返回给用户的信息便会发生错位,造成用户不明确具体返回信息和请求操作的对应关系。 Web应用原子性违反指:当一个操作请求发生在两个本应该连续执行的请求和回应之间 时,使操作的结果与操作顺序出现不确定的对应关系,进而产生预期外的竞态条件,对用户 或系统造成显式的影响。例如=Ajax请求的发送和服务器端的回应之间是可以调用其它函 数的,但当一个Ajax请求中涉及的元素(变量或函数)被其它异步调用使用时,原则上是 不允许的。由于前端用户的请求是基于事件的,事件间可并行执行,但需要避免原子性违 反,即不能同时调用同一个元素,以免产生冲突、造成混乱。
[0008] 传统多线程程序原子性违反的检测方法是观察代码与内存访问中的同步操作,在 有可能发生原子性违反的地方设置观察点,然后通过静态分析或者动态运行技术来检测是 否发生了原子性违反。静态和动态分析是常用的程序分析技术:静态分析在不执行程序的 情况下对源代码进行评估;动态方法则依据执行程序所产生的运行轨迹对程序进行分析。 静态分析能够保证对代码的覆盖,但由于没有实际执行数据的参照,会产生误报;动态的优 势在于分析的准确性,但缺乏对执行路径的覆盖,有漏报的隐患。
[0009] 单独的静态或动态方法在JS上实施起来有一定的困难:一方面JS是一个动态语 言,允许程序运行过程中声明变量和函数,这使得不能仅仅由代码得到相应的调用过程,并 且JS是基于事件的,事件的调用并不仅仅依托于定义的函数,还涉及HTML页面中的元素, 单静态分析是不够的;另一方面是JS的闭包特性,它对内存访问的观察提出了挑战,因为 大量闭包的使用使得大量局部函数停驻在内存中,动态分析既需要对内存访问的操作投入 更多的精力,得不偿失,又缺乏对代码的覆盖。
[0010] 为此,我们提出一种基于静态分析和动态运行的原子性违反检测方法:这是一种 结合静态分析的插粧记录机制,先通过静态分析JS代码,获取JS中涉及到异步调用的函数 和方法,保证代码上的覆盖;跨语言平台的动态插粧记录机制,在异步调用函数中设置探测 点,不仅能得到JS程序中的元素,还能记录HTML代码中的元素,提高检测潜在原子性违反 的准确率;根据Web应用请求到回应整个过程中涉及的元素,设计原子性违反判定规则,进 而开展有效的原子性违反检测。

【发明内容】

[0011] 在现有工作的基础上,本发明要解决的问题是:克服Web应用请求过程中存在的 JS事件不确定性、请求的跨端性以及同类型请求中共享变量等问题,检测可能存在的原子 性违反,从而有效保障Web应用的质量。
[0012] 本发明的技术方案为针对Web应用中JS代码原子性违反检测,其特征包括:页面 和事件内部变量及函数的记录;抽象化原子性操作;设计原子性违反的判定规则;通过插 粧获取Web应用运行轨迹,使用其中记录的元素得出具体的判定条件,生成动态分析脚本, 从而有效检测原子性违反。
[0013] 本发明具体包括以下步骤:
[0014] 1)静态分析JS代码,记录涉及异步调用的元素类型;
[0015] 2)异步调用操作抽象化,划分模块,设计原子性违反的判定规则;
[0016] 3) JS代码插粧,设置函数探测点;
[0017] 4)动态运行Web应用,获取运行轨迹,生成判定条件,;
[0018] 5)结合运行轨迹中的记录元素,编写分析脚本。
[0019] 步骤1)根据已有的MVC(Model View Controller,模型视图控制器)体系和更具 针对性的JS前端框架请求事件机制,Web应用整个异步调用请求和回应的过程包括:事件 柄登记、HTML元素选中、异步调用参数传递、事件请求调用、服务器端操作、回调函数中结果 的返回、浏览器端结果的接收、页面中最终效果的展示等。根据每个阶段的内容,记录异步 调用操作涉及到的元素,包括函数名、方法名、调用中传递的参数及回调函数中的语句,以 便后续的分析和处理。
[0020] 本发明先采用静态方法分析Web应用中JS代码,记录异步调用操作涉及到的函 数、方法,这样不仅能提高代码覆盖率,而且能提高检测的准确率。
[0021] 步骤2)Web应用中原子性违反的检测,既需要考虑到用户请求到服务回应流程的 完整性,又要分别处理请求中各阶段的不同组成成分。由于页面和异步调用处理使用的程 序语言不同,页面采用HTML和CSS语言,异步调用通常使用JS语言,语言间交互的不确定 性使得制定一个统一的符合所有语言特性的原子性违反判定规则成为必需。
[0022] 实际的开发经验表明,模块中原子性操作大多处于函数间的调用,而通常函数间 的交互都会涉及到JS操作。因此,可根据JS代码精确得出原子性操作调用图,依据Web应 用的缺陷模式,将原子性违反的判定条件细化到具体的元素中。
[0023] 多线程语言Java的静态分析主要通过WALA (T. J. Watson Libraries forAnalysis)工具实现,WALA是IBM公司T. J. Watson研究中心的一个研究项目,主要功能 是对Java源代码进行静态分析,从而获得程序数据流图和控制流图,也可以进行指针分析 和函数调用图的构造;可对Java字节码进行分析,提供基于上下文敏感的切片技术。
[0024] JS_WALA是WALA在JS上的实现工具,先将JS代码转换成一个标准化形式,再从中 提取程序控制流图。根据Web应用的整体流程情况,我们利用JS_WALA工具生成一个应用的 异步调用关系图Graph (Nodes,Edges),其中节点Nodes表示操作中具体的元素,比如:HTML 中的标签、异步调用中JS函数,边Edges代表Nodes间异步调用数据或控制流关系。然后, 将关系图划分为各个关系块图,每个图中Nodes和Edges定义为一个原子性操作模式,每个 模式都有其对应原子性违反的判定规则。在后期的原子性违反检测中,使用对应的模式,匹 配出一个应用的疑似含有原子性违反的代码片段或者程序片段。
[0025] Web应用流程中原子性违反的检测就是:判定运行轨迹中元素间操作是否满足各 对应模式的规则。主体JS模块中函数组成部分包括:
[0026] (1)函数请求参数:函数接口中的请求参数主体是在浏览器端与事件柄handle绑 定的一个事件源htmlSource。
[0027] (2)
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1