一种基于高阶函数的代码依恋检测方法及系统技术方案

技术编号:39290241 阅读:8 留言:0更新日期:2023-11-07 10:59
本发明专利技术涉及函数式编程和程序分析领域,公开了一种基于高阶函数的代码依恋检测方法包括,程序预处理,生成可以识别多态调用方法名的虚函数表,构造函数调用图;构建每个过程高阶函数形式的函数摘要;通过生成的高阶函数形式的函数摘要,调用点处对函数摘要的函数参数进行相应代入,获取过程间由于过程调用和参数传递产生的代码依恋值信息;将计算得到的依恋值信息进行汇总,获取每个类中的每个方法的依恋度量值,检测程序中是否存在代码依恋。本发明专利技术解决了当前检测方法很少考虑上下文函数调用关系,以及类是否被具体实例化的不足,提高代码依恋检测的精度及其在生产生活中的应用价值。价值。价值。

【技术实现步骤摘要】
一种基于高阶函数的代码依恋检测方法及系统


[0001]本专利技术涉及函数式编程和程序分析领域,尤其涉及一种基于高阶函数的代码依恋检测方法。

技术介绍

[0002]代码依恋就是一种代码异味,是指相比于自身所处的类,某个方法更依赖于其它类,一般情况下主要发生在调取数据时,某个方法为了计算某值,从另一个类中调用诸多的取值方法。但是,代码依恋在一定程度上增加了软件模块的耦合度,从而使系统中一个小的改变可能会致使一系列不可预知的风险。作为程序的开发者应该始终追求低耦合和高内聚。许多实证研究调查了耦合和内聚指标与外部质量指标之间的关系。一方面,已经表明耦合度可以作为易错类的预测因子。另一方面,引起的变化(涟漪效应,可变性)和耦合度之间高度正相关。Binkley等学者表明,低耦合模块(通过耦合依赖度量来衡量)需要的维护工作相对较少,并且维护故障和运行时故障也会相对减少。
[0003]当前,已经提出了诸多方法检测代码依恋。然而,现有的代码依恋检测方法存在一些不足之处。首先,大部分项目代码量大,结构复杂,不同的开发者有不同的编码样式。并且,目前为止学术界还没有对每种代码依恋有统一的定义。其次,上下文信息在代码异味识别过程中有着至关重要的作用,这导致现有检测方法以及静态代码分析工具在识别代码异味上存在一定误差,因为这些工具通常使用阈值方法来检测代码异味并且很少考虑代码所在上下文信息。最后,不同检测工具之间的一致性很低,不太可能产生同样的检测结果,而且很难找到比较这些检测结果的标准,即正确标注好的数据集。同时数据集的选取也十分有难度,若开发人员自己标注的代码异味,难免具有主观性,而目前官方标注的数据集主要是代码异味领域较知名的学者在发表论文中提到的开源数据集,但这些数据集数量较少,选取的软件系统源码也比较局限。

技术实现思路

[0004]本部分的目的在于概述本专利技术的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本申请的说明书摘要和专利技术名称中可能会做些简化或省略以避免使本部分、说明书摘要和专利技术名称的目的模糊,而这种简化或省略不能用于限制本专利技术的范围。
[0005]鉴于上述现有存在的问题,提出了本专利技术。
[0006]因此,本专利技术提供一种基于高阶函数的代码依恋方法,利用函数式编程中的高阶函数特性来精确地检测给定程序中是否存在代码依恋。
[0007]为解决上述技术问题,本专利技术提供如下技术方案,一种基于高阶函数的代码依恋检测方法,包括:
[0008]程序预处理,生成识别多态调用方法名的虚函数表,构造函数调用图,构建每个过程高阶函数形式的函数摘要,通过生成的高阶函数形式的函数摘要,调用点处对函数摘要的函数参数进行相应代入,获取过程间由于过程调用和参数传递产生的代码依恋值信息,
将计算得到的依恋值信息进行汇总,获取每个类中的每个方法的依恋度量值,检测程序中是否存在代码依恋。
[0009]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述程序预处理包括生成待检测程序识别多态调用方法的虚函数表,对程序进行类层次分析,获取类之间继承关系,生成程序的中间表示,根据虚函数在中间表示中的特征,识别虚函数调用,构建完整的函数调用图。
[0010]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述虚函数表包括:
[0011]Bitcast,表示将类实例指针this类型转换为虚函数的指针的指针的指针类型;
[0012]Load,解引用this得到vtable指针,解引用得到虚函数的指针;
[0013]Getelementptr,计算vtable[index]得到要调用的虚函数指向指针的指针;
[0014]Call,调用虚函数;
[0015]根据getelementptr语句,获取虚函数的基类类型btype和表内偏移量offset,通过查询原虚函数表,获取调用的虚函数名称。
[0016]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述构建每个过程高阶函数形式的函数摘要包括根据构建的简化的函数调用图的逆向拓扑排序序列,确定子过程的分析顺序,定义一个参数集合f,包含每个形参对应的对象类型,用高阶函数的参数初始化过程P的对象类型表K,依恋值信息集C为空,遍历过程P中每条指令,根据指令类型,获取P中实例化的对象可能的类型信息和方法自依恋值,和依恋值信息集C,重复步骤,直至过程结束,定义一个Lambda表达式,参数为定义的变量f,返回值为依恋值信息集C,将该Lambda表达式作为过程P的高阶函数形式函数摘要T
p

