CN114879974A - 一种基于cpg+图的隐式依赖模式分析方法 - Google Patents
一种基于cpg+图的隐式依赖模式分析方法 Download PDFInfo
- Publication number
- CN114879974A CN114879974A CN202210647102.7A CN202210647102A CN114879974A CN 114879974 A CN114879974 A CN 114879974A CN 202210647102 A CN202210647102 A CN 202210647102A CN 114879974 A CN114879974 A CN 114879974A
- Authority
- CN
- China
- Prior art keywords
- graph
- dependency
- implicit
- control flow
- syntax tree
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种基于CPG+图的隐式依赖模式分析方法,本发明是条件性的获取程序依赖图,从而降低了生成代码的图结构中间表示形式的复杂度,并且由于添加了隐式依赖信息,从而可以从图中挖掘隐式依赖模式。通过对源代码进行解析和分析,生成抽象语法树,控制流图和程序依赖图,联合构建CPG+图,从而降低了生成代码的图结构中间表示形式的复杂度。可以快速且有效的对项目文件进行分析,并从中挖掘具体的隐式依赖模式,解决了目前隐式依赖模式仍然未知的问题,并且可以快速的从项目中获取具体的隐式依赖模式及数量。
Description
技术领域
本发明属于程序分析领域,特别涉及一种基于CPG+图的隐式依赖模式分析方法。
背景技术
软件实体间的依赖是大部分软件架构分析和架构分析工具研究的基石,包括架构复原、架构问题或反模式检测,缺陷预测和变动影响分析等。然而许多语言因其自身特性导致语法依赖关系在源代码中无法显现,例如动态语言Python、JavaScript和Ruby,由于没有显示的类型引用,使得在对源代码进行静态的语法分析时,某些依赖关系是不可见的,与能够直接被标识的显示依赖相反。像这种由于动态类型引起的不可见的语法依赖称为隐式依赖。
现存架构分析工具通常没有将隐式依赖考虑在内,忽略了隐式依赖对架构分析的影响,然而隐式依赖对架构的影响又很大。有研究表明,隐式依赖关系对架构的影响高于显示依赖,且考虑隐式依赖还能帮助识别以前不可识别的架构反模式实例以及能够检测带有架构连接的严重问题文件。通常,涉及隐式依赖的文件会比涉及显示依赖关系的文件多32%的维护工作。
但是由于隐式依赖关系的“不可见”性,使得找到它们、理解它们和改变它们变得更加困难。事实上,文件级的隐式依赖在所有文件级依赖的中占比超过25%,从而使得我们无法忽视它们。虽然已有工作进行了隐式依赖的抽取方法、对软件结构带来的影响等相关研究,但是代码隐式依赖模式仍然未知,隐式依赖模式又有着怎样的实际意义也依然未知,而且隐式依赖模式天然是一个图,是一种高维数据,因此寄希望于通过图的方式去检测,以及识别隐式依赖。
发明内容
为了解决上述问题,本发明提供了一种基于CPG+图的隐式依赖模式分析方法,在代码属性图(Code Property Graph,CPG)的基础上提出的更加侧重于流程控制及隐式依赖的新型属性图,称为基于隐式依赖的代码属性图(Code Property Graph Plus,CPG+图)。通过对源代码进行解析和分析,生成抽象语法树(Abstract Syntax Tree,AST),控制流图(Control Flow Graph,CFG)和程序依赖图(Program Dependency Graph,PDG),联合构建CPG+图,相比于原始的代码属性图CPG图,条件性的获取程序依赖图PDG,从而降低了生成代码的图结构中间表示形式的复杂度。
为了实现上述目的,本发明采用的技术方案是:
一种基于CPG+图的隐式依赖模式分析方法,包括如下步骤:
S1:通过ENRE获取对象的依赖关系;
S2:获取对象的抽象语法树并转化为需要的格式;
S3:预处理以便后续对图的操作;
S4:获取代码中方法的控制流图,获取节点顺序;
S5:若方法中含有隐式依赖,获得其隐式依赖发生节点的数据流;
S6:合并抽象语法树、控制流图以及基于隐式依赖的数据流图;
S7:对隐式依赖模式处理,使用子图匹配算法进行挖掘分析隐式依赖模式。
本发明进一步的改进在于:步骤S1中,采用ENRE工具分析对象的隐式依赖模式并输出,作为信息输入到程序中。
本发明进一步的改进在于:步骤S2中,获取对象的抽象语法树json格式,并根据json数据绘制抽象语法树(Abstract Syntax Tree,AST),过程中保留需要的信息(lineno属性、type属性、value属性等)。
本发明进一步的改进在于:步骤S3中,为了便于后续的三种图的合并,需要采取一系列手段进行预处理,步骤S3具体包括:
S301:当函数体中调用与控制流起始节点函数名相同的方法时,会出现指向控制流起始节点的边,造成循环。控制流起始节点是函数控制流的根节点,不应该存在父节点,在生产控制流的过程中进行删除;
S302:由于是根据json数据生成抽象语法树,而ast2json项目只是简单的返回Python文件被AST库解析语法树后的所有的属性和对应的值,在实际代码中,节点的“lineno(开始行)”属性和“end_lineno(结束行)”属性会被部分属性分开,在递归地处理json数据时,会造成节点只有“lineno(开始行)属性”,从而在后续的处理中发生错误。因此需要调整解析抽象语法树后返回的json数据。对控制流图返回的语句节点规定排序,从而保证顺序一致,从而便于后续的图合并操作;
S303:由于程序依赖图(Program Dependency Graph,PDG)与控制流图(ControlFlow Graph,CFG)都是在语句层面的解析,因此,先将PDG与CFG的信息联立,从而便于后续信息建立,为此通过CFG去寻找隐式依赖,从而无需在考虑PDG的节点顺序关系。
S304:初始的绘制控制流图仅有基本的if、for语句的处理,根据出现频次,优先增加对raise、with、try-except语句的处理;添加Python特有的for-else、while-else语句。
本发明进一步的改进在于:所述步骤S4中,获取的控制流程图对于for else、with、try-except语句,获得的控制流图节点顺序与抽象语法树中节点顺序不尽相同,需要调整顺序,以便能合并到抽象语法树中。
本发明进一步的改进在于:所述步骤S5中,首先寻找到方法中隐式依赖的源码,并往上寻找与依赖有关的数据流,对此进行了一系列的处理,步骤S5具体包括:
S501:正则化隐式依赖信息,并与源码匹配,寻找隐式依赖的源码;
S502:从隐式依赖源码处往上寻找与隐式依赖有关的数据流,数据流可能存在分支,因此最终可能会有多条数据流指向隐式依赖;
本发明进一步的改进在于:所述步骤S6中,合并获取的抽象语法树、控制流图、隐式依赖数据流图,形成一个联合数据结构,从而可以批量化的处理及挖掘。
本发明进一步的改进在于:所述步骤S7中,根据S6中获取的数据结构,通过子图匹配算法,发现所有的依赖发生处,并从中挖掘判断隐式依赖模式。
与现有技术相比,本发明的有益效果是:
(1)提出了具体的隐式依赖模式,解决了目前代码隐式依赖仍然未知的问题;
(2)本课题是在代码属性图(CPG)的基础上提出的更加侧重于流程控制及隐式依赖的新型属性图,称为基于隐式依赖的代码属性图(Code Property Graph Plus,CPG+图)。需要对源代码进行解析和分析,生成抽象语法树(Abstract Syntax Tree,AST),控制流图(Control Flow Graph,CFG)和程序依赖图(Program Dependency Graph,PDG),联合构建CPG+图,相比于原始的代码属性图(Code Property Graph,CPG)图,条件性的获取程序依赖图,从而降低了生成代码的图结构中间表示形式的复杂度;
(3)提出了隐式依赖模式基于CPG+图的检测,从而可以快速的获取项目中的隐式依赖种类及其数量。
附图说明
图1为本发明方法的整体流程图
图2为Django3.2a1函数转换生成CPG+图
表1为程序得到Django3.2a1项目中的部分隐式依赖及出现次数
具体实施方式
为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面结合附图和实施例详细说明本发明的具体实施方式。
以已知开源项目Django-3.2a1为例。
如图1所示,一种基于CPG+图的隐式依赖模式分析方法,包括如下步骤:
步骤S1:将Django-3.2a1项目输入到ENRE工具中,获取其隐式依赖。
步骤S2:获取Django-3.2a1项目的抽象语法树,保留所需属性,转换为json数据,根据json数据绘制成抽象语法树。
步骤S3:为便于后续图的合并操作,需要对图进行处理:
步骤S301:根据json数据,转换为抽象语法树,忽略中间过于细节的部分(函数参数被多层“arg(参数)”属性包裹),获取方法内的语句节点,作为后续合并的基准;
步骤S302:补充完善绘制控制流的工具;
步骤S4:绘制方法的控制流程图,获取节点关系:
步骤S5:当函数中含有隐式依赖时,寻找与隐式依赖有关的数据流,具体步骤如下:
S501:正则化处理隐式依赖,便于与源码匹配,寻找隐式依赖源码
S502:寻找与隐式依赖有关的数据流,需要考虑多分支的情况
S503:基于寻找的数据流,获取依赖发生处语句,解析与依赖相关的程序依赖图
步骤S6:合并获取的抽象语法树、控制流图、隐式依赖数据流图,形成一个联合数据结构,从而可以批量化的处理及挖掘,如图2所示,为解析后Django3.2a1项目中函数的CPG+图:
步骤S7:根据S6获得的数据结构,一般化已发现的隐式依赖模式,采用子图匹配算法从其中分析隐式依赖,表1为Django3.2a1项目经过分析后得到的结果,即程序得出Django3.2a1项目中使用参数传递直接调用的隐式依赖这一类型共424次,使用参数传递链式调用的隐式依赖这一类型共201次。
总结:本发明提出了具体的隐式依赖模式,解决了当前隐式依赖模式仍然未知的问题,并给出了具体的从CPG+图去挖掘隐式依赖的方法,挖掘结果如表1所示。
表1
Claims (8)
1.一种基于CPG+图的隐式依赖模式分析方法,其特征在于,包括如下步骤:
S1:输入Python项目,通过ENRE工具获取对象的依赖关系;
S2:获取对象的抽象语法树;
S3:预处理以便后续对图的操作;
S4:获取代码中方法的控制流图,获取节点顺序;
S5:若方法中含有隐式依赖,获得其隐式依赖发生节点的数据流;
S6:合并抽象语法树、控制流图以及基于隐式依赖的数据流图;
S7:从合并的图中通过VF2算法获得隐式依赖发生处,寻找它们的父节点。赋值替换,获取从函数到依赖发生处的变换,从而判断隐式依赖模式。
2.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S1中,采用ENRE工具分析对象的隐式依赖模式并输出,作为信息输入到程序中。
3.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S2中,获取对象的抽象语法树json格式,并根据json数据绘制抽象语法树(Abstract SyntaxTree,AST),过程中保留需要的信息lineno属性、type属性、value属性。
4.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S3中,为了便于后续的三种图的合并,需要进行预处理,步骤S3具体包括:
S301:当函数体中调用与控制流起始节点函数名相同的方法时,会出现指向控制流起始节点的边,造成循环,控制流起始节点是函数控制流的根节点,不应该存在父节点,在生产控制流的过程中进行删除;
S302:由于是根据json数据生成抽象语法树,而ast2json项目只是简单的返回Python文件被AST库解析语法树后所有的属性和对应的值,在实际代码分析中,节点的“lineno(开始行)”属性和“end_lineno(结束行)”属性会被一些属性分开,在递归地处理json数据时,会造成节点只有“lineno(开始行)属性”,从而在后续的处理中发生错误,因此需要调整解析语法树后返回的json数据,对控制流图返回的语句节点规定排序,从而保证顺序一致,从而便于后续的图合并操作;
S303:由于程序依赖图Program Dependency Graph,PDG与控制流图Control FlowGraph,CFG都是在语句层面的解析,因此,先将PDG与CFG的信息联立,从而便于后续信息建立,为此通过CFG去寻找隐式依赖,从而无需在考虑PDG的节点顺序关系;
S304:初始的绘制控制流图仅有基本的if、for语句的处理,根据出现频次,优先增加对raise、with、try-except语句的处理;添加Python特有的for-else、while-else语句。
5.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S4中,获取的控制流程图对于for else、with、try-except语句,获得的控制流图节点顺序与抽象语法树中节点顺序不尽相同,需要调整顺序,以便能合并到抽象语法树中。
6.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S5中,首先寻找到方法中隐式依赖的源码,并往上寻找与依赖有关的数据流,对此进行了一系列的处理,步骤S5具体包括:
S501:正则化隐式依赖信息,并与源码匹配,寻找隐式依赖的源码;
S502:从隐式依赖源码处往上寻找与隐式依赖有关的数据流,数据流可能存在分支,因此最终可能会有多条数据流指向隐式依赖。
7.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S6中,合并获取的抽象语法树、控制流图、隐式依赖数据流图,形成一个联合数据结构,从而批量化的处理及挖掘。
8.根据权利要求1所述基于CPG+图的隐式依赖模式分析方法,其特征在于,所述步骤S7中,根据S6中获取的数据结构,通过子图匹配算法,发现所有的依赖发生处,并从中挖掘判断隐式依赖模式。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210647102.7A CN114879974A (zh) | 2022-06-09 | 2022-06-09 | 一种基于cpg+图的隐式依赖模式分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210647102.7A CN114879974A (zh) | 2022-06-09 | 2022-06-09 | 一种基于cpg+图的隐式依赖模式分析方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114879974A true CN114879974A (zh) | 2022-08-09 |
Family
ID=82680838
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210647102.7A Pending CN114879974A (zh) | 2022-06-09 | 2022-06-09 | 一种基于cpg+图的隐式依赖模式分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114879974A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116069671A (zh) * | 2023-03-20 | 2023-05-05 | 南京优测信息科技有限公司 | 跨语言软件源代码的综合依赖关系分析 |
-
2022
- 2022-06-09 CN CN202210647102.7A patent/CN114879974A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116069671A (zh) * | 2023-03-20 | 2023-05-05 | 南京优测信息科技有限公司 | 跨语言软件源代码的综合依赖关系分析 |
CN116069671B (zh) * | 2023-03-20 | 2023-06-16 | 南京优测信息科技有限公司 | 跨语言软件源代码的综合依赖关系分析 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10642832B1 (en) | Reducing the domain of a subquery by retrieving constraints from the outer query | |
CN110532019B (zh) | 一种软件代码片段历史追溯的方法 | |
US8051410B2 (en) | Apparatus for migration and conversion of software code from any source platform to any target platform | |
US8731894B1 (en) | Indexing behaviors and recipes of a circuit design | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
US20010018697A1 (en) | Structured document processing system and structured document processing method | |
Higo et al. | On software maintenance process improvement based on code clone analysis | |
Nguyen et al. | Clone-aware configuration management | |
US7779049B1 (en) | Source level optimization of regular expressions | |
Delfmann et al. | The generic model query language GMQL–Conceptual specification, implementation, and runtime evaluation | |
CN112434046B (zh) | 一种数据血缘分析方法、装置、设备及存储介质 | |
CN115543402B (zh) | 一种基于代码提交的软件知识图谱增量更新方法 | |
Stephan et al. | Using mutation analysis for a model-clone detector comparison framework | |
CN114879974A (zh) | 一种基于cpg+图的隐式依赖模式分析方法 | |
CN109558314B (zh) | 一种面向Java源代码克隆检测的方法 | |
CN113032366A (zh) | 基于Flex和Bison的SQL语法树解析方法 | |
EP2390793B1 (en) | Method for determining similarity of text portions | |
Anderson et al. | Supporting analysis of SQL queries in PHP AiR | |
US7730108B2 (en) | Information processing apparatus and method, and program | |
Dagit et al. | Identifying change patterns in software history | |
KR101488188B1 (ko) | 시퀀스 다이어그램의 생성 방법 및 시스템 | |
US20040039747A1 (en) | Retrieval device and retrieval method for object-oriented database | |
CN114003234A (zh) | 小程序局部编译方法、装置、设备及计算机可读存储介质 | |
CN118193528A (zh) | 表达式统计信息获取方法、装置、设备、介质和程序产品 | |
Midolo et al. | A Robust and Automatic Approach for Matching Algorithms. |
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 |