CN116069671B - 跨语言软件源代码的综合依赖关系分析 - Google Patents

跨语言软件源代码的综合依赖关系分析 Download PDF

Info

Publication number
CN116069671B
CN116069671B CN202310268033.3A CN202310268033A CN116069671B CN 116069671 B CN116069671 B CN 116069671B CN 202310268033 A CN202310268033 A CN 202310268033A CN 116069671 B CN116069671 B CN 116069671B
Authority
CN
China
Prior art keywords
code
information
node
dependency
flow chart
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
Application number
CN202310268033.3A
Other languages
English (en)
Other versions
CN116069671A (zh
Inventor
李洪
胡鹤轩
张鹏程
谭国平
胡强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing Utesting Info Technology Co ltd
Original Assignee
Nanjing Utesting Info Technology Co ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Nanjing Utesting Info Technology Co ltd filed Critical Nanjing Utesting Info Technology Co ltd
Priority to CN202310268033.3A priority Critical patent/CN116069671B/zh
Publication of CN116069671A publication Critical patent/CN116069671A/zh
Application granted granted Critical
Publication of CN116069671B publication Critical patent/CN116069671B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明提供一种跨语言软件源代码的综合依赖关系分析,包括在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息;若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图;基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系。本发明的方法能够获取多个层面的依赖关系,从而为架构分析,质量保障提供数据支撑。

Description

跨语言软件源代码的综合依赖关系分析
技术领域
本发明涉及软件开发技术领域,尤其涉及一种跨语言软件源代码的综合依赖关系分析。
背景技术
现有跨语言代码依赖关系检测主要包括基于中间特征的检测方法,基于中间特征的方法将不同语言编写的代码转换为某一种中间特征,如中间语言或基于树的中间表示,然后基于中间表示直接度量两段代码的相似度。这类方法忽略了代码的结构特征,且对编译器的依赖性较强,并且计算代价较高。
发明内容
本发明实施例的第一方面,
提供一种跨语言软件源代码的综合依赖关系分析方法,包括:
在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,其中,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边;
基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系。
在一种可选的实施方式中,
所述在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息包括:
在所述目标代码文件的每个函数的每条读写指令均进行插桩,获取所述目标代码文件的运行代码的访问足迹信息,其中,所述访问足迹信息包括所述运行代码访问地址所处的文件名、文件行号、变量名称、变量长度以及本次读写所发生的迭代次数中至少一种信息;
将所述访问足迹信息转换成字符串信息,通过向前遍历指令,在预设运行数据库中获取与所述字符串信息中的关键词对应的读操作信息和写操作信息。
在一种可选的实施方式中,
所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图包括:
将所述变量信息转化为所述代码流程图的节点信息,并判断所述变量信息在所述类信息中是否首次出现,若是,则将所述变量信息作为父节点,若否,则根据所述控制逻辑信息将所述变量信息连接至对应的父节点,将所述代码流程图的节点信息存储在节点队列空间中;
将所述控制逻辑信息转化为所述代码流程图的连接边信息,并基于对应节点间的控制逻辑连接对应的节点,生成初始连通图;
基于预设节点匹配函数,遍历所述节点队列空间中所有节点,将所述节点队列空间中的每一个节点与所述初始连通图中的任一节点进行匹配,若匹配,则保留所述初始连通图中匹配的节点,若不匹配,则将不匹配的节点从所述初始连通图中移除,得到所述代码流程图。
在一种可选的实施方式中,
所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图之后,所述方法还包括:
判断所述代码流程图中相邻节点是否存在逻辑关系,其中,所述逻辑关系包括数据依赖关系和控制依赖关系中至少一种;
若存在逻辑关系,则保持相邻节点在所述代码流程图中的位置,若不存在逻辑关系,则将所述相邻节点进行合并;
和/或
确定所述代码流程图中连接边构成的环路,并将涉及所述环路最多类型的连接边进行删除。
在一种可选的实施方式中,
所述基于预设的图相似度检测算法确定不同代码流程图的相似度包括:
将所述代码流程图中的节点映射为节点特征,并根据所述代码流程图中的节点类型设置节点权重,将所述代码流程图中的连接边映射为邻接矩阵;
根据所述节点特征、所述节点权重,以及所述邻接矩阵,通过最小平均贴近度算法确定不同代码流程图的相似度,其中,所述确定不同代码流程图的相似度如下公式所示:
Figure SMS_1
其中,Sim(A,B)表示不同代码流程图的相似度,A、B分别表示不同代码流程图对应的向量表示集合,v i 、v j 分别表示不同代码流程图的节点特征,E表示节点特征的维度,u i 、u j 分别表示不同代码流程图的节点特征对应的节点权重,L i 、L j 分别表示不同代码流程图中的连接边,map(.)表示邻接矩阵转换函数,f(.)表示向量转换函数。
在一种可选的实施方式中,
所述基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系包括:
根据所述代码流程图的节点引用关系,将所述代码流程图中被引用的节点作为根节点,将引用的节点作为子节点;
所述连接边根据所述控制逻辑信息的类别分为第一连接边和第二连接边,所述第一连接边用于指示所连接的两个节点之间存在数据依赖关系,所述第二连接边用于指示所连接的两个节点之间存在函数依赖关系;
将与所述根节点相连的多个所述子节点,以及连接所述根节点与所述子节点的连接边构建多个依赖调用树,将共享同一内存的依赖调用树合并为依赖调用全集,根据所述依赖调用全集的节点流向确定所述函数依赖关系,根据所述依赖调用全集的内存访问指向确定所述数据依赖关系。
本发明实施例的第二方面,
提供一种跨语言软件源代码的综合依赖关系分析系统,包括:
第一单元,用于在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
第二单元,用于若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,其中,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边;
第三单元,用于基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系。
本发明实施例的第三方面,
提供一种跨语言软件源代码的综合依赖关系分析设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为调用所述存储器存储的指令,以执行前述所述的方法。
本发明实施例的第四方面,
提供一种计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现前述所述的方法。
本发明提供一种跨语言软件源代码的综合依赖关系分析方法,在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,实现在监控读写操作的同时获取读写地址,可以实时获取目标代码文件的依赖关系,并且能够实现对依赖关系的动态追踪。
在两个不同的类信息访问同一内存时,可以基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,代码流程图能够清晰且直观地表示算法的执行流程和程序结构的图形表示,不同编程语言如果直接使用现有的转换代码为流程图的方法或工具,则会导致具有相同流程但使用不同语言编写的代码转换得到的流程图有较大差异,本发明基于变量信息和所述控制逻辑信息,使得代码流程图标准化,能够适配跨语言软件代码的可视化,并且能够比较不同代码之间的相似度。
在不同代码流程图的相似度符合预设相似度阈值的情况下,基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系,充分挖掘代码流程图中各个构成元素对于依赖关系分析的作用,并且通过节点引用关系和连接边类别,确定目标代码文件中的数据依赖关系和函数依赖关系,充分考虑代码的结构特性,且无需依赖编译器,并且能够降低计算代价。
附图说明
图1为本发明实施例跨语言软件源代码的综合依赖关系分析方法的流程示意图;
图2为本发明实施例跨语言软件源代码的综合依赖关系分析系统的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
下面以具体地实施例对本发明的技术方案进行详细说明。下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例不再赘述。
图1为本发明实施例跨语言软件源代码的综合依赖关系分析方法的流程示意图,如图1所示,所述方法包括:
S101. 在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
在浩瀚的代码世界中,有着无数的对象,跟人和人之间有社交关系一样,对象跟对象之间也避免不了接触,所谓接触,就是指一个对象要使用到另外对象的属性、方法等成员。现实生活中一个人的社交关系复杂可能并不是什么不好的事情,然而对于代码中的对象而言,复杂的"社交关系"往往是不提倡的,因为对象之间的关联性越大,意味着代码改动一处,影响的范围就会越大,而这完全不利于系统重构和后期维护。
依赖关系是在一个程序中,若事件(或动作)B发生前,若事件(或动作)A 必须发生,则称B依赖与A。依赖性是程序中语句间的偏序关系,它阐明了保持程序语义所需要的固有次序,面向对象程序类间的依赖关系主要包括两类: 一类是静态依赖关系,一类是动态依赖关系。静态依赖关系指的是整个程序代码的静态结构中反映出来的类与类之间的关系,动态依赖关系是指类在程序运行期间形成的一种依赖关系。
本发明实施例为了获取代码依赖关系,在目标代码文件中插入依赖检测代码,其中,所述依赖检测代码用于获取目标代码文件中的依赖关系,本发明实施例中,目标代码文件可以包括跨语言软件源代码对应的文件。
示例性地,依赖检测代码是对目标代码文件中每个函数的每条读写指令都进行插桩,并通过调用运行时代码进行访问足迹的收集以及依赖分析等相关操作。对于主函数,会插入初始化函数;对于其他函数,则会插入标记循环状态的初始化与维护的相关代码。
可选地,本发明实施例中数据访问信息包括读操作信息和写操作信息,其中,数据访问信息是通过记录被访问地址所处的文件名、文件行号、循环编号、变量名字、变量长度以及进行读写所发生的迭代次数等信息。
在一种可选的实施方式中,
所述在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息包括:
在所述目标代码文件的每个函数的每条读写指令均进行插桩,获取所述目标代码文件的运行代码的访问足迹信息,其中,所述访问足迹信息包括所述运行代码访问地址所处的文件名、文件行号、变量名称、变量长度以及本次读写所发生的迭代次数中至少一种信息;
将所述访问足迹信息转换成字符串信息,通过向前遍历指令,在预设运行数据库中获取与所述字符串信息中的关键词对应的读操作信息和写操作信息。
示例性地,可以在所述目标代码文件的每个函数的每条读写指令都进行插桩,并通过调用运行时代码进行访问足迹的收集以及依赖分析等相关操作。对于主函数,会插入初始化函数;对于其他函数,则会插入标记循环状态的初始化与维护的相关代码。其中,不同的插桩技术的应用可以使插桩后的代码具有良好代码覆盖率、优秀分支覆盖率以及高效调用覆盖率实现完美统一。
进一步地,记录数据访问信息的实现是通过记录被访问地址所处的文件名,文件行号,循环编号,变量名字,变量长度以及进行本次读写所发生的迭代次数等信息。
对于不能直接获取变量名的变量(数组变量),可以通过向前遍历指令,找到其第一条操作指令进而获取与源码中一致的变量名,可以将文件名行号所连接在一起构成的字符串,在运行时阶段会传递给profiling运行时库(预设运行数据库),该字符串用作查询地址信息的关键字,具有唯一性,目前不区分同一行代码对同一个地址的多次操作。
在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,实现在监控读写操作的同时获取读写地址,可以实时获取目标代码文件的依赖关系,并且能够实现对依赖关系的动态追踪。
S102. 若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图;
示例性地,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边。其中,变量信息对应的节点又进一步包括父节点和子节点,其中,父节点为所述变量信息在所述类信息中首次出现,子节点为所述变量信息在所述类信息中非首次出现。
可选地,所述数据访问信息可以包括多个类,若两个不同的类信息访问同一内存,则可以认为这两个类信息存在依赖关系。为了进一步分析两个不同的类信息的依赖关系,可以将其转换为对应的代码流程图。
其中,可以提取所述两个不同的类信息的变量信息和控制逻辑信息,其中,变量信息可以包括声明程序变量的类型和名字、变量赋值,将某一数值赋给某个变量的过程、函数调用、函数值返回等;
控制逻辑信息可以包括顺序结构,按照语句的先后顺序依次执行;循环结构,当条件成立时,重复执行某些语句;分支结构,根据条件判断是否执行相关语句中至少一种。
在一种可选的实施方式中,
所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图包括:
将所述变量信息转化为所述代码流程图的节点信息,并判断所述变量信息在所述类信息中是否首次出现,若是,则将所述变量信息作为父节点,若否,则根据所述控制逻辑信息将所述变量信息连接至对应的父节点,将所述代码流程图的节点信息存储在节点队列空间中;
将所述控制逻辑信息转化为所述代码流程图的连接边信息,并基于对应节点间的控制逻辑连接对应的节点,生成初始连通图;
基于预设节点匹配函数,遍历所述节点队列空间中所有节点,将所述节点队列空间中的每一个节点与所述初始连通图中的任一节点进行匹配,若匹配,则保留所述初始连通图中匹配的节点,若不匹配,则将不匹配的节点从所述初始连通图中移除,得到所述代码流程图。
示例性地,若变量信息是首次出现,则可以将其作为父节点,若变量信息不是首次出现,则可以认为在其之前,已经有节点出现,则可以将其作为子节点。为了能够将目标代码文件转为对应的代码流程图,则可以将所述控制逻辑信息转化为所述代码流程图的连接边信息,并基于对应节点间的控制逻辑连接对应的节点,生成初始连通图。
可选地,可以将所述代码流程图的节点信息存储在节点队列空间中,首先判断节点队列空间是否能继续提供节点进行匹配,如果节点队列空间为空,则停止匹配。从节点队列空间中获取一个节点,然后将所述节点队列空间中的每一个节点与所述初始连通图中的任一节点进行匹配,可选地,可以通过函数GetMatchedNodes实现,GetMatcheaNodes返回能够与所述初始连通图中的任一节点进行匹配的节点集合。若不匹配,则将不匹配的节点从所述初始连通图中移除,从而过滤不与初始连通图相连的节点,也即能够去除冗余代码,降低算法的时空复杂度。
在一种可选的实施方式中,
所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图之后,所述方法还包括:
判断所述代码流程图中相邻节点是否存在逻辑关系,其中,所述逻辑关系包括数据依赖关系和控制依赖关系中至少一种;
若存在逻辑关系,则保持相邻节点在所述代码流程图中的位置,若不存在逻辑关系,则将所述相邻节点进行合并;
和/或
确定所述代码流程图中连接边构成的环路,并将涉及所述环路最多类型的连接边进行删除。
在实际应用中,为了降低冗余代码对依赖关系分析的干扰,可以将相邻无依赖关系的节点进行合并,合并为组合节点,降低整体计算的复杂度。具体地,若相邻节点存在逻辑关系,则可以认为其独立存在且均能够表示一定的含义,若相邻节点不存在逻辑关系,则说明其是可以合并的,在实际代码中对于依赖关系分析而言属于冗余代码,可以将其进行合并。
可选地,若代码流程图中连接边构成环路,其中,环路用于指示连接边构成一个封闭的图形,代码流程图中的环路,因为是一个封闭图形,头尾相连的节点需要重复计算,并且会额外产生一条连接边,后续依赖关系分析时,额外增加计算的时空复杂度,因此需要消除环路。
具体地,可以删除代码流程图中最少的边,打破尽量多的环路,不仅能够有利于维持代码流程图的稳定性,还能够最大程度的降低计算的时空复杂度。可以统计代码流程图中连接边构成的环路,并且将涉及环路最多类型的连接边进行删除,例如,若涉及环路最多类型的连接边为顺序结构对应的边,则可以将其删除。
S103. 基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系。
示例性地,本发明实施例中图相似度检测算法可以用于检测两幅图之间的相似度。若不同代码流程图的相似度符合预设相似度阈值,其中,符合预设相似度阈值可以包括大于等于预设相似度阈值,预设相似度阈值可以是根据实际需要设置的,本申请实施例对此并不进行限定。需要说明的是,本申请中不同代码流程图的相似度大于等于预设相似度阈值的情况下,说明跨语言软件源代码之间存在相应的依赖关系,其中,本申请分析目标代码文件中的数据依赖关系和函数依赖关系。
在一种可选的实施方式中,
所述基于预设的图相似度检测算法确定不同代码流程图的相似度包括:
将所述代码流程图中的节点映射为节点特征,并根据所述代码流程图中的节点类型设置节点权重,将所述代码流程图中的连接边映射为邻接矩阵;
示例性地,将代码流程图的节点映射为节点特征,能够使其脱离代码流程图,更好地分析节点特征,提高相似度的准确度;进一步地,可以根据节点类型设置对应的节点权重,可选地,父节点的节点权重值大于子节点的节点权重,用于提高父节点在整体数据中的占比,弱化多个子节点对整体结果的影响。示例性地,还可以将代码流程图中连接边映射为邻接矩阵,其中,具体可以如下所示:
L=[l 1 ,l 2 …l n ],其中,L表示连接边映射的邻接矩阵的集合,l n 表示第n个邻接矩阵,邻接矩阵能够表达代码流程图工作流的实际情况,区分不同代码文件的连接关系。
将代码流程图的节点映射为节点特征,将代码流程图中连接边映射为邻接矩阵能够将不同代码流程图的相似度计算转换为邻接矩阵的相似度计算,不用考虑代码流程图的具体结构,简化了度量方式,降低了相似度计算的复杂性;此外,将代码流程图转换为特征向量存储,不必太关注存储组合服务流程的语义信息,大大降低了所需的存储空间,提高了存储空间的利用率。
根据所述节点特征、所述节点权重,以及所述邻接矩阵,通过最小平均贴近度算法确定不同代码流程图的相似度,其中,所述确定不同代码流程图的相似度如下公式所示:
Figure SMS_2
其中,Sim(A,B)表示不同代码流程图的相似度,A、B分别表示不同代码流程图对应的向量表示集合,v i 、v j 分别表示不同代码流程图的节点特征,E表示节点特征的维度,u i 、u j 分别表示不同代码流程图的节点特征对应的节点权重,L i 、L j 分别表示不同代码流程图中的连接边,map(.)表示邻接矩阵转换函数,f(.)表示向量转换函数。
在一种可选的实施方式中,
所述基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系包括:
根据所述代码流程图的节点引用关系,将所述代码流程图中被引用的节点作为根节点,将引用的节点作为子节点;
所述连接边根据所述控制逻辑信息的类别分为第一连接边和第二连接边,所述第一连接边用于指示所连接的两个节点之间存在数据依赖关系,所述第二连接边用于指示所连接的两个节点之间存在函数依赖关系;
将与所述根节点相连的多个所述子节点,以及连接所述根节点与所述子节点的连接边构建多个依赖调用树,将共享同一内存的依赖调用树合并为依赖调用全集,根据所述依赖调用全集的节点流向确定所述函数依赖关系,根据所述依赖调用全集的内存访问指向确定所述数据依赖关系。
示例性地,本申请的连接边包括第一连接边和第二连接边,其中,第一连接边用于指示所连接的两个节点之间存在数据依赖关系,第二连接边用于指示所连接的两个节点之间存在函数依赖关系,具体地,
本申请中通过对函数进出记录的分析,首先在拥有相同线程ID的函数之间建立调用树。所谓的调用树就是调用者在前的一个层次结构。则其根元素就是程序运行的起点,比如程序的主函数;生成调用树的算法利用了堆栈结 构,如果算法遇到一个函数进入的记录,将其入栈;如果遇到一个函数返回的记录且该函数与栈顶的函数相同,就执行退栈操作,并在出栈的函数和出栈后栈顶的函数之间建立一条函数调用依赖;
对于依赖关系的判断核心要点在于两个对象是否访问同一内存,即使两者之间的数据共享是通过多个不同的引用所指向的,将共享同一内存的依赖调用树合并为依赖调用全集,而依赖调用全集中节点流向可以认为是函数依赖关系,因为节点流向综合了节点特征和连接边特征,共同构成了函数依赖关系;依赖调用全集的内存访问指向能够表明不同数据之间的引用关系,也即能够通过内存访问指向确定数据依赖关系。
本发明提供一种跨语言软件源代码的综合依赖关系分析方法,在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,实现在监控读写操作的同时获取读写地址,可以实时获取目标代码文件的依赖关系,并且能够实现对依赖关系的动态追踪。
在两个不同的类信息访问同一内存时,可以基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,代码流程图能够清晰且直观地表示算法的执行流程和程序结构的图形表示,不同编程语言如果直接使用现有的转换代码为流程图的方法或工具,则会导致具有相同流程但使用不同语言编写的代码转换得到的流程图有较大差异,本发明基于变量信息和所述控制逻辑信息,使得代码流程图标准化,能够适配跨语言软件代码的可视化,并且能够比较不同代码之间的相似度。
在不同代码流程图的相似度符合预设相似度阈值的情况下,基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系,充分挖掘代码流程图中各个构成元素对于依赖关系分析的作用,并且通过节点引用关系和连接边类别,确定目标代码文件中的数据依赖关系和函数依赖关系,充分考虑代码的结构特性,且无需依赖编译器,并且能够降低计算代价。
本发明实施例的第二方面,
提供一种跨语言软件源代码的综合依赖关系分析系统,图2为本发明实施例跨语言软件源代码的综合依赖关系分析系统的结构示意图,如图2所示,包括:
第一单元,用于在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
第二单元,用于若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,其中,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边;
第三单元,用于基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系。
本发明实施例的第三方面,
提供一种跨语言软件源代码的综合依赖关系分析设备,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为调用所述存储器存储的指令,以执行前述所述的方法。
本发明实施例的第四方面,
提供一种计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令被处理器执行时实现前述所述的方法。
本发明可以是方法、装置、系统和/或计算机程序产品。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本发明的各个方面的计算机可读程序指令。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (7)

1.一种跨语言软件源代码的综合依赖关系分析方法,其特征在于,包括:
在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,其中,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边;
基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系;
所述基于预设的图相似度检测算法确定不同代码流程图的相似度包括:
将所述代码流程图中的节点映射为节点特征,并根据所述代码流程图中的节点类型设置节点权重,将所述代码流程图中的连接边映射为邻接矩阵;
根据所述节点特征、所述节点权重,以及所述邻接矩阵,通过最小平均贴近度算法确定不同代码流程图的相似度,其中,所述确定不同代码流程图的相似度如下公式所示:
Figure QLYQS_1
其中,Sim(A,B)表示不同代码流程图的相似度,A、B分别表示不同代码流程图对应的向量表示集合,v i 、v j 分别表示不同代码流程图的节点,E表示节点特征的维度,u i 、u j 分别表示不同代码流程图的节点特征对应的节点权重,L i 、L j 分别表示不同代码流程图中的连接边,map(.)表示邻接矩阵转换函数,f(.)表示向量转换函数;
所述基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系包括:
根据所述代码流程图的节点引用关系,将所述代码流程图中被引用的节点作为根节点,将引用的节点作为子节点;
所述连接边根据所述控制逻辑信息的类别分为第一连接边和第二连接边,所述第一连接边用于指示所连接的两个节点之间存在数据依赖关系,所述第二连接边用于指示所连接的两个节点之间存在函数依赖关系;
将与所述根节点相连的多个所述子节点,以及连接所述根节点与所述子节点的连接边构建多个依赖调用树,将共享同一内存的依赖调用树合并为依赖调用全集,根据所述依赖调用全集的节点流向确定所述函数依赖关系,根据所述依赖调用全集的内存访问指向确定所述数据依赖关系。
2.根据权利要求1所述的方法,其特征在于,所述在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息包括:
在所述目标代码文件的每个函数的每条读写指令均进行插桩,获取所述目标代码文件的运行代码的访问足迹信息,其中,所述访问足迹信息包括所述运行代码访问地址所处的文件名、文件行号、变量名称、变量长度以及本次读写所发生的迭代次数中至少一种信息;
将所述访问足迹信息转换成字符串信息,通过向前遍历指令,在预设运行数据库中获取与所述字符串信息中的关键词对应的读操作信息和写操作信息。
3.根据权利要求1所述的方法,其特征在于,所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图包括:
将所述变量信息转化为所述代码流程图的节点信息,并判断所述变量信息在所述类信息中是否首次出现,若是,则将所述变量信息作为父节点,若否,则根据所述控制逻辑信息将所述变量信息连接至对应的父节点,将所述代码流程图的节点信息存储在节点队列空间中;
将所述控制逻辑信息转化为所述代码流程图的连接边信息,并基于对应节点间的控制逻辑连接对应的节点,生成初始连通图;
基于预设节点匹配函数,遍历所述节点队列空间中所有节点,将所述节点队列空间中的每一个节点与所述初始连通图中的任一节点进行匹配,若匹配,则保留所述初始连通图中匹配的节点,若不匹配,则将不匹配的节点从所述初始连通图中移除,得到所述代码流程图。
4.根据权利要求1所述的方法,其特征在于,所述基于所述变量信息和所述控制逻辑信息生成对应的代码流程图之后,所述方法还包括:
判断所述代码流程图中相邻节点是否存在逻辑关系,其中,所述逻辑关系包括数据依赖关系和控制依赖关系中至少一种;
若存在逻辑关系,则保持相邻节点在所述代码流程图中的位置,若不存在逻辑关系,则将所述相邻节点进行合并;
和/或
确定所述代码流程图中连接边构成的环路,并将涉及所述环路最多类型的连接边进行删除。
5.一种跨语言软件源代码的综合依赖关系分析系统,其特征在于,包括:
第一单元,用于在目标代码文件中插入依赖检测代码,通过所述依赖检测代码获取所述目标代码文件中所有的数据访问信息,其中,所述数据访问信息包括读操作信息和写操作信息;
第二单元,用于若所述数据访问信息中两个不同的类信息访问同一内存,则分别提取所述两个不同的类信息的变量信息和控制逻辑信息,并基于所述变量信息和所述控制逻辑信息生成对应的代码流程图,其中,所述代码流程图包括所述变量信息对应的节点以及所述控制逻辑信息对应的连接边;
第三单元,用于基于预设的图相似度检测算法确定不同代码流程图的相似度,若所述相似度符合预设相似度阈值,则基于所述代码流程图的节点引用关系以及连接边的类别,确定所述目标代码文件中的数据依赖关系和函数依赖关系;
所述第三单元还用于:将所述代码流程图中的节点映射为节点特征,并根据所述代码流程图中的节点类型设置节点权重,将所述代码流程图中的连接边映射为邻接矩阵;
根据所述节点特征、所述节点权重,以及所述邻接矩阵,通过最小平均贴近度算法确定不同代码流程图的相似度,其中,所述确定不同代码流程图的相似度如下公式所示:
Figure QLYQS_2
其中,Sim(A,B)表示不同代码流程图的相似度,A、B分别表示不同代码流程图对应的向量表示集合,v i 、v j 分别表示不同代码流程图的节点,E表示节点特征的维度,u i 、u j 分别表示不同代码流程图的节点特征对应的节点权重,L i 、L j 分别表示不同代码流程图中的连接边,map(.)表示邻接矩阵转换函数,f(.)表示向量转换函数;
所述第三单元还用于:
根据所述代码流程图的节点引用关系,将所述代码流程图中被引用的节点作为根节点,将引用的节点作为子节点;
所述连接边根据所述控制逻辑信息的类别分为第一连接边和第二连接边,所述第一连接边用于指示所连接的两个节点之间存在数据依赖关系,所述第二连接边用于指示所连接的两个节点之间存在函数依赖关系;
将与所述根节点相连的多个所述子节点,以及连接所述根节点与所述子节点的连接边构建多个依赖调用树,将共享同一内存的依赖调用树合并为依赖调用全集,根据所述依赖调用全集的节点流向确定所述函数依赖关系,根据所述依赖调用全集的内存访问指向确定所述数据依赖关系。
6.一种跨语言软件源代码的综合依赖关系分析设备,其特征在于,包括:
处理器;
用于存储处理器可执行指令的存储器;
其中,所述处理器被配置为调用所述存储器存储的指令,以执行权利要求1至4中任意一项所述的方法。
7.一种计算机可读存储介质,其上存储有计算机程序指令,其特征在于,所述计算机程序指令被处理器执行时实现权利要求1至4中任意一项所述的方法。
CN202310268033.3A 2023-03-20 2023-03-20 跨语言软件源代码的综合依赖关系分析 Active CN116069671B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310268033.3A CN116069671B (zh) 2023-03-20 2023-03-20 跨语言软件源代码的综合依赖关系分析

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310268033.3A CN116069671B (zh) 2023-03-20 2023-03-20 跨语言软件源代码的综合依赖关系分析

Publications (2)

Publication Number Publication Date
CN116069671A CN116069671A (zh) 2023-05-05
CN116069671B true CN116069671B (zh) 2023-06-16

Family

ID=86180444

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310268033.3A Active CN116069671B (zh) 2023-03-20 2023-03-20 跨语言软件源代码的综合依赖关系分析

Country Status (1)

Country Link
CN (1) CN116069671B (zh)

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110795455A (zh) * 2019-09-06 2020-02-14 中国平安财产保险股份有限公司 依赖关系解析方法、电子装置、计算机设备及可读存储介质
CN114879974A (zh) * 2022-06-09 2022-08-09 西安交通大学 一种基于cpg+图的隐式依赖模式分析方法

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101697121A (zh) * 2009-10-26 2010-04-21 哈尔滨工业大学 一种基于程序源代码语义分析的代码相似度检测方法
US20180232192A1 (en) * 2017-02-14 2018-08-16 Samson Timoner System and Method for Visual Enhancement, Annotation and Broadcast of Physical Writing Surfaces
CN113177191A (zh) * 2021-04-16 2021-07-27 中国人民解放军战略支援部队信息工程大学 基于模糊匹配的固件函数相似性检测方法及系统

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110795455A (zh) * 2019-09-06 2020-02-14 中国平安财产保险股份有限公司 依赖关系解析方法、电子装置、计算机设备及可读存储介质
CN114879974A (zh) * 2022-06-09 2022-08-09 西安交通大学 一种基于cpg+图的隐式依赖模式分析方法

Also Published As

Publication number Publication date
CN116069671A (zh) 2023-05-05

Similar Documents

Publication Publication Date Title
CN110245496B (zh) 一种源代码漏洞检测方法及检测器和其训练方法及系统
Hong Goal recognition through goal graph analysis
US5659723A (en) Entity/relationship to object oriented logical model conversion method
US9317260B2 (en) Query-by-example in large-scale code repositories
US5819210A (en) Method of lazy contexted copying during unification
US4931928A (en) Apparatus for analyzing source code
EP0522591B1 (en) Database retrieval system for responding to natural language queries with corresponding tables
RU2610241C2 (ru) Способ и система синтеза текста на основе извлеченной информации в виде rdf-графа с использованием шаблонов
CN111078780A (zh) 一种ai优化数据治理的方法
CN116501898B (zh) 适用于少样本和有偏数据的金融文本事件抽取方法和装置
CN110909126A (zh) 一种信息查询方法及装置
CN114625748A (zh) Sql查询语句的生成方法、装置、电子设备及可读存储介质
CN113508385B (zh) 使用子例程图谱进行形式语言处理的方法和系统
US5903860A (en) Method of conjoining clauses during unification using opaque clauses
CN116150757A (zh) 一种基于cnn-lstm多分类模型的智能合约未知漏洞检测方法
CN109325217B (zh) 一种文件转换方法、系统、装置及计算机可读存储介质
CN114528846A (zh) 一种用于人工智能的概念网络及其生成方法
CN116701325B (zh) 基于二进制文件缓存加载xbrl分类标准的方法
CN116069671B (zh) 跨语言软件源代码的综合依赖关系分析
Ellis Compiling conceptual graphs
CN115344504B (zh) 基于需求规格说明书的软件测试用例自动生成方法及工具
KR100345277B1 (ko) Xml 문서의 논리적인 구조정보 추출기
US6480833B2 (en) Method of resolving overloaded routines, system for implementing the same and medium for storing processing program therefor
CN113076089B (zh) 一种基于对象类型的api补全方法
CN114968325A (zh) 代码注释的生成方法及装置、处理器和电子设备

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