当前位置: 首页 > 专利查询>南京大学专利>正文

基于行为一致性的库版本约束扩展方法技术

技术编号:38148051 阅读:12 留言:0更新日期:2023-07-13 09:11
本发明专利技术提供一种基于行为一致性的库版本约束扩展方法,包括根据给定的项目和满足项目约束的库的基准版本,得到在其中被使用到的所有API调用入口;通过在库的基准版本中追踪这些API调用入口,构建一个按需调用图来追踪库的其余被间接调用到的部分;计算库基准版本和库未知版本的差异;比较版本差异与库被直接或间接调用到的部分,如果两者没有任何重叠的内容,则可以将项目对库的约束扩展到未知版本并生成新约束。本发明专利技术可以有效解决由于项目对库的约束过于严格而导致的依赖冲突问题,同时只生成必要部分的调用图,大大提高了生成调用图步骤的效率。步骤的效率。步骤的效率。

【技术实现步骤摘要】
基于行为一致性的库版本约束扩展方法


[0001]本专利技术涉及软件维护与演化
,特别涉及一种基于行为一致性的库版本约束扩展方法。

技术介绍

[0002]随着软件生态系统的发展,软件项目越来越常依赖第三方库来实现代码重用。为了方便用户构建项目,开发者通常在配置文件中明确指定所依赖的第三方库的版本限制,以确保可复现的环境中的第三方库版本符合预期。然而,软件项目和它们所依赖的第三方库是独立开发的,这意味着开发者必须在没有明确指导的情况下手动编写版本限制。此外,第三方库的快速更新要求开发者花费额外的精力来保持这些限制随着库的更新而更新。考虑到软件项目通常在配置文件中包含对多个库的直接依赖,同时又可以由直接依赖的依赖引入间接依赖,当出现对于同一个库的版本约束出现冲突时,就会出现依赖冲突问题。相关项目可能因为缺乏兼容的执行环境而导致构建失败。
[0003]为了应对上述问题,已有的方法或是通过构建依赖图等方式更快地检测并报告依赖冲突问题,或是通过改变安装策略的方法尽可能避免出现依赖冲突问题,但这些方法都是基于原有的版本约束,而非考虑改写版本约束本身。对于依赖冲突问题的解决,Python官方文档的建议之一就是去使用更宽松的版本约束,但这对普通开发者而言并不容易,因为难以直接判断在采用未知版本后是否可保持行为一致性。因此,一种基于行为一致性的自动库版本扩展方法亟待提出。

技术实现思路