[0017]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述获取过程间由于过程调用和参数传递产生的代码依恋值信息包括在函数调用点处,将生成的高阶函数式函数摘要中当前对象类型表K进行相应代入,获取被调用函数Q的过程内依恋值信息结果,根据获取的代入后函数Q的过程内依恋值信息结果C
q
,与当前过程P依恋值信息集C
p
进行合并,更新过程P的方法异类依恋值,重复上述步骤直至每个函数调用点遍历完成后,退出所述过程。
[0018]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述获取每个类中的每个方法的依恋度量值包括获取过程间分析结束后最终的依恋值信息集C,按照依恋值信息集C,计算每个类M中的每个方法x对另一个类E的依恋度量值:
[0019]G(M(x),e)=C
x
(E)/C
x
(M)
[0020]其中,e表示依恋值信息集中的异类。
[0021]作为本专利技术所述的一种基于高阶函数的代码依恋检测方法的一种优选方案,其中:所述检测程序中是否存在代码依恋包括根据代码依恋阈值和计算得到的G(M(x),r),判断类的方法是否存在代码依恋,并提取目标候选类的包含类e1,e2,...,e
n
的列表,其中方法x与异类e
i
的依恋度比定义x方法的源类m依恋度更大;
[0022]G(M(x),e)的阈值为1,依恋度检测结束后,当G(M(x),e)>1,说明方法x与异类e的依恋度比定义x方法的源类m依恋度更大,则x存在代码依恋味道,当G(M(x),e)<1,说明x不存在代码依恋味道。
[0023]本专利技术的另一个目的是提供一种基于高阶函数的代码依恋检测方法,其能够考虑类是否在程序运行中被具体实例化以及上下文函数调用关系,提高了代码依恋检测精度。
[0024]一种基于高阶函数的代码依恋检测方法的系统,其特征在于,包括代码解析器、依恋信息搜集器、依恋度计算机器、依恋度可视化器;
[0025]所述代码解析器,用于将待检测的源代码解析为中间表示形式,继续进行处理和分析;
[0026]所述依恋信息搜集器,函数式编程中高阶函数的特性即为可以接受其他函数作为参本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于高阶函数的代码依恋检测方法,其特征在于:包括,程序预处理,生成识别多态调用方法名的虚函数表,构造函数调用图;构建每个过程高阶函数形式的函数摘要;通过生成的高阶函数形式的函数摘要,调用点处对函数摘要的函数参数进行相应代入,获取过程间由于过程调用和参数传递产生的代码依恋值信息;将计算得到的依恋值信息进行汇总,获取每个类中的每个方法的依恋度量值,检测程序中是否存在代码依恋。2.如权利要求1所述的一种基于高阶函数的代码依恋检测方法,其特征在于:所述程序预处理包括生成待检测程序识别多态调用方法的虚函数表,对程序进行类层次分析,获取类之间继承关系,生成程序的中间表示,根据虚函数在中间表示中的特征,识别虚函数调用,构建完整的函数调用图。3.如权利要求2所述的一种基于高阶函数的代码依恋检测方法,其特征在于:所述虚函数表包括Bitcast,表示将类实例指针this类型转换为虚函数的指针的指针的指针类型;Load,解引用this得到vtable指针,解引用得到虚函数的指针;Getelementptr,计算vtable[index]得到要调用的虚函数指向指针的指针;Call,调用虚函数;根据Getelementptr语句,获取虚函数的基类类型btype和表内偏移量offset,通过查询原虚函数表,获取调用的虚函数名称。4.如权利要求3所述的一种基于高阶函数的代码依恋检测方法,其特征在于:所述构建每个过程高阶函数形式的函数摘要包括根据构建的简化的函数调用图的逆向拓扑排序序列,确定子过程的分析顺序,定义一个参数集合f,包含每个形参对应的对象类型,用高阶函数的参数初始化过程P的对象类型表K,依恋值信息集C为空,遍历过程P中每条指令,根据指令类型,获取P中实例化的对象可能的类型信息和方法自依恋值,和依恋值信息集C,重复步骤,直至过程结束,定义一个Lambda表达式,参数为定义的变量f,返回值为依恋值信息集C,将Lambda表达式作为过程P的高阶函数形式函数摘要T
p
。5.如权利要求4所述的一种基于高阶函数的代码依恋检测方法,其特征在于:所述获取过程间由于过程调用和参数传递产生的代码依恋值信息包括在函数调用点处,将生成的高阶函数式函数摘要中当前对象类型表K进行相应代入,获取被调用函数Q的过程内依恋值信息结果,根据获取的代入后函数Q的过程内依恋值信息结果C
q
,与当前过程P依...

【专利技术属性】
技术研发人员:张迎周白瑶瑶潘世文薛渝川谢金言李涵
申请(专利权)人:南京邮电大学
类型:发明
国别省市:

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

1