[发明专利]基于静态分析和动态运行的Web应用JavaScript代码原子性违反检测在审
申请号: | 201510626506.8 | 申请日: | 2015-09-25 |
公开(公告)号: | CN105095092A | 公开(公告)日: | 2015-11-25 |
发明(设计)人: | 许蕾;王德智;李言辉;徐宝文 | 申请(专利权)人: | 南京大学 |
主分类号: | G06F11/36 | 分类号: | G06F11/36 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 210023 *** | 国省代码: | 江苏;32 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 静态 分析 动态 运行 web 应用 javascript 代码 原子 违反 检测 | ||
技术领域
本发明属于计算机技术领域,尤其是软件工程技术领域。本发明提供了一种基于静态分析和动态运行的、用于检测Web应用中JavaScript代码原子性违反的方法,能够保证Web应用的质量并提升性能。
背景技术
Web应用的飞速发展得益于服务器端语言(如PHP)和客户端语言(如JavaScript)的强大支撑。相比于传统笨重的JavaWeb开发,如今的Web开发更多使用轻量级Web框架,对于前端脚本语言JavaScript而言,既是机遇,也是挑战。
JavaScript(以下简称JS)是一个基于事件的脚本语言,其闭包和异步的特性是支持快速Web开发的利器。
闭包是指外部有权访问另一个函数作用域中变量的函数。对于一般的程序设计语言,函数内部可直接访问的都是定义在外部的全局变量,而定义在函数内部的局部变量只能由该函数使用。JS通过闭包的机制允许外部函数调用一个定义在函数内部的局部变量,其调用方式是:通过在函数中声明另一个返回函数,返回需要被调用的变量。闭包的使用可以保证单个作用域的独立使用,但也会造成异步调用中变量使用不明确的问题。
异步调用是指多个函数的执行并不存在同步顺序的关联,每个函数在接收到参数被调用时都立即执行,且并不妨碍其它函数的调用执行,函数执行完,通过回调函数即可返回结果,不需要考虑正在执行的其它函数。JS异步调用中最普遍、最有效的应用是Ajax(AsynchronousJavaScriptandXML,异步JS和XML)。Ajax允许客户端异步地发送请求,而不会阻塞浏览器端连续地接收服务器的回应。通过后台和数据库进行数据交换,Ajax可以使网页实现异步更新,这意味着用户可以在不重新加载整个网页的情况下,对网页的局部内容进行更新;同时在和后台进行数据交换时,浏览器不必处于阻塞状态,用户可以自由地选择其它的操作。
异步调用也存在一些问题,比如不确定性:Ajax中执行回调函数只依据接收到的回应消息,一旦调用过程中丢失了回应消息,回调函数就会一直处在挂起的状态,整个服务都将中断。这不仅会影响客户前端的体验,而且可能产生额外的负载,甚至造成系统的瘫痪。因此,这种机制虽然能使前端用户有一个平滑的体验,但也会由于不可预料的网络延迟产生事故。
异步调用的问题,从前端用户的角度上可以看作是原子性违反的问题:用户通常默认将一个含异步调用的操作当作是一个连续的事件交互,而当多个异步调用发生冲突,返回给用户的信息便会发生错位,造成用户不明确具体返回信息和请求操作的对应关系。Web应用原子性违反指:当一个操作请求发生在两个本应该连续执行的请求和回应之间时,使操作的结果与操作顺序出现不确定的对应关系,进而产生预期外的竞态条件,对用户或系统造成显式的影响。例如:Ajax请求的发送和服务器端的回应之间是可以调用其它函数的,但当一个Ajax请求中涉及的元素(变量或函数)被其它异步调用使用时,原则上是不允许的。由于前端用户的请求是基于事件的,事件间可并行执行,但需要避免原子性违反,即不能同时调用同一个元素,以免产生冲突、造成混乱。
传统多线程程序原子性违反的检测方法是观察代码与内存访问中的同步操作,在有可能发生原子性违反的地方设置观察点,然后通过静态分析或者动态运行技术来检测是否发生了原子性违反。静态和动态分析是常用的程序分析技术:静态分析在不执行程序的情况下对源代码进行评估;动态方法则依据执行程序所产生的运行轨迹对程序进行分析。静态分析能够保证对代码的覆盖,但由于没有实际执行数据的参照,会产生误报;动态的优势在于分析的准确性,但缺乏对执行路径的覆盖,有漏报的隐患。
单独的静态或动态方法在JS上实施起来有一定的困难:一方面JS是一个动态语言,允许程序运行过程中声明变量和函数,这使得不能仅仅由代码得到相应的调用过程,并且JS是基于事件的,事件的调用并不仅仅依托于定义的函数,还涉及HTML页面中的元素,单静态分析是不够的;另一方面是JS的闭包特性,它对内存访问的观察提出了挑战,因为大量闭包的使用使得大量局部函数停驻在内存中,动态分析既需要对内存访问的操作投入更多的精力,得不偿失,又缺乏对代码的覆盖。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于南京大学,未经南京大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201510626506.8/2.html,转载请声明来源钻瓜专利网。