[0004]本专利技术为尽可能扩展Python项目对第三方库的版本约束以解决或预防依赖冲突问题,同时为保证扩展后的版本约束仍能保持行为一致性,提出一种基于行为一致性的库版本约束扩展方法;采用保守的静态分析的方式,自动地分析项目与库的源码,并考虑了调用关系与上层库,在此基础上向项目开发者推荐更合理的、适用性更强的版本约束。
[0005]为实现上述目的,本专利技术采用以下技术方案:
[0006]一种基于行为一致性的库版本约束扩展方法,包括以下步骤:
[0007]采用静态分析方式分析项目源码以及该项目中使用到的库源码,然后根据两者的源码确定在该项目中被直接使用到的库功能以及间接调用的库功能;
[0008]针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异;若存在差异且未知版本的库功能与项目中所有直接或间接调用的库功能均没有重叠,则将该未知版本的库合并入对应的基准版本库中,以实现保持行为一致性的库版本约束扩展。
[0009]为优化上述技术方案,采取的具体措施还包括:
[0010]进一步地,所述确定项目中被直接使用到的库功能具体方案为:
[0011]第一阶段:分析项目源码,获取该项目对库中的直接功能调用,构成候选API的集合;
[0012]第二阶段:对于每个候选API,如果能在给定的基准版本库中找到对应的完全限定名,则该API为实际入口API,即实际入口API视为直接使用到的库功能。
[0013]进一步地,在所述第一阶段中,分析项目源码时需同步考虑项目源码与外部模块和元素的引入方式,以确保不会遗漏该项目对库中功能的调用。
[0014]进一步地,所述确定项目中间接调用的库功能具体方案为:
[0015]根据给定的基准版本库,通过追踪其内部的函数调用关系,构建以实际入口API为入口的按需调用图;
[0016]按此方式生成的调用图中,除作为实际入口API的节点外,调用图中的其它节点即认定为在该项目中所有间接调用到的库功能部分。
[0017]进一步地,所述构建按需调用图的具体方案如下:
[0018]S1:生成基准版本库中所有模块的抽象语法树;
[0019]S2:对所有在该库中的定义类和函数创建初始节点,并对每个初始节点通过一个完全限定名来进行唯一标识;
[0020]S3:基于步骤S2中的初始节点,创建待分析节点集合A和已分析节点集合B,并初始化为实际入口API的完全限定名对应的节点;
[0021]S4:若集合A为空集,则跳转到步骤S6;否则取集合A中的任一节点x至步骤S5中;
[0022]S5:对节点x,识别其调用关系c,并通过尝试分析其合法范围内的变量将这些调用关系匹配到其他节点y上,若成功匹配则在调用图中加入节点x指向节点y的边;在分析完节点x的所有调用关系后,将节点x从集合A中删除并加入集合B中,然后跳转到步骤S4中;其中,若节点x的调用关系c是指向上层库的调用,则将上层库中相应元素创建节点并加入到调用图中;此外,如果其它节点y不在集合A或集合B中,则将节点y加入集合A;
[0023]S6:基于上述步骤完成按需调用图的构建。
[0024]进一步地,在步骤S5中,对于一些无法被任何实际入口API以任何方式所调用到的库功能部分,仅做基础的语法分析,而不深入分析其内部的其他调用关系。
[0025]进一步地,所述针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异具体方案为:通过比较库的未知版本和基准版本间的源码区别、配置文件区别、各自对上层库依赖的区别来判断两个版本间是否存在差异。
[0026]进一步地,所述给定库的基准版本是需符合项目对该库的版本约束的任意版本;而对库的未知版本则无限定要求。
[0027]本专利技术的有益效果是:本专利技术提供一种基于行为一致性的库版本约束扩展方法,通过分析项目和库的源码及配置文件,实现项目对库的版本约束的自动扩展,从而有效解决由于项目对库的约束过于严格而导致的依赖冲突问题;同时只生成必要部分的调用图,大大提高了生成调用图步骤的效率。
附图说明
[0028]图1是本专利技术整体技术方案流程结构示意图。
[0029]图2是本专利技术实施例提供的配置文件示意图。
[0030]图3为本专利技术实施例提供的外部模块及元素引入方式示意图。
具体实施方式
[0031]下面结合附图详细说明本专利技术。
[0032]本申请整体技术方案如下:
[0033]一种基于行为一致性的库版本约束扩展方法;参考图1,为尽可能扩展Python项目对第三方库的版本约束以解决或预防依赖冲突问题,同时为保证扩展后的版本约束仍能保持行为一致性,方法采用保守的静态分析的方式,自动地分析项目与库的源码,并考虑了调用关系与上层库,在此基础上向项目开发者推荐更合理的、适用性更强的版本约束;
[0034]所述自动库版本扩展方法,包括:
[0035]确定在项目中被直接使用到的库功能,在版本约束被扩展后需要保证这些功能行为一致;为保持上述功能行为一致,除需要分析功能本身定义外,还需要分析间接调用的其他库内定义的功能或上层库功能;为保证上述所有项目直接或间接使用到的功能在版本约束扩展后行为一致,需要得到已经满足版本约束的库的基准版本与库的任意未知版本之间的版本差异,并在该版本差异与上述所有项目直接或间接使用到的功能没有重叠的情况下,将库的未知版本并入原始版本约束,以达成保持行为一致性的自动版本约束扩展。
[0036]进一步,所述确定本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于行为一致性的库版本约束扩展方法,其特征在于,包括以下步骤:采用静态分析方式分析项目源码以及该项目中使用到的库源码,然后根据两者的源码确定在该项目中被直接使用到的库功能以及间接调用的库功能;针对项目中使用的库,对比其当前使用的基准版本与任一未知版本的版本差异;若存在差异且未知版本的库功能与项目中所有直接或间接调用的库功能均没有重叠,则将该未知版本的库合并入对应的基准版本库中,以实现保持行为一致性的库版本约束扩展。2.根据权利要求1所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述确定项目中被直接使用到的库功能具体方案为:第一阶段:分析项目源码,获取该项目对库中的直接功能调用,构成候选API的集合;第二阶段:对于每个候选API,如果能在给定的基准版本库中找到对应的完全限定名,则该API为实际入口API,即实际入口API视为直接使用到的库功能。3.根据权利要求2所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,在所述第一阶段中,分析项目源码时需同步考虑项目源码与外部模块和元素的引入方式,以确保不会遗漏该项目对库中功能的调用。4.根据权利要求2所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述确定项目中间接调用的库功能具体方案为:根据给定的基准版本库,通过追踪其内部的函数调用关系,构建以实际入口API为入口的按需调用图;按此方式生成的调用图中,除作为实际入口API的节点外,调用图中的其它节点即认定为在该项目中所有间接调用到的库功能部分。5.根据权利要求4所述的一种基于行为一致性的库版本约束扩展方法,其特征在于,所述构建按需调用图的具体方案如下:S1:生成基准版本库中所...

【专利技术属性】
技术研发人员:王慧妍刘疏观许畅
申请(专利权)人:南京大学
类型:发明
国别省市:

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

1