一种基于程序依赖增强缺陷定位的方法和装置

文档序号:1963644 发布日期:2021-12-14 浏览:25次 >En<

阅读说明:本技术 一种基于程序依赖增强缺陷定位的方法和装置 (Method and device for enhancing defect positioning based on program dependence ) 是由 张天 潘敏学 罗雯波 于 2021-09-09 设计创作,主要内容包括:本发明公开了一种基于程序依赖增强缺陷定位的方法和装置。该方法通过对源代码的语句数据依赖关系分析,将由现有软件工具分析源代码得到的语句缺陷可疑度表结合语句数据依赖关系组成一个由N+1个可疑度值组成的特征值向量作为源代码各个语句的样本输入至支持向量机中进行机器分析,从而得到优化后的缺陷可疑度列表,由此强化定位结果,使得缺陷定位更为精准。(The invention discloses a method and a device for enhancing defect positioning based on program dependence. According to the method, by analyzing the statement data dependency relationship of a source code, a statement defect suspicion table obtained by analyzing the source code by an existing software tool is combined with the statement data dependency relationship to form a characteristic value vector consisting of N &#43;1 suspicion values, the characteristic value vector serves as a sample of each statement of the source code and is input into a support vector machine for machine analysis, and therefore an optimized defect suspicion degree list is obtained, and therefore a positioning result is strengthened, and defect positioning is more accurate.)

一种基于程序依赖增强缺陷定位的方法和装置

技术领域

本发明涉及程序代码分析技术,尤其涉及程序软件源代码的缺陷分析技术。

背景技术

软件不可避免的存在缺陷。软件产品项目中,往往测试周期远大于开发周期,原因就是在测试过程中发现的缺陷对其修复时需要耗费大量的人工。缺陷修复时,首要的难点在于缺陷定位,也就是找到软件代码在哪里出现的缺陷。尤其在软件规模很大时,找到缺陷代码需要耗费大量的时间。

由此,自动化的软件缺陷定位方法和工具逐步受到重视。现有技术中,缺陷定位主要通过两种方法:第一种是通过静态检查工具遍历程序代码,找出其中可疑缺陷之处;第二种是通过程序测试执行过程中的语句覆盖信息,找出其中语句的缺陷可疑之处,比如以Ochiai为代表的基于程序频谱的自动化程序缺陷定位工具。

发明内容

本发明所要解决的问题:对现有工具所找出的语句缺陷可疑之处进行进一步分析,以使得语句缺陷可疑定位更加精准。

为解决上述问题,本发明采用的方案如下:

根据本发明的一种基于程序依赖增强缺陷定位的方法,包括:数据获取步骤、

依赖分析步骤、模型训练步骤和缺陷分析步骤;

所述数据获取步骤,用于:获取训练数据和待评数据;

所述训练数据包括训练用源代码、训练用缺陷可疑度列表和已知缺陷表;

所述待评数据包括待评源代码和待评缺陷可疑度列表;

所述训练用缺陷可疑度列表和待评缺陷可疑度列表均为缺陷可疑度列表;

所述依赖分析步骤:根据输入的源代码构建控制流图,然后通过对所述控制流图的数据流分析,构建以所述控制流图各节点之间的语句数据依赖关系;

所述模型训练步骤包括以下步骤:

步骤ST1:通过所述依赖分析步骤对所述训练用源代码进行语句数据依赖关系分析,得到训练用语句数据依赖关系;

步骤ST2:根据所述训练用语句数据依赖关系、训练用缺陷可疑度列表和已知缺陷表,为所述训练用源代码的各语句构建相应的缺陷定位训练样本;所述缺陷定位训练样本包括特征值向量和缺陷标签;

步骤ST3:将各个缺陷定位训练样本中的特征值向量和缺陷标签输入至支持向量机进行训练;

所述缺陷分析步骤包括以下步骤:

步骤SA1:通过所述依赖分析步骤对所述待评源代码进行语句数据依赖关系分析,得到待评语句数据依赖关系;

步骤SA2:根据所述待评语句数据依赖关系和待评缺陷可疑度列表,为所述待评源代码的各语句构建相应的缺陷定位评估样本;所述缺陷定位评估样本包括特征值向量;

步骤SA3:将各个缺陷定位评估样本中的特征值向量输入至通过所述模型训练步骤训练好了的支持向量机进行评估,得到新的缺陷可疑度列表;

上述各步骤中,

所述缺陷可疑度列表是可疑缺陷定位信息的集合;

所述可疑缺陷定位信息至少包括语句位置和可疑度值;

所述已知缺陷表是已知缺陷定位信息的集合;

所述已知缺陷定位信息至少包括语句位置;

所述语句位置用于指示当前语句在源代码中的位置;

所述缺陷标签用于表示当前语句是否存在已知缺陷,根据所述已知缺陷表确定;

所述特征值向量是由N+1个可疑度值所组成的向量;其中第一个可疑度值是当前语句的可疑度值,其他N个可疑度值是与当前语句存在依赖关系的语句可疑度值最高的N个语句的可疑度值;

所述依赖关系根据所述语句数据依赖关系所确定;

所述语句的可疑度值根据所述缺陷可疑定位表确定。

进一步,根据本发明的基于程序依赖增强缺陷定位的方法,所述依赖分析步骤包括以下步骤:

步骤SY1:根据所输入的源代码构建控制流图;

所述控制流图中,每个节点对应一条源代码语句;

步骤SY2:为所述控制流图中的各个节点解析其中所涉及的变量,得到节点变量信息的集合;所述节点变量信息对应于变量,包括变量信息、变量值类型和语句位置;所述变量值类型分成变更和引用,若所对应的变量在对应的语句中被变更,其变量值类型为变更;若所对应的变量在对应的语句中被使用,其变量值类型为引用;

步骤SY3:通过迭代的方式,将所述控制流图中的各个节点的对应的各个前驱节点的节点变量信息的集合合并至当前节点中形成新的节点变量信息的集合,直到各个节点的节点变量信息的集合不再发生变化;

步骤SY4:提取各个节点的节点变量信息的集合,剔除其中变量值类型为引用的节点变量信息,简化处理后,组成各个节点对应的数据依赖信息作为其语句数据依赖关系;

所述数据依赖信息为当前节点所存续的变量所对应的变量值变更信息的集合;

所述变量值变更信息包括变更位置信息;

所述变更位置信息表示前序节点中变量的变量值被变更时所在的语句位置;

所述前序节点是指控制流图所表示的路径上位于当前节点之前的节点;

所述前驱节点是指当前节点相连的前序节点。

进一步,根据本发明的基于程序依赖增强缺陷定位的方法,所述步骤SY4中将各个节点对应的数据依赖信息转换成与当语句存在依赖关系的语句列表作为其语句数据依赖关系。

根据本发明的一种基于程序依赖增强缺陷定位的装置,包括:数据获取模块、

依赖分析模块、模型训练模块和缺陷分析模块;

所述数据获取模块,用于:获取训练数据和待评数据;

所述训练数据包括训练用源代码、训练用缺陷可疑度列表和已知缺陷表;

所述待评数据包括待评源代码和待评缺陷可疑度列表;

所述训练用缺陷可疑度列表和待评缺陷可疑度列表均为缺陷可疑度列表;

所述依赖分析模块:根据输入的源代码构建控制流图,然后通过对所述控制流图的数据流分析,构建以所述控制流图各节点之间的语句数据依赖关系;

所述模型训练模块包括以下模块:

模块MT1:通过所述依赖分析模块对所述训练用源代码进行语句数据依赖关系分析,得到训练用语句数据依赖关系;

模块MT2:根据所述训练用语句数据依赖关系、训练用缺陷可疑度列表和已知缺陷表,为所述训练用源代码的各语句构建相应的缺陷定位训练样本;所述缺陷定位训练样本包括特征值向量和缺陷标签;

模块MT3:将各个缺陷定位训练样本中的特征值向量和缺陷标签输入至支持向量机进行训练;

所述缺陷分析模块包括以下模块:

模块MA1:通过所述依赖分析模块对所述待评源代码进行语句数据依赖关系分析,得到待评语句数据依赖关系;

模块MA2:根据所述待评语句数据依赖关系和待评缺陷可疑度列表,为所述待评源代码的各语句构建相应的缺陷定位评估样本;所述缺陷定位评估样本包括特征值向量;

模块MA3:将各个缺陷定位评估样本中的特征值向量输入至通过所述模型训练模块训练好了的支持向量机进行评估,得到新的缺陷可疑度列表;

上述各模块中,

所述缺陷可疑度列表是可疑缺陷定位信息的集合;

所述可疑缺陷定位信息至少包括语句位置和可疑度值;

所述已知缺陷表是已知缺陷定位信息的集合;

所述已知缺陷定位信息至少包括语句位置;

所述语句位置用于指示当前语句在源代码中的位置;

所述缺陷标签用于表示当前语句是否存在已知缺陷,根据所述已知缺陷表确定;

所述特征值向量是由N+1个可疑度值所组成的向量;其中第一个可疑度值是当前语句的可疑度值,其他N个可疑度值是与当前语句存在依赖关系的语句可疑度值最高的N个语句的可疑度值;

所述依赖关系根据所述语句数据依赖关系所确定;

所述语句的可疑度值根据所述缺陷可疑定位表确定。

进一步,根据本发明的基于程序依赖增强缺陷定位的装置,所述依赖分析模块包括以下模块:

模块MY1:根据所输入的源代码构建控制流图;

所述控制流图中,每个节点对应一条源代码语句;

模块MY2:为所述控制流图中的各个节点解析其中所涉及的变量,得到节点变量信息的集合;所述节点变量信息对应于变量,包括变量信息、变量值类型和语句位置;所述变量值类型分成变更和引用,若所对应的变量在对应的语句中被变更,其变量值类型为变更;若所对应的变量在对应的语句中被使用,其变量值类型为引用;

模块MY3:通过迭代的方式,将所述控制流图中的各个节点的对应的各个前驱节点的节点变量信息的集合合并至当前节点中形成新的节点变量信息的集合,直到各个节点的节点变量信息的集合不再发生变化;

模块MY4:提取各个节点的节点变量信息的集合,剔除其中变量值类型为引用的节点变量信息,简化处理后,组成各个节点对应的数据依赖信息作为其语句数据依赖关系;

所述数据依赖信息为当前节点所存续的变量所对应的变量值变更信息的集合;

所述变量值变更信息包括变更位置信息;

所述变更位置信息表示前序节点中变量的变量值被变更时所在的语句位置;

所述前序节点是指控制流图所表示的路径上位于当前节点之前的节点;

所述前驱节点是指当前节点相连的前序节点。

进一步,根据本发明的基于程序依赖增强缺陷定位的装置,所述模块MY4中将各个节点对应的数据依赖信息转换成与当语句存在依赖关系的语句列表作为其语句数据依赖关系。

本发明的技术效果如下:本发明通过机器学习技术,对原缺陷定位结果和程序的数据依赖关系进行综合分析,强化定位结果,使得缺陷定位更为精准。

附图说明

图1是本发明实施例的流程图。

其中,SY是依赖分析步骤,ST是模型训练步骤,SA是缺陷分析步骤。

图2是本发明实施例的示例源代码。

图3是本发明实施例根据图2中的示例源代码所构建的控制流图。

具体实施方式

下面结合附图对本发明做进一步详细说明。

如图1所示,本发明的基于程序依赖增强缺陷定位的方法主要包括模型训练步骤ST和缺陷分析步骤SA。

前述数据获取步骤表示的是本发明的输入,具体如何获取,获取数据的样式无需赘述。本发明的输入为:训练数据和待评数据。其中,训练数据用于模型训练步骤ST,包括训练用源代码、训练用缺陷可疑度列表和已知缺陷表。待评数据用于缺陷分析步骤SA,包括待评源代码和待评缺陷可疑度列表。

训练用源代码和待评源代码均为程序源代码。程序源代码可以是各种编程语言编写的源代码,比如c、c++、java、Ada、Go、Phython等。程序源代码采用何种编程语言编写不限。需要强调指出的是,训练用源代码和待评源代码一般要求由同一种编程语言编写而成。

训练用缺陷可疑度列表和待评缺陷可疑度列表均为缺陷可疑度列表。缺陷可疑度列表是可疑缺陷定位信息的集合。可疑缺陷定位信息至少包括语句位置和可疑度值。用于指示当前语句在源代码中的位置,通常用文件名和行号表示,当然也可以结合所在的函数、类、方法等信息。可疑度值是一个取值范围0至1之间的度量值。当可疑度值为1时表示该语句存在缺陷;当可疑度值为0时表示该语句不存在缺陷。缺陷可疑度列表通常由其他软件工具生成,比如前述的Ochiai。

已知缺陷表是已知缺陷定位信息的集合;已知缺陷定位信息至少包括语句位置。当然本领域技术人员理解,已知缺陷表也可以直接和前述的缺陷可疑度训练表合并,此时,合并后的表单中,可疑度值为1的项目即为已知缺陷所对应的信息。本发明将其分开仅仅是为了描述的方便。

模型训练步骤ST包括以下步骤:

步骤ST1,也就是,训练用源代码的语句数据依赖分析,具体为:对训练用源代码进行语句数据依赖关系分析,得到训练用语句数据依赖关系。

步骤ST2,也就是,构建缺陷定位训练样本,具体为:根据训练用语句数据依赖关系、训练用缺陷可疑度列表和已知缺陷表,为训练用源代码的各语句构建相应的缺陷定位训练样本;缺陷定位训练样本包括特征值向量和缺陷标签。缺陷标签用于表示当前语句是否存在已知缺陷,根据已知缺陷表确定,通常以0,1表示。特征值向量是由N+1个可疑度值所组成的向量;其中第一个可疑度值是当前语句的可疑度值,其他N个可疑度值是与当前语句存在依赖关系的语句可疑度值最高的N个语句的可疑度值。这里的依赖关系是由所输入的语句数据依赖关系所确定。这里的语句的可疑度值根据所输入的缺陷可疑定位表确定。

步骤ST3,也就是,训练支持向量机步骤,具体为:将各个缺陷定位训练样本中的特征值向量和缺陷标签输入至支持向量机进行训练。

缺陷分析步骤SA包括以下步骤:

步骤SA1,也就是,待评源代码的语句数据依赖分析,具体为:对待评源代码进行语句数据依赖关系分析,得到待评语句数据依赖关系。

步骤SA2:根据待评语句数据依赖关系和待评缺陷可疑度列表,为待评源代码的各语句构建相应的缺陷定位评估样本;缺陷定位评估样本包括特征值向量。

步骤SA3:将各个缺陷定位评估样本中的特征值向量输入至通过模型训练步骤训练好了的支持向量机进行评估,得到新的缺陷可疑度列表。

上述步骤中,步骤ST1和步骤SA1实质相同,不同的是两者输入的程序源代码不同。本实施例中,步骤ST1和步骤SA1通过依赖分析步骤SY实现。具体在实施时,依赖分析步骤SY可以体现为一次函数调用所执行的机器处理过程。依赖分析步骤SY用以分析语句间的数据依赖关系,输出语句数据依赖关系。前述的训练用语句数据依赖关系和待评语句数据依赖关系均为依赖分析步骤SY所输出的语句数据依赖关系。

依赖分析步骤,更为具体来说,根据输入的源代码构建控制流图,然后通过对所述控制流图的数据流分析,构建以所述控制流图各个节点之间的语句数据依赖关系。这里的语句间的数据是指程序变量。这里的数据流也就是程序变量被变更和引用的情形。前述的语句数据依赖关系也就是语句变量之间的依赖关系。依赖分析步骤,本实施例采用如下方法实现:

步骤SY1:根据所输入的源代码构建控制流图;

步骤SY2:为控制流图中的各节点解析其所涉及的变量,得到节点变量信息的集合;

步骤SY3:通过迭代的方式,将控制流图中的各个节点的对应的各个前驱节点的节点变量信息的集合合并至当前节点中形成新的节点变量信息的集合,直到各个节点的节点变量信息的集合不再发生变化;

步骤SY4:提取各个节点的节点变量信息的集合,剔除其中变量值类型为引用的节点变量信息,简化处理后,组成各个节点对应的数据依赖信息作为其语句数据依赖关系。

步骤SY1中,根据源代码构建控制流图为本领域技术人员所熟悉。需要说明的是,一般控制流图中,每个节点为为一个程序基本块。比如,在图2所示例的代码是一段列举菲波那切数列前100的数值的由c++语言编写的程序段。其中,第1、2、3、4行构成一个程序基本块,组成一个控制流图的节点。第10、11、12、13行构成一个程序基本块,组成一个控制流图的节点。而本实施例中,为了便于分析定位,将这样的程序基本块拆分单独的语句。也就是,本实施例中,以每一个语句作为一个控制流图的节点。由此,第1、2、3、4行所构成的程序基本块被分解成四个控制流图的节点,第10、11、12、13行所构成的程序基本块也同样被分解成四个控制流图的节点。参照图3示例,本实施例所构建的控制流图以语句作为节点,由于示例代码中,每个语句为一行,且一行内有且只有一个语句,因此,图3所示例的控制流图以行号作为节点标识,节点标识Line1~Line16分别为对应语句所在的行号。

步骤SY2中,节点变量信息对应于变量,包括变量信息、变量值类型和语句位置。其中,变量信息通常以变量名指示,在代码量较多情形下,可以结合函数名、方法名、类名作为变量信息,用于指定节点变量信息所对应的变量。比如,图2示例代码假如是一段函数名为Fabonacci100内的代码,则其中的变量a,b,i,t可以分别以Fabonacci100_a,Fabonacci100_b, Fabonacci100_i, Fabonacci100_t作为变量信息进行指代。变量值类型分成变更和引用,若所对应的变量在对应的语句中被赋值或者创建,其变量值类型为变更。若所对应的变量在对应的语句中被使用,其变量值类型为引用。比如,节点Line2对应的语句为a=1,则该节点所对应的节点变量信息集合可以表示为{{a,变更,Line2}},其中a为变量名,变更表示为变量a的变量值在该语句中被赋值而发生了变化,Line2为通过行号指示的语句位置。

为处理简单起见,本实施例中,控制流图以函数或者类的方法为基本单位。若代码中出现函数或方法的调用,则将该函数或方法的调用作为一个语句构建一个节点。函数或方法调用时,其中的形式化参数则作为该语句中对该变量的赋值行为。因为函数或方法的形参可能在函数和方法的执行过程中被赋值。另外,对于函数或方法调用可能涉及全局变量或者类成员,一种方式是将所有全局变量和类成员对应的节点变量信息加入至该语句的节点变量信息的集合中,另一种方式是将函数或方法所涉及的全局变量和类成员组成对应的节点变量信息加入至该语句的节点变量信息的集合。

此外,需要指出的是每个语句不一定涉及变量,比如,节点Line4和Line16对应的语句为函数print的调用,该语句不涉及变量,此时其对应的节点变量信息的集合为空。

步骤SY3是一个循环迭代的过程。相比步骤SY3,步骤SY2是节点的节点变量信息的集合的初始化过程。步骤SY3的循环迭代中,每一轮迭代过程都按照控制流图遍历其各个节点,将控制流图中的各个节点的对应的各个前驱节点的节点变量信息的集合合并至当前节点中形成新的节点变量信息的集合。前驱节点是指当前节点相连的前序节点。前序节点是指控制流图所表示的路径上位于当前节点之前的节点。比如图3所示例的控制流图中,节点Line5的前驱节点为:节点Line4、节点Line8和节点Line13。

以图2所示例的代码和图3所示例的控制流图为例。在步骤SY2后,控制流图的各个节点的节点变量信息的集合分别为:

节点Line1:{{a,变更,Line1},{b,变更,Line1}};

节点Line2:{{a,变更,Line2}};

节点Line3:{{b,变更,Line3}};

节点Line4:{};

节点Line5:{{i,变更,Line5}};

节点Line7:{{a,引用,Line7}};

节点Line8:{{a,引用,Line8}};

节点Line10:{{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10}};

节点Line11:{{a,引用,Line11},{b,变更,Line11}};

节点Line12:{{t,引用,Line12},{a,变更,Line12}};

节点Line13:{{i,引用,Line13},{a,引用,Line13}};

节点Line16:{}。

进行第一轮步骤SY3的控制流图遍历后,控制流图的各个节点的节点变量信息的集合分别为:

节点Line1:{{a,变更,Line1},{b,变更,Line1}};

节点Line2:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2}};

