代码检测方法及装置制造方法及图纸

技术编号:13124615 阅读:282 留言:0更新日期:2016-04-06 12:17
本申请提供一种代码检测方法及装置。方法包括:对待检测代码进行动态分析,以获得第一函数调用图,第一函数调用图中的节点表示待检测代码包含的函数,第一函数调用图中的有向边表示有向边连接的两个节点所表示的函数之间的调用关系;根据第一函数调用图,检测待检测代码中是否存在调用环路。本申请可以从整体对代码进行检测,提高检测代码检测稳定性的准确度。

【技术实现步骤摘要】
【专利说明】
本申请涉及计算机
,尤其涉及一种代码检测方法及装置。【
技术介绍
】代码是指程序员利用开发工具所支持的语言编写出来的源文件,是一组由字符、符号或信号码元等以离散形式表示信息的明确的规则体系。随着编程技术的发展,大多数功能都可以通过代码实现。在具体实现上,代码会包括一些函数,并通过函数之间的相互调用完成所要实现的功能。在实际应用中,为确保代码的稳定性和可用性等,在开发出代码之后,通常还需要对其进行各种检测,如静态代码检测。现有技术存在以代码中的函数为对象,验证每个函数是否存在循环调用语句的静态检测方法。例如,该方法会检测函数中是否存在类似while (true)这样的初始化死循环语句,或者检测是否存在类似for (;;)这样的无限循环语句等,来判断函数是否存在错误。由于现有这种代码检测方法仅局限于代码包含的函数内,因此无法从整体角度对代码进行检测,检测准确度较低。【
技术实现思路
】本申请的多个方面提供一种代码检测方法及装置,用以从整体对代码进行检测,提高代码检测的准确度。本申请的一方面,提供一种代码检测方法,包括:对待检测代码进行动态分析,以获得第一函数调用图,所述第一函数调用图中的节点表示所述待检测代码包含的函数,所述第一函数调用图中的有向边表示所述有向边连接的两个节点所表示的函数之间的调用关系;根据所述第一函数调用图,检测所述待检测代码中是否存在调用环路。本申请的另一方面,提供一种代码检测装置,包括:分析模块,用于对待检测代码进行动态分析,以获得第一函数调用图,所述第一函数调用图中的节点表示所述待检测代码包含的函数,所述第一函数调用图中的有向边表示所述有向边连接的两个节点所表示的函数之间的调用关系;检测模块,用于根据所述第一函数调用图,检测所述待检测代码中是否存在的调用环路。在本申请中,通过对代码进行动态分析,获得可以表示代码包含的函数以及函数之间调用关系的第一函数调用图,根据第一函数调用图,检测代码中是否存在调用环路。与现有函数内这种局部检测方式相比,本申请是从全局角度发现代码包含的函数之间是否存在调用环路,而不再局限于函数内的检测,函数之间的调用环路可能导致代码在运行时出现死循环,会严重影响代码的整体性能,因此本申请通过检测代码中是否存在调用环路达到检测代码的目的,可以极大的提高代码检测的准确度。【【附图说明】】为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。图1为本申请一实施例提供的代码检测方法的流程示意图;图2为本申请一实施例提供的第一函数调用图的结构示意图;图3为本申请一实施例提供的步骤101的一种实施方式的流程示意图;图4为本申请一实施例提供的第二函数调用图的结构示意图;图5为本申请另一实施例提供的第一函数调用图的结构示意图;图6为本申请一实施例提供的步骤102的一种实施方式的流程示意图;图7为本申请一实施例提供的第三函数调用图的结构示意图;图8为本申请一实施例提供的代码检测装置的结构示意图。【【具体实施方式】】为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。图1为本申请一实施例提供的代码检测方法的流程示意图。如图1所示,该方法包括:101、对待检测代码进行动态分析,以获得第一函数调用图,其中,第一函数调用图中的节点表示待检测代码包含的函数,第一函数调用图中的有向边表示该有向边连接的两个节点所表示的函数之间的调用关系。102、根据上述第一函数调用图,检测待检测代码中是否存在调用环路。本实施例的执行主体可以是代码检测装置,该装置可以是任何具有一定处理能力的设备,例如可以是用户终端、服务器或者代码检测专用设备等。本实施例中待检测代码可以是使用任何编程语言编写的代码,也可以是实现任何功能的代码。编程语目可以是java、C、C++等。对有些代码而言,通过静态分析无法准确获取这些代码所包含的函数之间的调用关系。例如,对于使用spring(它是一个轻量级的J2EE框架,关于spring具体可参见现有技术)进行接口编程、切面编程的代码,静态分析无法准确得到函数之间的调用关系。又例如,对于在运行时存在类型识别的代码来说,静态分析也无法准确获得函数之间的调用关系。例如,在运行时存在类型识别的代码可以是使用了 C语言的Void*(Void是C语言中的一个类型,void*可指向任何数据类型,这会妨碍静态分析的准确性)、C++语言的通过运行时类型信息(Run-Time Type Informat1n, RTTI)或者java语言中的基类等的代码。举例说明,假设一种采用接口编程的代码包括:接口函数Al、Bl、C1和D1,以及各个接口函数对应的接口实体函数A2、B2、C2和D2 ;则通过静态分析可以得到代码包含的函数之间的调用关系,包括接口实体函数A2调用接口函数B1,接口实体函数B2调用接口函数C1、接口实体函数C2调用接口函数D1,接口实体函数D2调用接口函数A1。但在实际运行中,当运行到一个接口实体函数调用另一接口函数时,该接口实体函数会自动调用另一接口函数对应的接口实体函数,即该代码实际上还包含以下函数调用关系:接口实体函数A2调用接口实体函数B2,接口实体函数B2调用接口实体函数C2、接口实体函数C2调用接口实体函数D2,接口实体函数D2调用接口实体函数A2,这些函数调用关系无法通过静态分析获得。基于上述,本实施例在检测代码过程中,代码检测装置对代码进行动态分析,以获得可以表示代码包含的函数和函数之间的调用关系的函数调用图。为便于区分和描述,将这里的函数调用图称为第一函数调用图,这里的“第一”既不是个数的限定,也不是先后顺序的限定。其中,第一函数调用图包括节点和有向边,第一函数调用图中的节点表示待检测代码包含的函数,即一个节点对应一个函数,节点的数目与待检测代码包含的函数的个数相同;第一函数调用图中的有向边表示该有向边所连接的两个节点所表示的两个函数之间的调用关系,如果有向边从一个节点指向另一个节点,表示该节点所表示的函数调用另一个节点所表示的函数。如图2所示,为本实施例给出的一种第一函数调用图的结构示意图,图2中的小圆圈表示节点,两个小圆圈之间的有向箭头表示有向边。图2中的加粗箭头展示了待检测代码中存在的调用环路。值得说明的是,待检测代码可能位于至少一个代码文件中,代码检测装置可以逐个扫描代码文件,获取各个代码文件中的代码并进行动态分析。在一可选实施方式中,上述步骤101的一种【具体实施方式】为:运行待检测代码,以获得待检测代码在运行状态时所包含的函数和函数之间的调用关系,并根据待检测代码在运行状态时所包含的函数和函数之间的调用关系生成第一函数调用图。在对待检测代码进行动态分析,以获取第一函数调用图时,可采用程序插本文档来自技高网...
代码检测方法及装置

【技术保护点】
一种代码检测方法,其特征在于,包括:对待检测代码进行动态分析,以获得第一函数调用图,所述第一函数调用图中的节点表示所述待检测代码包含的函数,所述第一函数调用图中的有向边表示所述有向边连接的两个节点所表示的函数之间的调用关系;根据所述第一函数调用图,检测所述待检测代码中是否存在调用环路。

【技术特征摘要】

【专利技术属性】
技术研发人员:徐会卿张翔
申请(专利权)人:阿里巴巴集团控股有限公司
类型:发明
国别省市:开曼群岛;KY

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

1