CN114780403A - 基于增强代码属性图的软件缺陷预测方法及预测装置 - Google Patents

基于增强代码属性图的软件缺陷预测方法及预测装置 Download PDF

Info

Publication number
CN114780403A
CN114780403A CN202210426987.8A CN202210426987A CN114780403A CN 114780403 A CN114780403 A CN 114780403A CN 202210426987 A CN202210426987 A CN 202210426987A CN 114780403 A CN114780403 A CN 114780403A
Authority
CN
China
Prior art keywords
defect
node
software
enhanced
matrix
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
Application number
CN202210426987.8A
Other languages
English (en)
Inventor
艾骏
许嘉熙
施韬
邵义康
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beihang University
Original Assignee
Beihang University
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Beihang University filed Critical Beihang University
Priority to CN202210426987.8A priority Critical patent/CN114780403A/zh
Publication of CN114780403A publication Critical patent/CN114780403A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3616Software analysis for verifying properties of programs using software metrics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/425Lexical analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computational Linguistics (AREA)
  • Stored Programmes (AREA)

Abstract

本申请公开了一种基于增强代码属性图的软件缺陷预测方法及预测装置。其中,所述软件缺陷预测方法,包括以下具体步骤:对软件源代码进行图形化建模,得到增强代码属性图;根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。本申请通过增强代码属性图、缺陷特征识别区域子图及软件缺陷预测模型的综合运用,提高了软件缺陷预测性能。

Description