节点Line3:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3}};

节点Line4:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3}};

节点Line5:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13}};

节点Line7:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7}};

节点Line8:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line8}};

节点Line10:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10}};

节点Line11:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11}};

节点Line12:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line13:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line16:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{a,引用,Line8},{a,引用,Line13}}。

进行第二轮步骤SY3的控制流图遍历后,控制流图的各个节点的节点变量信息的集合分别为:

节点Line1:{{a,变更,Line1},{b,变更,Line1}};

节点Line2:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2}};

节点Line3:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3}};

节点Line4:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3}};

节点Line5:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{a,引用,Line11},{b,变更,Line11},{a,变更,Line12}};

节点Line7:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{a,引用,Line11},{b,变更,Line11},{a,变更,Line12}};

节点Line8:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{a,引用,Line11},{b,变更,Line11},{a,变更,Line12}};

节点Line10:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line11:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line12:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line13:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{ t,变更,Line10},{a,引用,Line11},{b,变更,Line11},{t,引用,Line12},{a,变更,Line12}};

节点Line16:{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{a,引用,Line8},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{a,引用,Line11},{b,变更,Line11},{a,变更,Line12}}。

两轮步骤SY3的控制流图遍历后,控制流图的各个节点的节点变量信息的集合不再发生变化,结束步骤SY3的循环迭代。

