一种多语言可扩展的代码依赖解析模型及解析方法技术

技术编号:38009045 阅读:8 留言:0更新日期:2023-06-30 10:27
本发明专利技术公开了一种多语言可扩展的代码依赖解析模型及解析方法,首先,利用解析器生成抽象语法树,基于对抽象语法树的遍历,在恰当的结点获取信息,完成对实体的抽取和保存,其次,此过程中保留了一些能够直接判断的依赖关系和能够判断一半信息的残缺依赖,最后,处理前序流程的分析中得到的残缺依赖,结合符号表,按照“先Export再Import后其他”的顺序完成依赖回填,完成依赖回填的残缺依赖将补充为完整依赖存储,依赖回填失败的残缺依赖将保留为未解决的依赖存储。未解决的依赖存储。未解决的依赖存储。

【技术实现步骤摘要】
一种多语言可扩展的代码依赖解析模型及解析方法


[0001]本专利技术涉及可信软件及静态代码分析领域,特别涉及一种语言无关、测试项目应用场景无关、可扩展的静态代码依赖解析领域。

技术介绍

[0002]静态代码分析是软件工程领域的一个重要组成部分,软件产品在开发和维护过程中都需要进行静态代码分析,静态代码分析得到的依赖解析结果为上层软件及架构分析提供坚实基础,可以广泛应用于漏洞检测、架构度量、软件坏味道等多个领域,能够保障软件产品的可靠性和安全性。相较于动态分析,静态代码分析不需要运行软件产品,其在时间复杂度和空间复杂度上具有更好的表现。
[0003]学术界的研究往往集中于某些特定语言,且多偏向于调用(call)依赖图的构建和特定场景下的分析(如Linux操作系统),实体粒度相对较粗,往往是在函数层级上解析,依赖种类相对较少,依赖种类集中于调用关系和继承关系。更细粒度的实体和更多种类的依赖可以提供更加丰富的信息,为架构度量等上层应用提供稳固支撑。当前,工业界的研究往往基于自身需求进行设计,开发完善度较高且对外开放使用的工具多为闭源且收费的项目,其成本较高,开放性较差,该类项目由于语言语法规范多样性和无法在编译期间确定接受对象的类型等原因,在部分场景下准确率较低,且无法进行补充和迭代开发,其余项目多为开发的早期阶段,支持的功能较少,能力较为薄弱。现阶段还存在一些用于描述静态分析中间结果的协议,但是其普及度和使用度不够,较难验证其可行性。

技术实现思路

