System.ArgumentOutOfRangeException: 索引和长度必须引用该字符串内的位置。 参数名: length 在 System.String.Substring(Int32 startIndex, Int32 length) 在 zhuanliShow.Bind() 一种检测js代码死循环的方法、装置及应用制造方法及图纸_技高网

一种检测js代码死循环的方法、装置及应用制造方法及图纸

技术编号:40103156 阅读:9 留言:0更新日期:2024-01-23 18:00
本申请提出了一种检测js代码死循环的方法、装置及应用,包括以下步骤:将JS代码字符串转换为待检测ast语法树,获取第一主函数体;判断每一第一主函数体中节点类型为ExpressionStatement的节点的调用情况确认是否存在死循环;以遍历的方式获取每一第一主函数体中的第一子函数体,判断第一子函数体中的节点类型为ExpressionStatement的节点的调用情况,确认第一主函数体中是否存在代码死循环;获取死循环在代码中的位置并将其输出。本方案可以通过构建ast语法树进行静态分析并在编码阶段精准的定位到代码中存在的死循环问题。

【技术实现步骤摘要】

本申请涉及web领域,特别是涉及一种检测js代码死循环的方法、装置及应用


技术介绍

1、javascript中的死循环(infinite loop)是指一个循环结构(通常是while或for循环)无法正常终止,导致程序永远不会停止执行。这通常是由于循环条件永远为真或由于没有适当的终止条件而导致的,死循环可能是编程错误的结果,也可能是故意创建的,以执行某些特定的任务,例如在服务器端保证某个服务运行,但是不管是何种类型的死循环,如果没有得到适当的管理则很容易导致程序或系统崩溃。

2、在前端开发的过程中,死循环往往是一些隐性的bug,这种bug不容易排查且危险程度高,现有技术只有在测试阶段或实际应用过程中才会被发现,在测试阶段或实际应用过程中发现并交由技术人员的bug会耽误大量时间,所以亟需一种可以在代码编码阶段就可以检测定位死循环问题的方法。


技术实现思路

1、本申请实施例提供了一种检测js代码死循环的方法、装置及应用,将js代码字符串转换为待检测ast语法树并在语法树中对代码进行静态分析从而让开发人员能够在代码编码阶段精准的定位到代码中存在的死循环问题,让排查死循环问题变得简单、高效、精准。

2、第一方面,本申请实施例提供了一种检测js代码死循环的方法,所述方法包括:

3、获取js代码字符串,将所述js代码字符串转换为待检测ast语法树,以遍历的方式获取所述待检测ast语法树中的节点类型为functiondeclaration的函数体以及节点类型为variabledeclarator的函数体作为第一主函数体;

4、判断每一第一主函数体中节点类型为expressionstatement的节点的调用情况,若第一主函数体中的节点直接调用了所属的第一主函数体且没有设置终止条件,则认为第一主函数体中存在代码死循环;

5、以遍历的方式获取每一第一主函数体中的第一子函数体,所述第一子函数体为定义在第一主函数体内的函数体,判断第一子函数体中的节点类型为expressionstatement的节点的调用情况,若第一子函数体中的节点直接调用了所属的第一主函数体且无终止条件,且第一主函数体中的节点又直接调用了第一子函数体且无终止条件,则认为第一主函数体中存在代码死循环;

6、获取死循环在代码中的位置并将其输出。

7、第二方面,本申请实施例提供了一种检测js代码死循环的装置,包括:

8、获取模块:获取js代码字符串,将所述js代码字符串转换为待检测ast语法树,以遍历的方式获取所述待检测ast语法树中的节点类型为functiondeclaration的函数体以及节点类型为variabledeclarator的函数体作为第一主函数体;

9、第一判断模块:判断每一第一主函数体中节点类型为expressionstatement的节点的调用情况,若第一主函数体中的节点直接调用了所属的第一主函数体且没有设置终止条件,则认为第一主函数体中存在代码死循环;

10、第二判断模块:以遍历的方式获取每一第一主函数体中的第一子函数体,所述第一子函数体为定义在第一主函数体内的函数体,判断第一子函数体中的节点类型为expressionstatement的节点的调用情况,若第一子函数体中的节点直接调用了所属的第一主函数体且无终止条件,且第一主函数体中的节点又直接调用了第一子函数体且无终止条件,则认为第一主函数体中存在代码死循环;

11、输出模块:获取死循环在代码中的位置并将其输出。

12、第三方面,本申请实施例提供了一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行一种检测js代码死循环的方法。

13、第四方面,本申请实施例提供了一种可读存储介质,所述可读存储介质中存储有计算机程序,所述计算机程序包括用于控制过程以执行过程的程序代码,所述过程包括一种检测js代码死循环的方法。

14、本专利技术的主要贡献和创新点如下:

15、本申请实施例通过将读取到的js字符串转换为ast语法树的形式进行静态分析,让开发人员能够在代码编码阶段精准的定位到代码中存在的死循环问题;本方案通过设置遍历条件对ast语法树进行遍历,找到可能存在死循环的函数体,再对可能存在死循环的函数体中的调用情况进行进一步的判断从而精准的排查js代码字符串中的死循环。

16、本申请的一个或多个实施例的细节在以下附图和描述中提出,以使本申请的其他特征、目的和优点更加简明易懂。

本文档来自技高网...

【技术保护点】