此外,本领域技术人员理解,将节点的各个前驱节点的节点变量信息的集合合并至当前节点时,需要考虑变量的作用域。比如,节点Line5的节点变量信息的集合{{a,变更,Line1},{b,变更,Line1},{a,变更,Line2},{b,变更,Line3},{i,变更,Line5},{a,引用,Line8},{i,引用,Line13},{a,引用,Line13},{a,引用,Line7},{a,引用,Line10},{b,引用,Line10},{a,引用,Line11},{b,变更,Line11},{a,变更,Line12}}中,变量i在for语句中定义,其作用域仅限于for循环体,而节点Line16则在for循环体外,因此,将节点Line16的前驱节点Line5的节点变量信息的集合合并至节点Line16上时,应当将相关的变量i所对应的节点变量信息剔除。再比如,变量t作为临时变量的作用域仅限于语句Line10、Line11、Line12和Line13,因此在将节点Line5的前驱节点Line13的节点变量信息的集合合并至节点Line5上时,应当将临时变量t相关的节点变量信息剔除。

步骤SY4中,数据依赖信息为当前节点所存续的变量所对应的变量值变更信息的集合;变量值变更信息包括变更位置信息的集合;所述变更位置信息表示前序节点中变量的变量值被变更时所在的语句位置。续前例,图2所示例的代码所形成的各节点的节点变量信息的集合,剔除其中变量值类型为引用的节点变量信息,由于剩下的变量值类型都是变更,变量值类型的存在没有什么意义,因此再去除其中的变量值类型参数,而后得到各节点的数据依赖信息如下:

节点Line1:{{a,Line1},{b,Line1}};

节点Line2:{{a,Line1},{b,Line1},{a,Line2}};

节点Line3:{{a,Line1},{b,Line1},{a,Line2},{b,Line3}};

节点Line4:{{a,Line1},{b,Line1},{a,Line2},{b,Line3}};

节点Line5:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{b,Line11},{a,Line12}};

节点Line7:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{b,Line11},{a,Line12}};

节点Line8:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{b,Line11},{a,Line12}};

节点Line10:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{t,Line10},{b,Line11},{a,Line12}};

节点Line11:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{t,Line10},{b,Line11},{a,Line12}};

节点Line12:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{t,Line10},{b,Line11},{a,Line12}};

节点Line13:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{i,Line5},{t,Line10},{b,Line11},{a,Line12}};

节点Line16:{{a,Line1},{b,Line1},{a,Line2},{b,Line3},{b,Line11},{a,Line12}}。

再对上述数据依赖信息做如下简化处理:

1、剔除节点本身所指包括的语句;

2、剔除上述数据依赖信息中的变量信息。

于是得到的用以表示语句数据依赖关系的各个节点的数据依赖信息如下:

节点Line1:{};

节点Line2:{Line1};

节点Line3:{Line1,Line2};

节点Line4:{Line1,Line2,Line3};