基于增强代码属性图的软件缺陷预测方法及预测装置
技术领域
本申请涉及软件可靠性技术领域,尤其涉及一种基于增强代码属性图的软件缺陷预测方法及预测装置。
背景技术
21世纪以来,软件在社会生活中的地位日益提升,已经不仅仅局限于工程、科研、经济等专业领域,更是走进了千家百户,成为了人们生活中举足轻重的工具。随着软件系统规模日益增加,复杂程度呈几何式上升,软件的缺陷也与日俱增,而软件缺陷也直接影响到了人民生活的方方面面。在软件的全寿命周期当中,如何提高软件的质量,对软件的缺陷进行识别和修复已经成为一个重要的研究命题。在软件可靠性研究中,软件缺陷检测是极其重要的环节,预防为主的思想是我们应当秉持的首要态度。美国国家航空航天局(NASA)较早地启动了软件缺陷预测技术的研究,并开展了软件度量程序(Metric Data Program,MDP)项目。该项目是美国国家航空航天局提供的开源的软件缺陷预测使用数据集,为世界范围内的软件缺陷预测提供了宝贵的数据支撑。我国的国家自然科学基金委员会也启动了“可信软件基础研究”重大研究计划,将软件缺陷预测作为重要科学目标。
机器学习技术的逐渐成熟使得数据驱动型的软件缺陷预测变得更为有效。大量实例的研究表明,利用机器学习中的关联规则、分类器算法、聚类算法等,可以取得很好的缺陷预测效果,对于提高软件可靠性有着显著的作用。目前的软件缺陷预测主要是从项目的历史数据中提取人工设计的缺陷度量特征用于训练,将训练得到的模型用于预测待测软件版本的模块是否含有缺陷。
在实现现有技术的过程中,发明人发现:
当前软件缺陷预测的数据载体是由人工设计的软件度量元,人工设计的缺陷特征主要属于可认知的浅层特征,难以表征包括代码语义在内的更多软件的非线性的深层特征;当前普遍使用项目的历史数据对同一项目的未来版本缺陷进行预测,这一方法在实践中很难获得充足的训练数据;当前的软件缺陷预测均属于对软件模块含缺陷倾向性的二分类判断,而缺乏对软件缺陷类型的多分类识别预测。
因此,需要提供一种可以表征软件源代码深层特征、不依赖历史数据、可以对软件缺陷类型进行多分类识别预测的软件缺陷预测技术方案。
发明内容
本申请实施例提供一种基于增强代码属性图的软件缺陷预测技术方案,用以解决以下技术问题:目前软件缺陷度量元主要根据专家经验将软件程序元素离散化处理,在文件或类颗粒度上的统计结果设定的特征指标组成序列,属于可认知的浅层特征。然而,现实世界中的很多度量元与缺陷间并不具备简单线性关系,因此传统度量元在实际的软件工程项目中效果不太理想,对实际面向开源软件的缺陷预测并不能取得好的预测效果。总的来说,现有软件缺陷预测技术中存在难以表征深层特征、依赖历史数据、只能二分类判断等技术问题。
本申请提供的一种基于增强代码属性图的软件缺陷预测方法,包括以下具体步骤:
对软件源代码进行图形化建模,得到增强代码属性图;
根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;
根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;
处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;
通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
进一步的,所述增强代码属性图包括:
解析所述软件源代码得到的抽象语法树;
由所述抽象语法树中的第一节点指向第二节点的抽象语法树边;
用于连接存在控制依赖关系的两个语句对应的两个子树根节点的控制流边;
用于连接存在数据依赖关系的两个语句对应的两个子树根节点的数据流边;
用于连接存在调用关系的两个语句对应的两个子树根节点的调用边。
进一步的,对软件源代码进行图形化建模,得到增强代码属性图,包括以下具体步骤:
对软件源代码构建抽象语法树;
对所述抽象语法树进行依赖关系解析,得到依赖关系表征数据;
对所述抽象语法树进行调用关系解析,得到调用关系表征数据;
融合所述抽象语法树、所述依赖关系表征数据、所述调用关系表征数据,得到包含树节点、节点连接边、依赖关系连接边、函数调用关系连接边的增强代码属性图。
进一步的,所述依赖关系连接边、所述函数调用关系连接边由以下步骤得到:
根据所述依赖关系表征数据,用有向边连接所述抽象语法树中存在依赖关系的根节点,得到依赖关系连接边;
根据所述调用关系表征数据,用有向边连接所述抽象语法树中存在函数调用关系的根节点,得到函数调用关系连接边。
进一步的,根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合,包括以下具体步骤:
确定目标缺陷类型;
对所述目标缺陷类型进行语法分析,得到缺陷语法特征;
根据所述缺陷语法特征,确定潜在缺陷位点定位规则;
根据所述潜在缺陷位点定位规则,定位所述增强代码属性图的潜在缺陷节点,得到潜在缺陷节点集合。
进一步的,根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图,包括以下具体步骤:
根据所述潜在缺陷节点集合,确定所述增强代码属性图对应的代码语句,得到候选语句集合;
根据所述候选语句集合,确定所述增强代码属性图对应的节点,得到候选节点集合;
通过区域提取算法处理所述候选节点集合,得到缺陷特征识别区域子图。
进一步的,处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵,包括以下具体步骤:
预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库;
根据所述语料库和词嵌入方法,确定所述缺陷特征识别区域子图对应的语义矩阵;
根据图拓扑结构和所述语义矩阵,得到所述缺陷特征识别区域子图对应的节点属性矩阵和缺陷结构矩阵。
进一步的,预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库,包括以下具体步骤:
对所述增强代码属性图中每个节点对应的源代码进行分词处理,得到第一单词集合数据;
按照预设条件,过滤所述第一单词集合数据,得到第二单词集合数据;
对所述第二单词集合数据进行提取词干处理,得到与所述增强代码属性图对应的语料库。
进一步的,所述软件缺陷预测模型采用图卷积神经网络。
本申请还提供一种基于增强代码属性图的软件缺陷预测装置,包括:
抽象模块,用于对软件源代码进行图形化建模,得到增强代码属性图;
筛选模块,用于根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;
提取模块,用于根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;
处理模块,用于处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;
预测模块,用于通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
本申请提供的实施例至少具有以下有益效果:
通过增强代码属性图、缺陷特征识别区域子图及软件缺陷预测模型的综合运用,有效捕捉代码语法特征、语义特征、控制和数据关系等缺陷特征的代码增强图表示及其构造方法,解决软件缺陷预测的数据表示问题;针对特定缺陷类型在代码图表示中定位和提取可能存在缺陷的潜在缺陷候选区域子图算法,解决软件缺陷预测中的样本提取问题,并细化软件缺陷预测的粒度;基于深度学习的软件缺陷高风险区域识别方法,将缺陷特征识别区域子图转化为可学习的结构化数据,实现对软件缺陷特征识别区域的缺陷预测。总体来说,本申请可以表征软件源代码深层特征、不依赖历史数据、可以对软件缺陷类型进行多分类识别预测,有效提高了软件缺陷预测性能。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测方法的流程图;
图2为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测方法中获取增强代码属性图的流程图;
图3为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测方法中获取潜在缺陷节点集合的流程图;
图4为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测方法中获取缺陷特征识别区域子图的流程图;
图5为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测方法中获取节点属性矩阵和缺陷结构矩阵的流程图;
图6为本申请实施例提供的一种基于增强代码属性图的软件缺陷预测装置的示意图。
100 软件缺陷预测装置
11 抽象模块
12 筛选模块
13 提取模块
14 处理模块
15 预测模块
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
请参照图1,本申请提供的一种基于增强代码属性图的软件缺陷预测方法,包括以下具体步骤:
S100:对软件源代码进行图形化建模,得到增强代码属性图。
可以理解的是,软件源代码在数据结构、语法、语义上均有特定的标识形式,可以以此为依据将软件源代码进行图形化建模处理。在具体的实施过程中,对软件源代码进行面向软件缺陷识别的图形化建模,对缺陷代码进行抽象处理,将缺陷代码转化成结构化数据,构建软件代码的抽象模型,用以表征代码上下文信息、程序结构、控制流和数据流等信息,获取缺陷的代码语法和语义信息。需要说明的是,基于深度学习软件缺陷识别的核心是需要创建适当的缺陷表示。本申请提出了增强代码属性图,一种可以储存代码语法语义信息的图结构作为软件代码的图表示形式,更能表征源代码的原有含义,其准确性更高。
进一步的,所述增强代码属性图包括:
解析所述软件源代码得到的抽象语法树;
由所述抽象语法树中的第一节点指向第二节点的抽象语法树边;
用于连接存在控制依赖关系的两个语句对应的两个子树根节点的控制流边;
用于连接存在数据依赖关系的两个语句对应的两个子树根节点的数据流边;
用于连接存在调用关系的两个语句对应的两个子树根节点的调用边。
需要说明的是,本申请中的软件缺陷指的是软件的代码缺陷,由一条或多条代码语句组成,表示为d={s1,s2,...,sm},其中s表示代码语句,m表示代码语句数量。根据通用的规则,可以将一段程序解析为一棵抽象语法树(AST),每条代码语句si(1<i<m)都可以映射到AST中的一颗子树ti。在具体的实施过程中,定义一棵抽象语法子树
Figure BDA0003608813230000071
其中Vi={vi,1,vi,2,...,vi,n}表示抽象语法子树ti的节点集,
Figure BDA0003608813230000072
表示抽象语法树Ti的抽象语法树边集。
Figure BDA0003608813230000073
表示抽象语法子树ti中从节点vi,v指向节点vi,w的抽象语法树边。抽象语法树的根节点为
Figure BDA0003608813230000074
在定义控制流边时,假设存在两条语句si,sj(i≠j),如果语句sj控制依赖于语句si,则
Figure BDA0003608813230000075
表示从语句si对应的子树根节点
Figure BDA0003608813230000076
连接到语句sj对应的子树根节点
Figure BDA00036088132300000711
的一条控制流边。在定义数据流边时,假设存在两条语句si,sj(i≠j),如果语句sj数据依赖于语句si,则
Figure BDA0003608813230000078
表示从语句si对应的子树根节点
Figure BDA0003608813230000079
连接到语句sj对应的子树根节点
Figure BDA00036088132300000710
的一条数据流边。在定义调用边时,假设存在两条语句si,sj(i≠j),如果语句sj调用了语句si定义的类或者方法,则
Figure BDA0003608813230000081
表示从语句si对应的子树根节点
Figure BDA0003608813230000082
连接到语句sj对应的子树根节点
Figure BDA0003608813230000083
的一条调用边。对于一个由语句组成的程序模块也可以指一个代码文件,它所对应的增强代码属性图是由每条语句对应的节点及边组成的,可以表示为G=(V,E)。其中,V={vi}表示由程序模块生成的抽象语法树中的所有节点的集合。E={e(i,j)|i≠j}表示程序模块的节点之间的所有连接关系边,包括抽象语法树边、控制流边、数据流边和调用边。其中,每个节点vi有三个主要属性:节点类型、节点源代码和节点位置;每条边e(i,j)也有三个主要属性:起始节点、目标节点和边类型。
具体的,请参照图2,对软件源代码进行图形化建模,得到增强代码属性图,包括以下具体步骤:
S101:对软件源代码构建抽象语法树;
S102:对所述抽象语法树进行依赖关系解析,得到依赖关系表征数据;
S103:对所述抽象语法树进行调用关系解析,得到调用关系表征数据;
S104:融合所述抽象语法树、所述依赖关系表征数据、所述调用关系表征数据,得到包含树节点、节点连接边、依赖关系连接边、函数调用关系连接边的增强代码属性图。
需要指出的是,这里的软件源代码可以是C++、Java、Python、PHP等各种语言代码。在一种具体的实施过程中,假设这里的软件源代码是Java语言代码。对基于Java语言的软件源代码进行解析与构建抽象语法树时,可以使用开源代码解析工具ANLTR将代码文件进行扫描,解析为编译单元,构建抽象语法树。这里的抽象语法树由树节点以及节点之间的连接边构成。在进行依赖关系解析时,对构建的抽象语法树进行遍历,计算代码语句间的控制依赖关系和数据依赖关系,最终得到依赖关系表征数据。在进行调用关系解析时,对构建的抽象语法树进行遍历,提取语法树中的函数调用节点和定义节点,构建调用关系,最终得到调用关系表征数据。通过将抽象语法树与依赖关系、调用关系融合,可以最终得到增强代码属性图。这里的连接边属性包括:源节点、目标节点和边类型。其中,有向边由源节点指向目标节点。最终,所有节点、抽象语法树连接边、依赖关系连接边和函数调用关系连接边共同构成了一个有向无环图。这里的向无环图可以理解为增强代码属性图。
进一步的,所述依赖关系连接边、所述函数调用关系连接边由以下步骤得到:
根据所述依赖关系表征数据,用有向边连接所述抽象语法树中存在依赖关系的根节点,得到依赖关系连接边;
根据所述调用关系表征数据,用有向边连接所述抽象语法树中存在函数调用关系的根节点,得到函数调用关系连接边。
需要说明的是,依赖关系表征数据表征着每一个语句间依赖关系,可以在抽象语法树中定位依赖和被依赖语句的根节点,将两者的根节点用有向边进行连接,可以最终得到依赖关系连接边。调用关系表征数据表征着每一个函数调用关系,在抽象语法树中定位函数定义和函数调用语句的根节点,将两者的根节点用有向边进行连接,可以最终得到函数调用关系连接边。
S200:根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合。
可以理解的是,根据代码文件的大小,生成的增强代码属性图包含的节点从数十个到数千个不等。增强代码属性图中和缺陷相关的节点往往只有十几个关键节点和几十个上下文节点,因此需要对其进行修剪以避免引入大量冗余和噪声。软件缺陷的类型丰富多样,每种类型的缺陷往往都发生在一些特定的语法结构中,不存在可以提取代码中所有类型的缺陷样本的通用方法。本申请根据不同类型的缺陷单独进行语法特征提取,制定特定的潜在缺陷位点定位规则,并以此为依据进一步得到潜在缺陷节点集合。这里的潜在缺陷节点集合可以理解为根据潜在缺陷位点定位规则确定的潜在缺陷节点的数据集合。
具体的,请参照图3,根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合,包括以下具体步骤:
S201:确定目标缺陷类型;
S202:对所述目标缺陷类型进行语法分析,得到缺陷语法特征;
S203:根据所述缺陷语法特征,确定潜在缺陷位点定位规则;
S204:根据所述潜在缺陷位点定位规则,定位所述增强代码属性图的潜在缺陷节点,得到潜在缺陷节点集合。
需要指出的是,这里的目标缺陷类型可以根据已知常用的缺陷表确定,也可以根据实际需要进行自定义。在一种具体的实施方式中,本申请以常见缺陷表Common WeaknessEnumeration(CWETM)中的典型缺陷类型作为目标缺陷类型。CWE是一个常见软硬件缺陷类型的开源分类列表,对部分软件缺陷做出了详细的分类标准。在确定目标缺陷类型时,可以选择CWE中的三种典型缺陷类型:编号为CWE-129的数组越界缺陷、编号为CWE-606的循环条件缺陷、编号为CWE-369的除零缺陷。数组越界缺陷,指的是产品在计算或使用数组索引时使用了不受信任的输入,但没有对索引进行验证或错误地进行验证,导致无法确保索引是引用了数组中的有效的位置。循环条件缺陷,指的是产品没有正确检查用于循环条件的输入,可能会导致拒绝服务或由于过度循环而导致其他后果,如无法进入循环或造成死循环等。除零缺陷,指的是在计算时对值进行了除以零的操作。
通过缺陷类型的语法特征分析,可以得到缺陷语法特征。在具体的实施过程中,通过对目标缺陷类型进行语法分析,提取同一缺陷类型中共有的语法特征。这里所说的缺陷语法特征是指对缺陷发生有必要性关系的语法结构,包含该语法结构的代码不一定含有缺陷,但含有该类型缺陷的代码应当至少包含缺陷语法特征中的一条或多条。在一种具体的应用场景中,通过语法特征分析,可以发现:编号为CWE-129的数组越界缺陷,主要发生在数组的访问和调用中,容易造成越界错误;编号为CWE-606的循环条件缺陷,主要与各种类型的循环的代码块、控制方式和循环条件有关,容易引起死循环等错误;编号为CWE-369的除零缺陷,通常在向产品提供意外值或出现错误而未正确检测到时会出现此缺陷,如除法表达式中常出现除零缺陷。
在确定潜在缺陷位点定位规则时,可以根据分析得到的缺陷语法特征,指定具体的潜在缺陷位点定位规则。这里的缺陷语法特征可以理解为缺陷类型的语法特征。在一种具体的实施方式中,编号为CWE-129的数组越界缺陷的潜在缺陷位点定位规则为“数组初始化”节点和“数组访问”节点。编号为CWE-606的循环条件缺陷的潜在缺陷位点定位规则为“for循环控制”节点、“while循环表达式”节点和“doWhile语句”节点。编号为CWE-369的除零缺陷的潜在缺陷位点定位规则为节点源码包含“/”或“%”的“算术操作符号”节点。
在具体进行潜在缺陷节点定位时,根据确定的潜在缺陷位点定位规则,遍历生成的增强代码属性图。将增强代码属性图中符合潜在缺陷位点定位规则的所有节点添加到集合中,得到集合
Figure BDA0003608813230000111
该集合P即为潜在缺陷节点集合。
需要注意的是,除了上述类型的缺陷外,本申请还可以使用其他缺陷类型进行定位,只要该缺陷类型能够总结出一个共同的语法特征,并且该语法特征能够转化为一个清晰的定位规则即可。
S300:根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图。
需要说明的是,这里的缺陷特征识别区域子图可以理解为软件缺陷特征识别区域。在确定软件缺陷特征识别区域时,可以通过区域提取算法,根据得到的潜在缺陷节点集合,在增强代码属性图中定位软件缺陷特征识别区域。可以理解的是,在增强代码属性图中,除了缺陷实际发生的节点外,这些节点附近的节点也包含了大量的缺陷信息。因此,缺陷样本应当是一个区域而不是几个节点。本申请利用缺陷特征识别区域提取算法从增强代码属性图中提取出和潜在缺陷节点相关的节点,构成缺陷特征识别区域子图,作为软件缺陷高风险区域识别的样本单位。优选的,这里的区域提取算法可以采用k阶最近邻算法。
进一步的,请参照图4,根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图,包括以下具体步骤:
S301:根据所述潜在缺陷节点集合,确定所述增强代码属性图对应的代码语句,得到候选语句集合;
S302:根据所述候选语句集合,确定所述增强代码属性图对应的节点,得到候选节点集合;
S303:通过区域提取算法处理所述候选节点集合,得到缺陷特征识别区域子图。
需要指出的是,在构建候选语句集合时,对于一个增强代码属性图,其针对特定缺陷的潜在缺陷节点集合可以表示为
Figure BDA0003608813230000121
其中,
Figure BDA0003608813230000122
Figure BDA0003608813230000123
Figure BDA0003608813230000124
指一个符合潜在缺陷节点语法特征的节点,即潜在缺陷节点。每个潜在缺陷节点
Figure BDA0003608813230000125
可以映射到节点所在的对应的语句si。缺陷节点集合对应的每条候选语句组成了一个语句集合S={s1,...,si}。语句集合S={s1,...,si}中的每条语句si以及在增强代码属性图中和该语句对应的根节点有调用边或数据流边或控制流边连接的节点对应的语句共同组成了候选语句集合
Figure BDA0003608813230000126
Figure BDA0003608813230000127
其中,集合
Figure BDA0003608813230000128
指的是和语句si有调用关系或数据依赖关系的语句组成的集合。这里的数据依赖关系包括控制依赖关系和数据依赖关系。在构建候选节点集合时,在候选语句集合
Figure BDA0003608813230000129
中每条语句对应的所有增强代码属性图节点组成候选节点集合,表示为
Figure BDA00036088132300001210
在以k阶最近邻算法作为区域提取算法的实施方式中,候选节点集合
Figure BDA00036088132300001211
中每个节点
Figure BDA00036088132300001212
在增强代码属性图中的n阶最近邻节点集合可以表示为
Figure BDA00036088132300001217
对于一条候选语句si,其对应的缺陷特征识别区域子图可以表示为
Figure BDA00036088132300001213
其中,
Figure BDA00036088132300001214
表示n阶最近邻节点集合的并集;
Figure BDA00036088132300001215
表示节点集合
Figure BDA00036088132300001216
中所有节点之间连接的边的集合。在具体的应用过程中,这里的区域提取算法包括但不限于k阶最近邻算法、Louvain社团检测算法等。对于历史缺陷数据,在生成缺陷特征识别区域子图后,可以根据缺陷报告为缺陷特征识别区域子图添加缺陷标签,表明该缺陷特征识别区域子图是否含有缺陷。
S400:处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵。
可以理解的是,在提取缺陷信息过程中,软件缺陷不仅与语法和结构有关,还与软件的语义和上下文功能有关。优选的,本申请中的缺陷信息分为缺陷语义信息和缺陷结构信息。
具体的,请参照图5,处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵,包括以下具体步骤:
S401:预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库;
S402:根据所述语料库和词嵌入方法,确定所述缺陷特征识别区域子图对应的语义矩阵;
S403:根据图拓扑结构和所述语义矩阵,得到所述缺陷特征识别区域子图对应的节点属性矩阵和缺陷结构矩阵。
需要说明的是,增强代码属性图中的每个节点都包含了节点对应的源代码,节点的源代码属于文本信息。在进行文本信息预处理时,可以使用自然语言处理的方法将源代码处理得到增强代码属性图的信息语料库,也即增强代码属性图对应的语料库。
可以理解的是,每个增强代码属性图将会对应一个语料库,语料库由若干单词组成。优选的,可以采用词嵌入方法为缺陷特征识别区域子图中的每个节点生成语义向量。由于文本型特征无法直接作为模型输入进行学习,需要先将文本型特征转化为数值型的向量特征。常见的词向量化方法有独热编码和分布式表达两种,独热编码转换后的向量距离无实际意义,且容易引起维数灾难。在一种具体的实施方式中,可以使用google开源的word2vec方法将文本型特征向量化。基于分布式假设,word2vec模型开发了一个两层神经网络,以给出具有相似含义的单词的相似表示。一个句子中的每个单词会被映射到一个β维向量中,组成一个信息矩阵
Figure BDA0003608813230000131
由于每个节点的源代码长度不同,可以为每个单词生成向量,并使用核-PCA算法来确保每个节点的语义向量的长度一致。每个节点生成的语义向量构成语义矩阵。获取语义矩阵的过程可以理解为缺陷语义信息提取的过程。
缺陷结构矩阵的提取过程可以理解为缺陷结构信息提取与矩阵生成的过程。这里的缺陷结构信息可以理解为缺陷特征识别区域子图的图拓扑结构。优选的,这里的缺陷结构矩阵采用邻接矩阵。在一种具体的实施方式中,可以通过将节点间的连接关系用稀疏邻接矩阵表示,完成缺陷结构信息的提取,得到缺陷结构矩阵。
可以理解的是,邻接矩阵是树状结构的常见表达,对于包含N个节点的缺陷子树,邻接矩阵A可表示为N×N的0-1矩阵,若两个节点之间存在连接则邻接矩阵对应元素为1,若两个节点之间无连接则该元素为0。通过自定义字典将节点类型映射为整数,并与节点的语义向量相结合,可以得到节点属性矩阵。其中若节点数为α,节点属性向量长度为β,节点属性矩阵
Figure BDA0003608813230000141
是一个α×β的矩阵,
Figure BDA0003608813230000142
可以表示缺陷特征识别区域子图的节点i的特征属性xi的数值。由此可知,可以使用节点属性矩阵和邻接矩阵来表示一个缺陷特征识别区域子图。
进一步的,预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库,包括以下具体步骤:
对所述增强代码属性图中每个节点对应的源代码进行分词处理,得到第一单词集合数据;
按照预设条件,过滤所述第一单词集合数据,得到第二单词集合数据;
对所述第二单词集合数据进行提取词干处理,得到与所述增强代码属性图对应的语料库。
可以理解的是,这里的源代码是由文本信息组成的。在对文本信息进行分词处理时,可以根据空格、标点符号和段落等分割方式,将文本信息划分为单词组。代码中的名称和类型往往是多个单词复合而成,根据常见的大写区分和下划线区分两种命名方式,可以将代码中名称和类型进一步的进行拆分,如将GetToken拆分为[Get,Token],将get_request_token拆分为[get,request,token]。通过分词处理,可以将源代码中的文本信息处理为拆分的单词集合。这里的单词集合可以理解为第一单词集合数据。在得到第一单词集合数据后,可以进一步通过预设条件过滤第一单词集合数据,保留有效数据,去除冗余。在一种具体的实施方式中,可以采用停用词过滤方式。具体的,可以过滤英语语言中的停用词,如“the”、“and”等单词;过滤编程语言中的关键字,如“for”、“if”、“return”等单词;过滤常用的无具体含义的编程相关词汇,如“main”、“arg”等。通过停用词过滤,可以得到筛选后的第二单词集合数据。为了让语料库使用更加方便,可以进一步对第二单词集合数据进行提取词干处理,最终得到与所述增强代码属性图对应的语料库。具体的,在英语编写的源代码中,由于英文单词存在单数复数的变形、过去分词和进行时态的变形,在计算前可以使用提取词干的方式将一个单词的不同表达形式还原为一个单词,比如将“stop”、“stopping”、“stopped”、“stops”合并为一个单词。
S500:通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
需要指出的是,这里的软件缺陷预测模型可以是卷积神经网络。通过将缺陷特征识别区域子图的节点属性矩阵和缺陷结构矩阵作为软件缺陷预测模型的输入,通过卷积神经网络处理,最终输出缺陷预测结果。根据输出的缺陷预测结果,便可识别出待预测的软件源代码是否具有缺陷倾向性。这里的软件源代码包括软件模块的源代码。
具体的,所述软件缺陷预测模型采用图卷积神经网络。
可以理解的是,传统的神经网络等机器学习技术的输入一般为连续向量,每条样本中所有维度的特征可以看作一个连续向量。图像由若干像素点组成,不能直接表示为向量,通过卷积可以将像素信息转化为连续向量信息。与图像、声音等欧几里得空间结构不同,缺陷特征识别区域子图是一种典型非欧式结构,每个节点具有不定的邻居数。
图分类的卷积神经网络将卷积在非欧式结构上推广为节点聚合技术,通过不断地进行节点聚合自动的提取图中的结构特征。图分类的卷积神经网络是一种端到端的学习方式,可以学习到更高层次的特征与模式,从1层聚合到1+1层的传播模型H(l+1)可以表示为:
H(l+1)=f(H(l),A)=σ(AH(l)W(l))
其中,H(0)=X(X是节点属性矩阵),H(L)=Z(Z是模型输出),l∈L;L表示网络总层数,A表示邻接矩阵,σ表示ReLU非线性激活函数,W(l)表示第1层的权值矩阵。在若干卷积层后使用最大池化操作来构建图级表示,通过两个全连接层综合网络中学习到的所有信息,最后使用Softmax分类器输出缺陷倾向。
在训练软件缺陷预测模型时,可以使用缺陷数据库中的所有缺陷特征识别区域子图作为图分类的卷积神经网络的训练数据。通过梯度下降算法迭代求解最小化损失函数,直至模型预测准确率不在提升,此时可以认为该模型已经具备了识别缺陷特征识别区域子图缺陷的能力。在使用软件缺陷预测模型预测时,可以将待预测的源代码生成增强代码属性图,对需要进行预测的缺陷类型进行缺陷特征识别区域子图提取,将提取的待预测缺陷特征识别区域子图输入模型,通过模型便可以预测待预测源代码的缺陷倾向性。
请参照图6,本申请还提供一种基于增强代码属性图的软件缺陷预测装置100,包括:
抽象模块11,用于对软件源代码进行图形化建模,得到增强代码属性图;
筛选模块12,用于根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;
提取模块13,用于根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;
处理模块14,用于处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;
预测模块15,用于通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
可以理解的是,抽象模块11中的软件源代码在数据结构、语法、语义上均有特定的标识形式,可以以此为依据将软件源代码进行图形化建模处理。在具体的实施过程中,对软件源代码进行面向软件缺陷识别的图形化建模,对缺陷代码进行抽象处理,将缺陷代码转化成结构化数据,构建软件代码的抽象模型,用以表征代码上下文信息、程序结构、控制流和数据流等信息,获取缺陷的代码语法和语义信息。需要说明的是,基于深度学习软件缺陷识别的核心是需要创建适当的缺陷表示。这里的增强代码属性图是一种可以储存代码语法语义信息的作为软件代码的图表示形式的图结构,表征的信息更为准确。
需要说明的是,根据代码文件的大小,生成的增强代码属性图包含的节点从数十个到数千个不等。增强代码属性图中和缺陷相关的节点往往只有十几个关键节点和几十个上下文节点,因此可以通过筛选模块12对其进行修剪以避免引入大量冗余和噪声。软件缺陷的类型丰富多样,每种类型的缺陷往往都发生在一些特定的语法结构中,不存在可以提取代码中所有类型的缺陷样本的通用方法。本申请根据不同类型的缺陷单独进行语法特征提取,制定特定的潜在缺陷位点定位规则,并以此为依据进一步得到潜在缺陷节点集合。这里的潜在缺陷节点集合可以理解为根据潜在缺陷位点定位规则确定的潜在缺陷节点的数据集合。
需要指出的是,提取模块13中的缺陷特征识别区域子图可以理解为软件缺陷特征识别区域。在确定软件缺陷特征识别区域时,可以通过区域提取算法,根据得到的潜在缺陷节点集合,在增强代码属性图中定位软件缺陷特征识别区域。可以理解的是,在增强代码属性图中,除了缺陷实际发生的节点外,这些节点附近的节点也包含了大量的缺陷信息。因此,缺陷样本应当是一个区域而不是几个节点。本申请利用缺陷特征识别区域提取算法从增强代码属性图中提取出和潜在缺陷节点相关的节点,构成缺陷特征识别区域子图,作为软件缺陷高风险区域识别的样本单位。优选的,这里的区域提取算法可以采用k阶最近邻算法。
可以理解的是,在提取缺陷信息过程中,软件缺陷不仅与语法和结构有关,还与软件的语义和上下文功能有关。优选的,本申请中的缺陷信息分为缺陷语义信息和缺陷结构信息。
需要指出的是,预测模块15中的软件缺陷预测模型可以是卷积神经网络。通过将缺陷特征识别区域子图的节点属性矩阵和缺陷结构矩阵作为软件缺陷预测模型的输入,通过卷积神经网络处理,最终输出缺陷预测结果。根据输出的缺陷预测结果,便可识别出待预测的软件源代码是否具有缺陷倾向性。这里的软件源代码包括软件模块的源代码。
进一步的,所述增强代码属性图包括:
解析所述软件源代码得到的抽象语法树;
由所述抽象语法树中的第一节点指向第二节点的抽象语法树边;
用于连接存在控制依赖关系的两个语句对应的两个子树根节点的控制流边;
用于连接存在数据依赖关系的两个语句对应的两个子树根节点的数据流边;
用于连接存在调用关系的两个语句对应的两个子树根节点的调用边。
需要说明的是,本申请中的软件缺陷指的是软件的代码缺陷,由一条或多条代码语句组成,表示为d={s1,s2,...,sm},其中s表示代码语句,m表示代码语句数量。根据通用的规则,可以将一段程序解析为一棵抽象语法树(AST),每条代码语句si(1<i<m)都可以映射到AST中的一颗子树ti。在具体的实施过程中,定义一棵抽象语法子树
Figure BDA0003608813230000181
其中Vi={vi,1,vi,2,...,vi,n}表示抽象语法子树ti的节点集,
Figure BDA0003608813230000182
表示抽象语法树Ti的抽象语法树边集。
Figure BDA0003608813230000183
表示抽象语法子树ti中从节点vi,v指向节点vi,w的抽象语法树边。抽象语法树的根节点为
Figure BDA0003608813230000184
在定义控制流边时,假设存在两条语句si,sj(i≠j),如果语句sj控制依赖于语句si,则
Figure BDA0003608813230000191
表示从语句si对应的子树根节点
Figure BDA0003608813230000192
连接到语句sj对应的子树根节点
Figure BDA0003608813230000193
的一条控制流边。在定义数据流边时,假设存在两条语句si,sj(i≠j),如果语句sj数据依赖于语句si,则
Figure BDA0003608813230000194
表示从语句si对应的子树根节点
Figure BDA0003608813230000195
连接到语句sj对应的子树根节点
Figure BDA0003608813230000196
的一条数据流边。在定义调用边时,假设存在两条语句si,sj(i≠j),如果语句sj调用了语句si定义的类或者方法,则
Figure BDA0003608813230000197
表示从语句si对应的子树根节点
Figure BDA0003608813230000198
连接到语句sj对应的子树根节点
Figure BDA0003608813230000199
的一条调用边。对于一个由语句组成的程序模块也可以指一个代码文件,它所对应的增强代码属性图是由每条语句对应的节点及边组成的,可以表示为G=(V,E)。其中,V={vi}表示由程序模块生成的抽象语法树中的所有节点的集合。E={e(i,j)|i≠j}表示程序模块的节点之间的所有连接关系边,包括抽象语法树边、控制流边、数据流边和调用边。其中,每个节点vi有三个主要属性:节点类型、节点源代码和节点位置;每条边e(i,j)也有三个主要属性:起始节点、目标节点和边类型。
具体的,抽象模块11具体用于:
对软件源代码构建抽象语法树;
对所述抽象语法树进行依赖关系解析,得到依赖关系表征数据;
对所述抽象语法树进行调用关系解析,得到调用关系表征数据;
融合所述抽象语法树、所述依赖关系表征数据、所述调用关系表征数据,得到包含树节点、节点连接边、依赖关系连接边、函数调用关系连接边的增强代码属性图。
需要指出的是,这里的软件源代码可以是C++、Java、Python、PHP等各种语言代码。在一种具体的实施过程中,假设这里的软件源代码是Java语言代码。对基于Java语言的软件源代码进行解析与构建抽象语法树时,可以使用开源代码解析工具ANLTR将代码文件进行扫描,解析为编译单元,构建抽象语法树。这里的抽象语法树由树节点以及节点之间的连接边构成。在进行依赖关系解析时,对构建的抽象语法树进行遍历,计算代码语句间的控制依赖关系和数据依赖关系,最终得到依赖关系表征数据。在进行调用关系解析时,对构建的抽象语法树进行遍历,提取语法树中的函数调用节点和定义节点,构建调用关系,最终得到调用关系表征数据。通过将抽象语法树与依赖关系、调用关系融合,可以最终得到增强代码属性图。这里的连接边属性包括:源节点、目标节点和边类型。其中,有向边由源节点指向目标节点。最终,所有节点、抽象语法树连接边、依赖关系连接边和函数调用关系连接边共同构成了一个有向无环图。这里的向无环图可以理解为增强代码属性图。
进一步的,所述依赖关系连接边、所述函数调用关系连接边由以下步骤得到:
根据所述依赖关系表征数据,用有向边连接所述抽象语法树中存在依赖关系的根节点,得到依赖关系连接边;
根据所述调用关系表征数据,用有向边连接所述抽象语法树中存在函数调用关系的根节点,得到函数调用关系连接边。
需要说明的是,依赖关系表征数据表征着每一个语句间依赖关系,可以在抽象语法树中定位依赖和被依赖语句的根节点,将两者的根节点用有向边进行连接,可以最终得到依赖关系连接边。调用关系表征数据表征着每一个函数调用关系,在抽象语法树中定位函数定义和函数调用语句的根节点,将两者的根节点用有向边进行连接,可以最终得到函数调用关系连接边。
具体的,筛选模块12具体用于:
确定目标缺陷类型;
对所述目标缺陷类型进行语法分析,得到缺陷语法特征;
根据所述缺陷语法特征,确定潜在缺陷位点定位规则;
根据所述潜在缺陷位点定位规则,定位所述增强代码属性图的潜在缺陷节点,得到潜在缺陷节点集合。
需要指出的是,这里的目标缺陷类型可以根据已知常用的缺陷表确定,也可以根据实际需要进行自定义。在一种具体的实施方式中,本申请以常见缺陷表Common WeaknessEnumeration(CWETM)中的典型缺陷类型作为目标缺陷类型。CWE是一个常见软硬件缺陷类型的开源分类列表,对部分软件缺陷做出了详细的分类标准。在确定目标缺陷类型时,可以选择CWE中的三种典型缺陷类型:编号为CWE-129的数组越界缺陷、编号为CWE-606的循环条件缺陷、编号为CWE-369的除零缺陷。数组越界缺陷,指的是产品在计算或使用数组索引时使用了不受信任的输入,但没有对索引进行验证或错误地进行验证,导致无法确保索引是引用了数组中的有效的位置。循环条件缺陷,指的是产品没有正确检查用于循环条件的输入,可能会导致拒绝服务或由于过度循环而导致其他后果,如无法进入循环或造成死循环等。除零缺陷,指的是在计算时对值进行了除以零的操作。
通过缺陷类型的语法特征分析,可以得到缺陷语法特征。在具体的实施过程中,通过对目标缺陷类型进行语法分析,提取同一缺陷类型中共有的语法特征。这里所说的缺陷语法特征是指对缺陷发生有必要性关系的语法结构,包含该语法结构的代码不一定含有缺陷,但含有该类型缺陷的代码应当至少包含缺陷语法特征中的一条或多条。在一种具体的应用场景中,通过语法特征分析,可以发现:编号为CWE-129的数组越界缺陷,主要发生在数组的访问和调用中,容易造成越界错误;编号为CWE-606的循环条件缺陷,主要与各种类型的循环的代码块、控制方式和循环条件有关,容易引起死循环等错误;编号为CWE-369的除零缺陷,通常在向产品提供意外值或出现错误而未正确检测到时会出现此缺陷,如除法表达式中常出现除零缺陷。
在确定潜在缺陷位点定位规则时,可以根据分析得到的缺陷语法特征,指定具体的潜在缺陷位点定位规则。这里的缺陷语法特征可以理解为缺陷类型的语法特征。在一种具体的实施方式中,编号为CWE-129的数组越界缺陷的潜在缺陷位点定位规则为“数组初始化”节点和“数组访问”节点。编号为CWE-606的循环条件缺陷的潜在缺陷位点定位规则为“for循环控制”节点、“while循环表达式”节点和“doWhile语句”节点。编号为CWE-369的除零缺陷的潜在缺陷位点定位规则为节点源码包含“/”或“%”的“算术操作符号”节点。
在具体进行潜在缺陷节点定位时,根据确定的潜在缺陷位点定位规则,遍历生成的增强代码属性图。将增强代码属性图中符合潜在缺陷位点定位规则的所有节点添加到集合中,得到集合
Figure BDA0003608813230000221
该集合P即为潜在缺陷节点集合。
需要注意的是,除了上述类型的缺陷外,本申请还可以使用其他缺陷类型进行定位,只要该缺陷类型能够总结出一个共同的语法特征,并且该语法特征能够转化为一个清晰的定位规则即可。
进一步的,提取模块13具体用于:
根据所述潜在缺陷节点集合,确定所述增强代码属性图对应的代码语句,得到候选语句集合;
根据所述候选语句集合,确定所述增强代码属性图对应的节点,得到候选节点集合;
通过区域提取算法处理所述候选节点集合,得到缺陷特征识别区域子图。
需要指出的是,在构建候选语句集合时,对于一个增强代码属性图,其针对特定缺陷的潜在缺陷节点集合可以表示为
Figure BDA0003608813230000222
其中,
Figure BDA0003608813230000223
Figure BDA0003608813230000224
Figure BDA0003608813230000225
指一个符合潜在缺陷节点语法特征的节点,即潜在缺陷节点。每个潜在缺陷节点
Figure BDA0003608813230000226
可以映射到节点所在的对应的语句si。缺陷节点集合对应的每条候选语句组成了一个语句集合S={s1,…,si}。语句集合S={s1,…,si}中的每条语句si以及在增强代码属性图中和该语句对应的根节点有调用边或数据流边或控制流边连接的节点对应的语句共同组成了候选语句集合
Figure BDA0003608813230000227
Figure BDA0003608813230000228
其中,集合
Figure BDA0003608813230000229
指的是和语句si有调用关系或数据依赖关系的语句组成的集合。这里的数据依赖关系包括控制依赖关系和数据依赖关系。在构建候选节点集合时,在候选语句集合
Figure BDA00036088132300002210
中每条语句对应的所有增强代码属性图节点组成候选节点集合,表示为
Figure BDA00036088132300002211
在以k阶最近邻算法作为区域提取算法的实施方式中,候选节点集合
Figure BDA0003608813230000231
中每个节点
Figure BDA0003608813230000232
在增强代码属性图中的n阶最近邻节点集合可以表示为
Figure BDA0003608813230000233
对于一条候选语句si,其对应的缺陷特征识别区域子图可以表示为
Figure BDA0003608813230000234
其中,
Figure BDA0003608813230000235
表示n阶最近邻节点集合的并集;
Figure BDA0003608813230000236
表示节点集合
Figure BDA0003608813230000237
中所有节点之间连接的边的集合。在具体的应用过程中,这里的区域提取算法包括但不限于k阶最近邻算法、Louvain社团检测算法等。对于历史缺陷数据,在生成缺陷特征识别区域子图后,可以根据缺陷报告为缺陷特征识别区域子图添加缺陷标签,表明该缺陷特征识别区域子图是否含有缺陷。
具体的,处理模块14具体用于:
预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库;
根据所述语料库和词嵌入方法,确定所述缺陷特征识别区域子图对应的语义矩阵;
根据图拓扑结构和所述语义矩阵,得到所述缺陷特征识别区域子图对应的节点属性矩阵和缺陷结构矩阵。
需要说明的是,增强代码属性图中的每个节点都包含了节点对应的源代码,节点的源代码属于文本信息。在进行文本信息预处理时,可以使用自然语言处理的方法将源代码处理得到增强代码属性图的信息语料库,也即增强代码属性图对应的语料库。
可以理解的是,每个增强代码属性图将会对应一个语料库,语料库由若干单词组成。优选的,可以采用词嵌入方法为缺陷特征识别区域子图中的每个节点生成语义向量。由于文本型特征无法直接作为模型输入进行学习,需要先将文本型特征转化为数值型的向量特征。常见的词向量化方法有独热编码和分布式表达两种,独热编码转换后的向量距离无实际意义,且容易引起维数灾难。在一种具体的实施方式中,可以使用google开源的word2vec方法将文本型特征向量化。基于分布式假设,word2vec模型开发了一个两层神经网络,以给出具有相似含义的单词的相似表示。一个句子中的每个单词会被映射到一个β维向量中,组成一个信息矩阵
Figure BDA0003608813230000241
由于每个节点的源代码长度不同,可以为每个单词生成向量,并使用核-PCA算法来确保每个节点的语义向量的长度一致。每个节点生成的语义向量构成语义矩阵。获取语义矩阵的过程可以理解为缺陷语义信息提取的过程。
缺陷结构矩阵的提取过程可以理解为缺陷结构信息提取与矩阵生成的过程。这里的缺陷结构信息可以理解为缺陷特征识别区域子图的图拓扑结构。优选的,这里的缺陷结构矩阵采用邻接矩阵。在一种具体的实施方式中,可以通过将节点间的连接关系用稀疏邻接矩阵表示,完成缺陷结构信息的提取,得到缺陷结构矩阵。
可以理解的是,邻接矩阵是树状结构的常见表达,对于包含N个节点的缺陷子树,邻接矩阵A可表示为N×N的0-1矩阵,若两个节点之间存在连接则邻接矩阵对应元素为1,若两个节点之间无连接则该元素为0。通过自定义字典将节点类型映射为整数,并与节点的语义向量相结合,可以得到节点属性矩阵。其中若节点数为α,节点属性向量长度为β,节点属性矩阵
Figure BDA0003608813230000242
是一个α×β的矩阵,
Figure BDA0003608813230000243
可以表示缺陷特征识别区域子图的节点i的特征属性xi的数值。由此可知,可以使用节点属性矩阵和邻接矩阵来表示一个缺陷特征识别区域子图。
进一步的,预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库,包括以下具体步骤:
对所述增强代码属性图中每个节点对应的源代码进行分词处理,得到第一单词集合数据;
按照预设条件,过滤所述第一单词集合数据,得到第二单词集合数据;
对所述第二单词集合数据进行提取词干处理,得到与所述增强代码属性图对应的语料库。
可以理解的是,这里的源代码是由文本信息组成的。在对文本信息进行分词处理时,可以根据空格、标点符号和段落等分割方式,将文本信息划分为单词组。代码中的名称和类型往往是多个单词复合而成,根据常见的大写区分和下划线区分两种命名方式,可以将代码中名称和类型进一步的进行拆分,如将GetToken拆分为[Get,Token],将get_request_token拆分为[get,request,token]。通过分词处理,可以将源代码中的文本信息处理为拆分的单词集合。这里的单词集合可以理解为第一单词集合数据。在得到第一单词集合数据后,可以进一步通过预设条件过滤第一单词集合数据,保留有效数据,去除冗余。在一种具体的实施方式中,可以采用停用词过滤方式。具体的,可以过滤英语语言中的停用词,如“the”、“and”等单词;过滤编程语言中的关键字,如“for”、“if”、“return”等单词;过滤常用的无具体含义的编程相关词汇,如“main”、“arg”等。通过停用词过滤,可以得到筛选后的第二单词集合数据。为了让语料库使用更加方便,可以进一步对第二单词集合数据进行提取词干处理,最终得到与所述增强代码属性图对应的语料库。具体的,在英语编写的源代码中,由于英文单词存在单数复数的变形、过去分词和进行时态的变形,在计算前可以使用提取词干的方式将一个单词的不同表达形式还原为一个单词,比如将“stop”、“stopping”、“stopped”、“stops”合并为一个单词。
具体的,所述软件缺陷预测模型采用图卷积神经网络。
可以理解的是,传统的神经网络等机器学习技术的输入一般为连续向量,每条样本中所有维度的特征可以看作一个连续向量。图像由若干像素点组成,不能直接表示为向量,通过卷积可以将像素信息转化为连续向量信息。与图像、声音等欧几里得空间结构不同,缺陷特征识别区域子图是一种典型非欧式结构,每个节点具有不定的邻居数。
图分类的卷积神经网络将卷积在非欧式结构上推广为节点聚合技术,通过不断地进行节点聚合自动的提取图中的结构特征。图分类的卷积神经网络是一种端到端的学习方式,可以学习到更高层次的特征与模式,从l层聚合到l+1层的传播模型H(l+1)可以表示为:
H(l+1)=f(H(l),A)=σ(AH(l)W(l))
其中,H(0)=X(X是节点属性矩阵),H(L)=Z(Z是模型输出),l∈L;L表示网络总层数,A表示邻接矩阵,σ表示ReLU非线性激活函数,W(l)表示第l层的权值矩阵。在若干卷积层后使用最大池化操作来构建图级表示,通过两个全连接层综合网络中学习到的所有信息,最后使用Softmax分类器输出缺陷倾向。
在训练软件缺陷预测模型时,可以使用缺陷数据库中的所有缺陷特征识别区域子图作为图分类的卷积神经网络的训练数据。通过梯度下降算法迭代求解最小化损失函数,直至模型预测准确率不在提升,此时可以认为该模型已经具备了识别缺陷特征识别区域子图缺陷的能力。在使用软件缺陷预测模型预测时,可以将待预测的源代码生成增强代码属性图,对需要进行预测的缺陷类型进行缺陷特征识别区域子图提取,将提取的待预测缺陷特征识别区域子图输入模型,通过模型便可以预测待预测源代码的缺陷倾向性。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (10)