1.一种检测js代码死循环的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,在“获取JS代码字符串”步骤中,加载主入口代码程序并读取主入口代码,将所述主入口代码转换为主入口ast语法树,获取主入口ast语法树中ImportDeclaration节点的值为.js的文件作为js文件代码,读取js文件代码得到JS代码字符串。

3.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,当第一主函数体的节点类型为FunctionDeclaration时,遍历得到第一主函数体中所有节点类型为ExpressionStatement的节点,将第一主函数体中节点类型为ExpressionStatement的节点的expression.callee.name等于第一主函数体的节点作为第一直接调用节点,若第一直接调用节点之前不存在终止条件节点则认为无终止条件,其中,所述直接调用节点为第一主函数体中直接调用了所属的第一主函数体的节点,所述终止条件节点的类型等于BlockStatement。

4.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,当第一主函数体的节点类型为VariableDeclarator时进一步判断该节点的init.type属性,当节点类型为VariableDeclarator的第一主函数体的init.type属性为ArrowFunctionExpression时,遍历得到第一主函数体中所有节点类型为ExpressionStatement的节点,将第一主函数体中节点类型为ExpressionStatement的节点的expression.callee.name等于第一主函数体的节点作为第一直接调用节点,若第一直接调用节点之前不存在终止条件节点则认为无终止条件,其中,所述第一直接调用节点为第一主函数体中直接调用了所属的第一主函数体的节点,所述终止条件节点的类型等于BlockStatement。

5.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,在“若第一子函数体中的节点直接调用了所属的第一主函数体且无终止条件,且第一主函数体中的节点直接调用了第一子函数体且无终止条件”步骤中,遍历得到第一子函数体中所有节点类型为ExpressionStatement的节点,将第一子函数体中节点类型为ExpressionStatement的节点的expression.callee.name等于第一主函数体的节点作为第二直接调用节点,若第二直接调用节点之前不存在终止条件节点则认为无终止条件,遍历得到第一主函数体中所有节点类型为ExpressionStatement的节点,将第一主函数体中节点类型为ExpressionStatement的节点的expression.callee.name等于第一子函数体的节点作为第三直接调用节点,若第三直接调用节点之前不存在终止条件节点则认为无终止条件,其中,第二直接调用节点为第一子函数体中直接调用了所属的第一主函数体的节点,第三直接调用节点为第一主函数体中直接调用了下属的第一子函数体的节点,所述终止条件节点的类型等于BlockStatement。

6.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,所述第一子函数体的的节点类型为FunctionDeclaration或VariableDeclarator,当第一子函数体的节点类型为VariableDeclarator时,所述第一子函数体的init.type等于ArrowFunctionExpression。

7.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,在“获取死循环在JS代码字符串中的位置信息并将其输出”步骤中,获取死循环代码在JS代码字符串中的字符信息,所述字符信息为JS代码字符串从开始到死循环代码的字符数量,定义正则表达式,所述正则表达式用来查找字符信息中的换行符以及回车符,根据换行符以及回车符的总数量和最后一个换行符/回车符出现的位置获取死循环在代码中的位置信息。

8.一种检测js代码死循环的装置,其特征在于,包括:

9.一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行权利要求1-7任一所述的一种检测js代码死循环的方法。

10.一种可读存储介质,其特征在于,所述可读存储介质中存储有计算机程序,所述计算机程序包括用于控制过程以执行过程的程序代码,所述过程包括权利要求1-7任一所述的一种检测js代码死循环的方法。

...

【技术特征摘要】

1.一种检测js代码死循环的方法,其特征在于,包括以下步骤:

2.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,在“获取js代码字符串”步骤中,加载主入口代码程序并读取主入口代码,将所述主入口代码转换为主入口ast语法树,获取主入口ast语法树中importdeclaration节点的值为.js的文件作为js文件代码,读取js文件代码得到js代码字符串。

3.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,当第一主函数体的节点类型为functiondeclaration时,遍历得到第一主函数体中所有节点类型为expressionstatement的节点,将第一主函数体中节点类型为expressionstatement的节点的expression.callee.name等于第一主函数体的节点作为第一直接调用节点,若第一直接调用节点之前不存在终止条件节点则认为无终止条件,其中,所述直接调用节点为第一主函数体中直接调用了所属的第一主函数体的节点,所述终止条件节点的类型等于blockstatement。

4.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,当第一主函数体的节点类型为variabledeclarator时进一步判断该节点的init.type属性,当节点类型为variabledeclarator的第一主函数体的init.type属性为arrowfunctionexpression时,遍历得到第一主函数体中所有节点类型为expressionstatement的节点,将第一主函数体中节点类型为expressionstatement的节点的expression.callee.name等于第一主函数体的节点作为第一直接调用节点,若第一直接调用节点之前不存在终止条件节点则认为无终止条件,其中,所述第一直接调用节点为第一主函数体中直接调用了所属的第一主函数体的节点,所述终止条件节点的类型等于blockstatement。

5.根据权利要求1所述的一种检测js代码死循环的方法,其特征在于,在“若第一子函数体中的节点直接调用了所属的第一主函数体且无终止条件,且第一主函数体中的节点直接调用了第一子函数体且无终止条件”步骤中,遍历得到第一子函数体中所有节点类型为...

【专利技术属性】
技术研发人员:李圣权严金刚王康平彭大蒙谢淼烽
申请(专利权)人:城云科技中国有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1