节点Line5:{Line1,Line2,Line3,Line11,Line12};

节点Line7:{Line1,Line2,Line3,Line5,Line11,Line12};

节点Line8:{Line1,Line2,Line3,Line5,Line11,Line12};

节点Line10:{Line1,Line2,Line3,Line5,Line11,Line12};

节点Line11:{Line1,Line2,Line3,Line5,Line10,Line12};

节点Line12:{Line1,Line2,Line3,Line5,Line10,Line11 };

节点Line13:{Line1,Line2,Line3,Line5,Line10,Line11,Line12};

节点Line16:{Line1,Line2,Line3,Line11,Line12}。

上述语句数据依赖关系中,比如节点Line12中的数据依赖信息为:{Line1,Line2,Line3,Line5,Line10,Line11 },表示语句Line12依赖于语句Line1,Line2,Line3,Line5,Line10,Line11,而语句Line1,Line2,Line3,Line5,Line10,Line11则被语句Line12依赖。

步骤ST2具体可以分成两个步骤:

步骤ST21:根据训练用语句数据依赖关系和训练用缺陷可疑度列表构建各个语句的特征值向量;

步骤ST22:根据已知缺陷表为各个语句打上是否存在缺陷的缺陷标签。

步骤SA2具体也就是根据根据待评语句数据依赖关系和待评缺陷可疑度列表构建各个语句的特征值向量。