1.一种基于增强代码属性图的软件缺陷预测方法,其特征在于,包括以下具体步骤:
对软件源代码进行图形化建模,得到增强代码属性图;
根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;
根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;
处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;
通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
2.根据权利要求1所述的软件缺陷预测方法,其特征在于,所述增强代码属性图包括:
解析所述软件源代码得到的抽象语法树;
由所述抽象语法树中的第一节点指向第二节点的抽象语法树边;
用于连接存在控制依赖关系的两个语句对应的两个子树根节点的控制流边;
用于连接存在数据依赖关系的两个语句对应的两个子树根节点的数据流边;
用于连接存在调用关系的两个语句对应的两个子树根节点的调用边。
3.根据权利要求1所述的软件缺陷预测方法,其特征在于,对软件源代码进行图形化建模,得到增强代码属性图,包括以下具体步骤:
对软件源代码构建抽象语法树;
对所述抽象语法树进行依赖关系解析,得到依赖关系表征数据;
对所述抽象语法树进行调用关系解析,得到调用关系表征数据;
融合所述抽象语法树、所述依赖关系表征数据、所述调用关系表征数据,得到包含树节点、节点连接边、依赖关系连接边、函数调用关系连接边的增强代码属性图。
4.根据权利要求3所述的软件缺陷预测方法,其特征在于,所述依赖关系连接边、所述函数调用关系连接边由以下步骤得到:
根据所述依赖关系表征数据,用有向边连接所述抽象语法树中存在依赖关系的根节点,得到依赖关系连接边;
根据所述调用关系表征数据,用有向边连接所述抽象语法树中存在函数调用关系的根节点,得到函数调用关系连接边。
5.根据权利要求1所述的软件缺陷预测方法,其特征在于,根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合,包括以下具体步骤:
确定目标缺陷类型;
对所述目标缺陷类型进行语法分析,得到缺陷语法特征;
根据所述缺陷语法特征,确定潜在缺陷位点定位规则;
根据所述潜在缺陷位点定位规则,定位所述增强代码属性图的潜在缺陷节点,得到潜在缺陷节点集合。
6.根据权利要求1所述的软件缺陷预测方法,其特征在于,根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图,包括以下具体步骤:
根据所述潜在缺陷节点集合,确定所述增强代码属性图对应的代码语句,得到候选语句集合;
根据所述候选语句集合,确定所述增强代码属性图对应的节点,得到候选节点集合;
通过区域提取算法处理所述候选节点集合,得到缺陷特征识别区域子图。
7.根据权利要求1所述的软件缺陷预测方法,其特征在于,处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵,包括以下具体步骤:
预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库;
根据所述语料库和词嵌入方法,确定所述缺陷特征识别区域子图对应的语义矩阵;
根据图拓扑结构和所述语义矩阵,得到所述缺陷特征识别区域子图对应的节点属性矩阵和缺陷结构矩阵。
8.根据权利要求7所述的软件缺陷预测方法,其特征在于,预处理所述增强代码属性图中每个节点对应的源代码,得到与所述增强代码属性图对应的语料库,包括以下具体步骤:
对所述增强代码属性图中每个节点对应的源代码进行分词处理,得到第一单词集合数据;
按照预设条件,过滤所述第一单词集合数据,得到第二单词集合数据;
对所述第二单词集合数据进行提取词干处理,得到与所述增强代码属性图对应的语料库。
9.根据权利要求1所述的软件缺陷预测方法,其特征在于,所述软件缺陷预测模型采用图卷积神经网络。
10.一种基于增强代码属性图的软件缺陷预测装置,其特征在于,包括:
抽象模块,用于对软件源代码进行图形化建模,得到增强代码属性图;
筛选模块,用于根据目标缺陷类型筛选所述增强代码属性图,得到潜在缺陷节点集合;
提取模块,用于根据所述增强代码属性图、所述潜在缺陷节点集合、区域提取算法,得到缺陷特征识别区域子图;
处理模块,用于处理所述缺陷特征识别区域子图,得到节点属性矩阵和缺陷结构矩阵;
预测模块,用于通过软件缺陷预测模型处理所述节点属性矩阵和所述缺陷结构矩阵,得到所述软件源代码的缺陷预测结果。
CN202210426987.8A 2022-04-21 2022-04-21 基于增强代码属性图的软件缺陷预测方法及预测装置 Pending CN114780403A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210426987.8A CN114780403A (zh) 2022-04-21 2022-04-21 基于增强代码属性图的软件缺陷预测方法及预测装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210426987.8A CN114780403A (zh) 2022-04-21 2022-04-21 基于增强代码属性图的软件缺陷预测方法及预测装置