[0004]本专利技术的目的是旨在提供一种多语言的、可扩展的代码依赖解析方法,其可以在排序性能和时间开销上取得一定的平衡,并且在大规模软件中能够取得性能和时间开销双方面的优势,利用静态代码分析的方式来克服动态代码分析中程序必须没有运行错误、耗费算力和时间的缺点,以解决上述技术问题。
[0005]为达到上述目的,本专利技术采用以下技术方案予以实现:
[0006]S1 遍历文件系统
[0007]S2 生成抽象语法树
[0008]S3基于抽象语法树遍历的实体抽取
[0009]S4根据实体抽取结果的中间处理
[0010]S5 基于符号表的依赖回填
[0011]S6 生成结果并输出
[0012]一种多语言可扩展的代码依赖解析模型,包括:
[0013]代码依赖图模型,由节点和边组成,其中,节点表示的是实体对象,存储与实体相关的全部信息,包括但不限于实体的种类、唯一标识索引、全名、属性信息和位置信息,边是链接起发生依赖的两个实体之间的桥梁,此处,边为有向边,边的方向指代依赖发生的方
向,即源实体到目的实体之间发生某依赖关系,除此之外,边还保留了其他与依赖相关的信息,包括但不限于依赖的种类和依赖的发生位置。
[0014]一种多语言可扩展的代码依赖解析方法,遍历文件系统模块,遍历输入项目路径,获取得到需要处理的文件信息及处理顺序;
[0015]抽象语法树生成模块,根据文件列表及处理顺序,设置合适的编译选项,生成抽象语法树;
[0016]基于抽象语法树的实体抽取模块,根据生成的抽象语法树和访问者设计模式,从抽象语法树上相应的节点上抽取实体信息;
[0017]中间处理模块,用于对实体列表中未完成的处理信息进行标识解决;
[0018]基于符号表的依赖回填模块,根据实体仓库里的实体信息和处理得到的残缺依赖补全实体信息,获得最终实体依赖图;
[0019]结果输出模块。
[0020]依赖图中每个节点可以确认唯一实体,节点与节点之间允许存在一种依赖发生多次或者是多种依赖同时发生等复杂情况,即边可以重叠存在,另外,依赖信息之间存在关联关系,根据依赖信息推导出循环依赖/间接依赖,依赖的发生位置可以是在实体定义文件,也可以不在,依赖的发生位置与源实体和目的实体的定义位置均可以在不同文件之中。
[0021]方法优化了内部的存储结构和处理逻辑,对于大规模和存在复杂依赖关系的软件产品,方法可以在理想的时间和空间完成解析。
[0022]对于需要解析其他形式,需要其他相关种类依赖的情况下,可以对方法过程中生成的抽象语法树进行扩展处理,整个框架功能隔离明确,允许并友好支持模块扩展。
[0023]对于输入的软件产品的语言不设限制,对于容忍软件产品的语法错误和语义错误,方法具有良好的鲁棒性。
[0024]其抽取到的实体粒度为符号级别的实体,粒度更细,保留的实体信息以变量为最小实体层级,保留的依赖信息以发生在实体之间的依赖信息为最小依赖层级。
[0025]更细粒度的信息格式,包括实体为具有包括但不限于名称、代码位置和类型等属性的对象结构,除类型外实体还可以有细分类型,其反映了更细粒度的实体特征:
[0026]依赖种类的广泛性,包括动态依赖和静态依赖等;
[0027]依赖回填的顺序性,包括综合符号表,按照“先Export再Import最后其他”的顺序完成依赖回填,完成依赖回填的残缺依赖将补充为完整依赖存储。
[0028]与现有技术相比,本专利技术具有以下有益效果:
[0029]本专利技术多语言可扩展的代码依赖解析方法,首先,利用解析器生成抽象语法树,基于对抽象语法树的遍历,在恰当的结点获取信息,完成对实体的抽取和保存,其次,此过程中保留了一些能够直接判断的依赖关系和能够判断一半信息的残缺依赖,最后,处理前序流程的分析中得到的残缺依赖,综合符号表,按照“先Export再Import最后其他”的顺序完成依赖回填,完成依赖回填的残缺依赖将补充为完整依赖存储,依赖回填失败的残缺依赖将保留为未解决的依赖存储。
附图说明
[0030]图1为本专利技术实施例的多语言可扩展的代码依赖解析方法的实体依赖分类图;
[0031]图2为本专利技术实施例的多语言可扩展的代码依赖解析方法流程图,其中包括三个子图,子图(a)为流程图总图,子图(b)为依赖回填流程图,子图(c)为扩展模块,隐式依赖抽取流程图;
[0032]图3为本专利技术实施例的多语言可扩展的实体依赖模型图。
具体实施方式
[0033]为了使本
的人员更好地理解本专利技术方案,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分的实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本专利技术保护的范围。
[0034]需要说明的是,本专利技术的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本专利技术的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种多语言可扩展的代码依赖解析模型,其特征在于,包括:代码依赖图模型,由节点和边组成,其中,节点表示的是实体对象,存储与实体相关的全部信息,包括但不限于实体的种类、唯一标识索引、全名、属性信息和位置信息,边是链接起发生依赖的两个实体之间的桥梁,此处,边为有向边,边的方向指代依赖发生的方向,即源实体到目的实体之间发生某依赖关系,除此之外,边还保留了其他与依赖相关的信息,包括但不限于依赖的种类和依赖的发生位置。2.采用如权利要求1所述模型的一种多语言可扩展的代码依赖解析方法,其特征在于,遍历文件系统模块,遍历输入项目路径,获取得到需要处理的文件信息及处理顺序;抽象语法树生成模块,根据文件列表及处理顺序,设置合适的编译选项,生成抽象语法树;基于抽象语法树的实体抽取模块,根据生成的抽象语法树和访问者设计模式,从抽象语法树上相应的节点上抽取实体信息;中间处理模块,用于对实体列表中未完成的处理信息进行标识解决;基于符号表的依赖回填模块,根据实体仓库里的实体信息和处理得到的残缺依赖补全实体信息,获得最终实体依赖图;结果输出模块。3.根据权利要求2所述的一种多语言可扩展的代码依赖解析方法,其特征在于,依赖图中每个节点可以确认唯一实体,节点与节点之间允许存在一种依赖发生多次或者是多种依赖同时发生等复杂情况,即边可以重叠存在,另外,依赖信息之间存在关联关系,根据依赖信息推导出循环依赖/间接依赖,依赖的发生位置可以是在实体定义文件,也可以不在,依赖的发生位置与源实体和目的实体的定义位置均可以在不同文件之中。4.根据权利要求2...

【专利技术属性】
技术研发人员:晋武侠丁紫凡陈大为刘烃范铭
申请(专利权)人:西安交通大学
类型:发明
国别省市:

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

1