因此步骤SA2实质与步骤ST21相同,简单来说,也就是,根据语句数据依赖关系和缺陷可疑度列表构建各个语句的特征值向量。具体步骤为,对源代码进行语句遍历,对所遍历到的每条语句做如下步骤的处理:

首先,从缺陷可疑度列表中找到当前语句是否存在可疑度值,若存在,则将所找到的可疑度值作为该语句特征值向量的第一个元素;若不存在,则将该语句特征值向量的第一个元素可疑度值取为0。

然后,根据语句数据依赖关系找出与当前语句存在依赖关系的语句,然后从缺陷可疑度列表中提取与当前语句存在依赖关系的各个语句的可疑度值,选取其中可疑度值最高的N个可疑度值作为该语句特征值向量的后N个元素;若与当前语句存在依赖关系的语句数不超过N,或者与当前语句存在依赖关系的语句在缺陷可疑度列表中存在可疑度值的不超过N个,则剩下的以0作为可疑度值填充。本实施例中N取值为6,本领域技术人员也可以将其取值为7、8或者其他数值。

也就是说,语句的特征向量是由N+1个可疑度值所组成的向量。

步骤ST3和SA3的核心在于支持向量机。支持向量机,也就是,SVM,是一类按监督学习方式对数据进行二元分类的广义线性分类器。本实施例中,支持向量机采用线性支持向量机,也就是,Linear SVM。本实施例中的线性支持向量机为本领域技术人员所熟悉,本说明书不再赘述。

此外,步骤SA2实质与步骤ST21中需要找出与当前语句存在依赖关系的语句,而本实施例中,每个语句的数据依赖信息是依赖于该语句的语句列表。为简化步骤SA2和步骤ST21的处理,也可以将前述各个语句的数据依赖信息之间转换成与当前语句存在依赖关系的语句列表。

18页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:代码开发的处理方法、装置、电子设备与存储介质

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!