Publications (1)

Publication Number Publication Date
CN114780403A true CN114780403A (zh) 2022-07-22

Family

ID=82432023

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210426987.8A Pending CN114780403A (zh) 2022-04-21 2022-04-21 基于增强代码属性图的软件缺陷预测方法及预测装置

Country Status (1)

Country Link
CN (1) CN114780403A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116383089A (zh) * 2023-05-29 2023-07-04 云南大学 基于常微分方程图神经网络的语句级软件缺陷预测系统

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110597735A (zh) * 2019-09-25 2019-12-20 北京航空航天大学 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110597735A (zh) * 2019-09-25 2019-12-20 北京航空航天大学 一种面向开源软件缺陷特征深度学习的软件缺陷预测方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
JIAXI XU等: "ACGDP: An Augmented Code Graph-Based System for Software Defect Prediction", 《IEEE TRANSACTIONS ON RELIABILITY》, vol. 71, no. 2, 19 April 2022 (2022-04-19), pages 1 - 8 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116383089A (zh) * 2023-05-29 2023-07-04 云南大学 基于常微分方程图神经网络的语句级软件缺陷预测系统
CN116383089B (zh) * 2023-05-29 2023-08-04 云南大学 基于常微分方程图神经网络的语句级软件缺陷预测系统

Similar Documents

Publication Publication Date Title
WO2021017679A1 (zh) 地址信息解析方法、装置、系统及数据获取方法
CN112541180B (zh) 一种基于语法特征和语义特征的软件安全漏洞检测方法
CN109726120B (zh) 一种基于机器学习的软件缺陷确认方法
CN113127339B (zh) 一种Github开源平台数据的获取方法及源代码缺陷修复系统
CN113987199B (zh) 一种规范自动解译的bim智能审图方法、系统和介质
WO2022226716A1 (zh) 基于深度学习的Java程序内部注释的生成方法及系统
CN111316296A (zh) 学习层级提取模型的结构
CN113138920B (zh) 基于知识图谱与语义角色标注的软件缺陷报告分派方法及装置
CN117215935A (zh) 一种基于多维度代码联合图表示的软件缺陷预测方法
CN112364352A (zh) 可解释性的软件漏洞检测与推荐方法及系统
CN115757695A (zh) 一种日志语言模型训练方法及系统
CN115098389B (zh) 一种基于依赖模型的rest接口测试用例生成方法
CN115577678A (zh) 文档级事件因果关系识别方法、系统、介质、设备及终端
CN115437952A (zh) 一种基于深度学习的语句级软件缺陷检测方法
CN113065012A (zh) 一种基于多模态动态交互机制的图文解析方法
CN117574898A (zh) 基于电网设备的领域知识图谱更新方法及系统
CN115952298A (zh) 供应商履约风险分析方法及相关设备
CN115146062A (zh) 融合专家推荐与文本聚类的智能事件分析方法和系统
CN117540035B (zh) 一种基于实体类型信息融合的rpa知识图谱构建方法
CN114780403A (zh) 基于增强代码属性图的软件缺陷预测方法及预测装置
CN113505590A (zh) 基于实体消歧的数据库中的关键数据元素识别方法及系统
CN117591913A (zh) 基于改进的R-Transformer的语句级软件缺陷预测方法
CN116796288A (zh) 一种面向工业文档的多模态信息提炼方法和系统
CN114757181B (zh) 基于先验知识端到端的事件抽取模型的训练、事件抽取方法及装置
CN115828888A (zh) 一种针对多种网络日志进行语义解析及结构化的方法

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