CN112579469A - 一种源代码缺陷检测方法与装置 - Google Patents

一种源代码缺陷检测方法与装置 Download PDF

Info

Publication number
CN112579469A
CN112579469A CN202011586940.5A CN202011586940A CN112579469A CN 112579469 A CN112579469 A CN 112579469A CN 202011586940 A CN202011586940 A CN 202011586940A CN 112579469 A CN112579469 A CN 112579469A
Authority
CN
China
Prior art keywords
source code
code
control flow
software source
defect detection
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
CN202011586940.5A
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.)
China Information Technology Security Evaluation Center
Original Assignee
China Information Technology Security Evaluation Center
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 China Information Technology Security Evaluation Center filed Critical China Information Technology Security Evaluation Center
Priority to CN202011586940.5A priority Critical patent/CN112579469A/zh
Publication of CN112579469A publication Critical patent/CN112579469A/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
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation

Landscapes

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

Abstract

本申请提供的源代码缺陷检测方法与装置,针对待进行缺陷检测的软件源代码,基于其语法结构,提取软件源代码中的数据流关系和控制流关系,并根据数据流关系和控制流关系,对软件源代码进行切片处理,生成用于输入至人工智能模型进行缺陷检测的蕴含上下文语义的代码片段,无需编译即可完成源代码解析及代码片段生成过程,从而,从输入数据角度来看,本申请同时支持输入可编译和/或不可编译的软件源代码,扩展了软件源代码缺陷检测的范围;同时,本申请利用人工智能技术自动学习源代码解析生成的语法树、数据流、控制流等代码上下文蕴含的缺陷模式和正常模式,在不依赖检测规则、专家经验和编译环境前提下即可实现源代码缺陷检测。

Description

一种源代码缺陷检测方法与装置
技术领域
本申请属于计算机技术领域,尤其涉及一种源代码缺陷检测方法与装置。
背景技术
信息技术处于高速发展阶段,软件增长速度越来越快,导致源代码规模呈爆炸式增长,其中蕴含的源代码缺陷同样会导致安全风险难以预测。如何准确地检测出源代码中可能含有的软件缺陷,如API(应用程序接口)或敏感函数误用、恶意代码、后门代码等,对于保障信息安全,防范恶意攻击具有重要意义。
目前已有的源代码缺陷检测方法,对专家经验、检测规则、编译环境等依赖度较高,在检测性能、检测结果展示、使用便捷性上均有不足。其主要缺陷体现在:
1)从输入数据上看:已有的源代码缺陷检测装置或工具一般需要输入可编译的软件源代码或已编译的可执行二进制文件,而不可编译的软件源代码(程序源代码)无法被检测,这类装置或工具限制了能够进行检测的软件源代码的范围;
2)从缺陷检测方法或引擎上看:主要使用静态分析方法,例如数据流分析、污点分析等,对专家经验、检测规则、编译环境等依赖度较高;
因此,如何至少部分地解决上述技术问题,克服能进行缺陷检测的软件源代码的范围限制,和/或改善源代码缺陷检测对检测规则、编译环境和专家经验依赖度较高的现状,成为本领域值得研究的课题。
发明内容
有鉴于此,本申请提供了一种源代码缺陷检测方法与装置,用于至少部分地解决上述技术问题,克服能进行缺陷检测的软件源代码的范围限制,和/或改善源代码缺陷检测对检测规则、编译环境和专家经验依赖度较高的现状。
具体技术方案如下:
一种源代码缺陷检测方法,包括:
获取待进行缺陷检测的软件源代码;
基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系;
根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段;
根据所述软件源代码的代码片段训练人工智能模型,得到用于源代码缺陷检测的人工智能模型;
利用构建的所述人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
可选的,所述基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系,包括:
解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
可选的,所述根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段,包括:
对所述控制流-数据流图进行子图提取,得到至少一个子图;
根据所述至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
可选的,所述利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果,包括:将代码片段的向量化表示输入预先构建的人工智能模型,由所述人工智能模型对代码片段进行缺陷分析与缺陷类别判定,得到包含所述代码片段的缺陷类别的缺陷检测结果。
可选的,在利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理之前,上述方法还包括:
对所述软件源代码的代码片段进行规范化处理;
其中,对代码片段的规范化处理包括:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
可选的,在得到所述软件源代码的代码片段的缺陷检测结果之后,上述方法还包括:
输出所述缺陷检测结果,并于可视化界面对所述检测结果进行支持交互式的信息展示。
一种源代码缺陷检测装置,包括:
获取单元,用于获取待进行缺陷检测的软件源代码;
提取单元,用于基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系;
切片单元,用于根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段;
人工智能模型训练单元,用于根据所述软件源代码的代码片段训练人工智能模型,得到用于源代码缺陷检测的人工智能模型;
检测单元,用于利用构建的所述人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
可选的,所述提取单元,具体用于:
解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
可选的,所述切片单元,具体用于:
对所述控制流-数据流图进行子图提取,得到至少一个子图;
根据至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
可选的,所述检测单元,具体用于:
对所述代码片段进行编码,生成所述代码片段的向量化表示;
将代码片段的向量化表示输入预先构建的人工智能模型,由所述人工智能模型对代码片段进行缺陷分析与缺陷类别判定,得到包含所述代码片段的缺陷类别的缺陷检测结果。
可选的,上述装置,还包括:
规范化处理单元,用于在利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理之前,对所述软件源代码的代码片段进行规范化处理;
其中,对代码片段的规范化处理包括:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
可选的,上述装置,还包括:
结果输出控制单元,用于输出所述缺陷检测结果,以于可视化界面对所述检测结果进行支持交互式的信息展示。
与现有技术相比,本申请提供的上述技术方案具有如下优点:
从上述技术方案可知,本申请提供的源代码缺陷检测方法与装置,针对待进行缺陷检测的软件源代码,基于其语法结构,提取软件源代码中的数据流关系和控制流关系,并根据数据流关系和控制流关系,对软件源代码进行切片处理,生成用于输入至人工智能模型进行缺陷检测的蕴含上下文语义的代码片段,无需编译即可完成源代码解析及代码片段生成过程,从而,从输入数据角度来看,本申请同时支持输入可编译和/或不可编译的软件源代码,扩展了软件源代码缺陷检测的范围;同时,本申请利用人工智能技术自动学习源代码解析生成的语法树、数据流、控制流等代码上下文蕴含的缺陷模式和正常模式,在不依赖检测规则、专家经验和编译环境前提下即可实现源代码缺陷检测。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其它的附图。
图1是本申请实施例提供的源代码缺陷检测方法的一种流程示意图;
图2是本申请实施例提供的基于软件源代码的语法结构,提取软件源代码中的数据流关系和控制流关系的流程示意图;
图3是本申请实施例提供的源代码解析及代码片段生成的逻辑示意图;
图4是本申请实施例提供的基于人工智能的源代码缺陷检测与判定逻辑示意图;
图5是本申请实施例提供的源代码缺陷检测方法的另一种流程示意图;
图6是本申请实施例提供的源代码缺陷检测方法的又一种流程示意图;
图7是本申请实施例提供的基于人工智能的源代码缺陷检测的逻辑示意图;
图8是本申请实施例提供的源代码缺陷检测装置的一种结构示意图;
图9是本申请实施例提供的源代码缺陷检测装置的另一种结构示意图;
图10是本申请实施例提供的源代码缺陷检测装置的又一种结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
本申请提供了一种源代码缺陷检测方法与装置,用于利用人工智能技术自动学习源代码解析生成的语法树、数据流、控制流等蕴含的缺陷模式和正常模式,在不依赖检测规则、专家经验和编译环境前提下实现源代码缺陷检测。本申请方案的整体实现架构可以但不限于采用B/S架构,通过服务端和客户端之间的交互,实现软件源代码的缺陷检测,且具体可将本申请的源代码缺陷检测方法与装置的处理过程应用于服务端。
参见图1,为本申请实施例提供的源代码缺陷检测方法的一种流程示意图,本实施例中,该源代码缺陷检测方法包括:
步骤101、获取待进行缺陷检测的软件源代码。
具体可接收客户端上传/载入的软件源代码。
客户端上传/载入的软件源代码可以是但不限于可编译和/或不可编译的软件源代码,或者是已编译的可执行二进制文件,并且,利用本申请方案可进行缺陷检测的源代码语言类型有多种,包括但不限于:C、C++、Java、PHP、javaScript等,并可依据需求进行扩展。
步骤102、基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系。
参见图2,该步骤102可通过以下的处理过程实现:
步骤201、解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
具体地,可尽量多的解析并提取软件源代码中含有的语义信息和/或语法信息,包括但不限于:声明定义语句、赋值语句、表达式语句、条件语句、返回语句、参数列表、参数声明、是否为控制流图的结点等;并采用抽象语法树表征所提取的这些语义信息和/或语法信息,以实现应用抽象语法树对上传/载入的软件源代码进行表征。
上述的抽象语法树包括以一系列边和结点构成的树状结构,其中,边表示结点间的关系,如控制关系或数据流动关系等;而结点中含有与代码相关的信息,如:声明定义结点中含有具体的声明或定义语句、代码行号、结点编号等;赋值语句结点、表达式语句结点、条件语句结点中含有的信息与上述声明定义结点相似,同样包含了具体的代码语句、行号、结点编号等。
此外,不同类型的结点含有的信息有所差异,如参数声明结点中含有的是具体的参数名称、参数类型、该参数的初始值等。
步骤202、根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
通常,软件源代码中包括多个不同的函数,相应可生成对应于不同函数的复数个控制流图。
抽象语法树中含有大量的、庞杂的源代码信息,实施中,可遍历抽象语法树中的结点,利用基本的字符串匹配方式,检索出源代码中的函数定义结点、声明结点、参数定义结点、参数使用结点等,并提取所检索的结点作为控制流图的结点。
控制流关系包括一个或多个控制关系,控制关系主要指上述结点间的主调或被调关系,变量与函数之间的调用关系、变量与变量之间的调用关系等。在提取所检索的结点作为控制流图结点的基础上,可进一步从抽象语法树中所检索的各结点对应的边上提取结点间的控制关系,所提取的控制关系用作控制流图的边信息。
步骤203、将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
步骤202中提取的是分别对应于各个函数的控制流图,缺少函数间的控制关系,因此,需要整合对应于不同函数的多个控制流图,得到具有函数间控制流关系的控制流图。
具体地,假设,控制流图A中的某个结点中,存在函数调用关系,如main函数中调用了用户定义的test函数,则需要将main函数的控制流图与test函数的控制流图进行整合,以得到具有函数间控制流关系的控制流图。
步骤204、根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
与控制流图的提取相似,对于数据流图的提取,同样可利用字符串检索-匹配算法,从抽象语法树包括的一系列结合及连接结点的边中提取所需要的结点信息和数据流信息。
不同点在于,数据流图中的结点主要指抽象语法树中的参数声明结点、参数定义结点、参数赋值结点等。
数据流图中的边则用于表示上述结点间的数据流关系,如参数定义结点与参数赋值结点间的边等。
步骤205、将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
数据流图的部分结点与所生成的控制流图的部分结点可能相同,因此数据流图和控制流图有可能存在相同的部分,区别仅在于边的不同(控制流图的边表示控制关系,数据流图的边表示数据流关系)。因此,整合过程中,若控制流图中存在与数据流图相同的结点,可将数据流图的边信息(体现所对应的数据流关系)添加至控制流图的相对应边中,若控制流图中存在与数据流图不相同的结点,可将数据流图的这些与控制流图的结点不相同的结点及其对应的边信息增添至控制流图中,实现控制流图与数据流图的整合。
最终整合后得到包含有控制流关系和数据流关系的控制流-数据流图。
步骤103、根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段。
具体可基于上述包含有控制流关系和数据流关系的控制流-数据流图,对软件源代码进行切片处理,得到其代码片段,该过程可以包括:
1)对控制流-数据流图进行子图提取,得到至少一个子图;
具体可从所生成的控制流-数据流图中提取单数或复数个子图,该子图中含有软件源代码中的相应控制流关系和/或数据流关系。
实施中,可以依据不同的关键字,如某个指定的函数名或变量名等,从所生成的控制流-数据流图中提取出相对应的子图。优选的,同一子图中各结点之间的控制流关系和/或数据流关系所体现的耦合度相对较大,不同子图的结点之间的控制流关系和/或数据流关系所体现的耦合度相对较小。
2)根据至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
之后,可进一步基于提取的单数或复数个子图,提取代码语句,生成软件源代码的含有控制流关系和/或数据流关系的代码片段。
该基于子图提取代码语句从而生成代码片段的实现方式可以有两种:
一种是,直接从子图的结点中提取。
由于子图的结点中通常含有结点类型、代码行号、代码语句、该节点的父结点、该节点的子节点等信息,因此,可以利用检索-匹配的方式,直接从子图结点中提取代码语句。
另一种是,从源代码文件中进行提取。
若子图结点中不含有代码语句,可以基于子图结点中的代码行号,从源代码文件中提取代码语句。
参见图3,提供了上述的源代码解析及代码片段生成过程的示意图。
在源代码解析及代码片段生成过程中,无需编译,通过对源代码进行解析,提取源代码中的抽象语法树、数据流图和控制流图,并依据数据流关系和控制流关系即可生成代码片段,后续可直接将代码片段输入预先构建的人工智能模型进行缺陷检测。不需限制待进行缺陷检测的软件源代码为可编译源代码或已编译的可执行二进制文件,不可编译的源代码同样适用,因此,从输入数据上看,本申请方案同时支持输入可编译和/或不可编译的软件源代码,增加了可检测的软件源代码的范围。
步骤104、对所述软件源代码的代码片段数据进行训练,获得能够支持源代码缺陷检测的人工智能模型。
步骤105、利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
为避免对专家经验、检测规则、编译环境等的较高依赖,本申请采用人工智能模型,对通过上述源代码解析及代码片段生成所得到的软件源代码的代码片段进行缺陷检测处理。
具体地,通过利用人工智能技术自动学习源代码解析生成的语法树、数据流、控制流等蕴含的缺陷模式和正常模式,实现在不依赖检测规则、专家经验和编译环境前提下进行源代码缺陷检测。
本申请中的人工智能模型,本质即为基于人工智能的源代码缺陷检测算法模型,所构建的基于人工智能的源代码缺陷检测算法模型可以包含但不限于如下几种:
1)基于CNN(卷积神经网络)的深度学习算法模型;
2)基于RNN(循环神经网络)的深度学习算法模型;
3)基于GCN(图卷积网络)的深度学习算法模型。
4)其他深度算法模型。
针对软件源代码的代码片段,具体可以应用词向量算法对生成的代码片段进行编码,生成代码片段的数字形式的向量化表示;并进一步将代码片段的向量化表示输入预先构建的人工智能模型,由人工智能模型提取代码片段中的特征信息并进行特征分析,实现对代码片段进行缺陷分析与缺陷类别判定,得到包含代码片段的缺陷类别的缺陷检测结果。
其中,人工智能模型所提取的特征信息,包括但不限于代码的语言类型、代码缺陷模式。上述特征信息均由深度神经网络自动提取,无需手动定义,降低了对人类专家的依赖。所需要做的只是优化神经网络训练方式和参数设置。
特征分析同样由人工智能模型的深度神经网络自动实现。得益于深度学习的优势和深度神经网络的特性,在人工智能模型训练阶段,只需应用代码缺陷与否、缺陷类别等作为训练导向(即标签),提高模型的分类准确率、检出率等。
在实际的检测阶段,应用训练好的人工智能模型,即可实现对未知代码片段的缺陷检测。实施中,可根据不同需求,实现简单和/或复杂的源代码缺陷检测,包括但不限于:简单的二分类功能、特定的二分类功能、简单的多分类功能和集成多分类功能等。
在基于人工智能模型的源代码缺陷检测过程中,通过依次执行源代码片段的向量化、特征提取和缺陷检测与分类过程,判断软件源代码的每一代码片段是否含有某类缺陷或某几类缺陷,最终实现对代码片段的缺陷检测,具体如图4所示。
从上述技术方案可知,本申请提供的源代码缺陷检测方法,针对待进行缺陷检测的软件源代码,基于其语法结构,提取软件源代码中的数据流关系和控制流关系,并根据数据流关系和控制流关系,对软件源代码进行切片处理,生成用于输入至人工智能模型进行缺陷检测的蕴含上下文语义的代码片段,无需编译即可完成源代码解析及代码片段生成过程,从而,从输入数据角度来看,本申请同时支持输入可编译和/或不可编译的软件源代码,扩展了软件源代码缺陷检测的范围;同时,本申请利用人工智能技术自动学习源代码解析生成的语法树、数据流、控制流等代码上下文蕴含的缺陷模式和正常模式,在不依赖检测规则、专家经验和编译环境前提下即可实现源代码缺陷检测。
在本申请一可选实施例中,参见图5,上述的源代码缺陷检测方法,在步骤104(对所述软件源代码的代码片段数据进行训练,获得能够支持源代码缺陷检测的人工智能模型)之前,还可以包括:
步骤103’、对所述软件源代码的代码片段进行规范化处理。
其中,对代码片段的规范化处理包括但不限于:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
具体地,可对生成的代码片段进行数据清洗,提取对应该代码片段的补充信息,提取的补充信息包括但不限于:源文件路径、切片生成依据等;训练阶段中,提取的代码片段的补充信息还可以包括风险级别、缺陷名称、标签等信息。
除此之外,还可以进一步剔除重复的代码片段。
最终得到软件源代码的规范化的代码片段,可便于后续训练源代码缺陷检测模型的训练和/或利用人工智能模型对代码片段进行缺陷检测。
在本申请一可选实施例中,参见图6,上述的源代码缺陷检测方法,在步骤105(利用构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理)之后,还可以包括:
步骤106、输出所述缺陷检测结果,并于可视化界面对所述检测结果进行支持交互式的信息展示。
在基于人工智能模型的特征提取和缺陷检测与分类过程,得到源代码缺陷检测结果之后,可输出所述缺陷检测结果,并将源代码缺陷检测结果展示于可视化界面,该可视化界面支持交互式的信息展示。除此之外,还可将源代码缺陷检测结果输出至文本文档和/或数据库表进行存档。
实施中,可在服务端和/或客户端进行源代码缺陷检测结果的可视化、可交互式展示。从而,本实施例实现了一种能克服缺陷检测的软件源代码的范围限制,对检测规则、编译环境和专家经验依赖度低的端到端的源代码缺陷检测方案。端对端的检测方式,即指源代码输入->缺陷检测结果展示的便捷方式。
基于以上各实施例的说明,实施中,优选的,可在服务端预先实现四个功能模块:源代码输入及代码片段生成、代码片段预处理、人工智能模型训练模块、基于人工智能的源代码缺陷检测和结果输出控制五个模块,并通过运行相应模块的功能,实现软件源代码的缺陷检测。具体地,在通过运行相应模块的功能,实现软件源代码的缺陷检测时,可接收前端/客户端上传/载入的软件源代码,并将上传/载入的软件源代码文件和/或压缩包等存放在默认路径或指定的路径,在此基础上,依次调用“源代码输入及代码片段生成”、“代码片段预处理”、“人工智能模型训练”和“基于人工智能的源代码缺陷检测”四个模块,并运行相应模块的功能;之后,将源代码缺陷检测结果基于结果输出控制模块进行结果输出及此基础上的可视化展示。
如图7所示,基于服务端的以上四个功能模块,具体可通过以下的实施过程实现本申请的源代码缺陷检测:
1)源代码解析及代码片段生成:在代码片段生成过程中无需编译,对源代码进行解析,提取源代码中的抽象语法树、数据流图和控制流图,并依据数据流关系和控制流关系生成代码片段;
2)代码片段预处理:对生成的代码片段进行规范化处理,包括但不限于提取源代码路径等补充信息、剔除重复的代码片段等;
3)人工智能模型训练:利用代码片段预处理生成的源代码片段,一次执行向量化、人工智能算法迭代,生成可用于源代码缺陷检测的人工智能模型;
4)基于人工智能的源代码缺陷检测:依次执行源代码片段的向量化、特征提取和缺陷检测与分类过程,判断其是否含有某类缺陷或某几类缺陷;
5)源代码缺陷检测结果展示:支持在客户端展示源代码的缺陷检测结果。
另外,实施中,还可以将源代码缺陷分析中的以上不同流程/步骤/模块进行封装,以使得具有高可维护性。
对应于上述的源代码缺陷检测方法,本申请实施例还提供了一种源代码缺陷检测装置,图8提供有该装置的一种结构示意图,具体包括:
获取单元801,用于获取待进行缺陷检测的软件源代码;
提取单元802,用于基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系;
切片单元803,用于根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段;
人工智能模型训练单元804,用于根据所述软件源代码的代码片段训练人工智能模型,得到用于源代码缺陷检测的人工智能模型;
检测单元805,用于利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
在本申请实施例的一可选实施方式中,提取单元802,具体用于:
解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
在本申请实施例的一可选实施方式中,切片单元803,具体用于:
对所述控制流-数据流图进行子图提取,得到至少一个子图;
根据至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
在本申请实施例的一可选实施方式中,检测单元805,具体用于:
对所述代码片段进行编码,生成所述代码片段的向量化表示;
将代码片段的向量化表示输入预先构建的人工智能模型,由所述人工智能模型对代码片段进行缺陷分析与缺陷类别判定,得到包含所述代码片段的缺陷类别的缺陷检测结果。
在本申请实施例的一可选实施方式中,如图9所示,上述的源代码缺陷检测装置还可以包括规范化处理单元806,用于在利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理之前,对所述软件源代码的代码片段进行规范化处理;
其中,对代码片段的规范化处理包括:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
在本申请实施例的一可选实施方式中,如图10所示,上述的源代码缺陷检测装置还可以包括结果输出控制单元807,用于输出所述缺陷检测结果,以于可视化界面对所述检测结果进行支持交互式的信息展示。
对于本申请实施例公开的源代码缺陷检测装置而言,由于其与上文任一实施例公开的源代码缺陷检测方法相对应,所以描述的比较简单,相关相似之处请参见上文实施例中源代码缺陷检测方法部分的说明即可,此处不再详述。
综上所述,本申请的源代码缺陷检测方法与装置,相比于现有的源代码缺陷检测方案,具有以下技术优势:
1)在不依赖检测规则、专家经验和编译环境前提下,实现了一种端到端的源代码缺陷检测方案;
2)从输入数据上看,同时支持输入可编译和/或不可编译的软件源代码,增加了可检测的软件源代码的范围;
3)能够依据不同需求,实现简单和/或复杂的源代码缺陷检测,包括但不限于:简单的二分类功能、特定的二分类功能、简单的多分类功能和集成多分类功能等;
4)具有高可扩展性和可维护性,具体体现在:a)可检测的源代码语言类型有多重,包含但不限于:C、C++、Java、PHP、javaScript等,并可依据需求进行扩展;b)检测功能:除了缺陷类型的判定,还可扩展到其它的源代码分析功能,包括但不限于:源性分析、克隆检测等;c)将源代码缺陷分析中的不同流程/步骤/模块进行了封装,具有高可维护性;
5)源代码缺陷检测具有普适性,不局限于某种和/或某几类的源代码缺陷。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
为了描述的方便,描述以上系统或装置时以功能分为各种模块或单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
最后,还需要说明的是,在本文中,诸如第一、第二、第三和第四等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其它变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其它要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

Claims (12)

1.一种源代码缺陷检测方法,其特征在于,包括:
获取待进行缺陷检测的软件源代码;
基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系;
根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段;
利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
2.根据权利要求1所述的方法,其特征在于,所述基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系,包括:
解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
3.根据权利要求2所述的方法,其特征在于,所述根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段,包括:
对所述控制流-数据流图进行子图提取,得到至少一个子图;
根据所述至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
4.根据权利要求3所述的方法,其特征在于,所述利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果,包括:
对所述代码片段进行编码,生成所述代码片段的向量化表示;
将代码片段的向量化表示输入预先构建的人工智能模型,由所述人工智能模型对代码片段进行缺陷分析与缺陷类别判定,得到包含所述代码片段的缺陷类别的缺陷检测结果。
5.根据权利要求1所述的方法,其特征在于,在利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理之前,还包括:
对所述软件源代码的代码片段进行规范化处理;
其中,对代码片段的规范化处理包括:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
6.根据权利要求1所述的方法,其特征在于,在得到所述软件源代码的代码片段的缺陷检测结果之后,还包括:
输出所述缺陷检测结果,并于可视化界面对所述检测结果进行支持交互式的信息展示。
7.一种源代码缺陷检测装置,其特征在于,包括:
获取单元,用于获取待进行缺陷检测的软件源代码;
提取单元,用于基于所述软件源代码的语法结构,提取所述软件源代码中的数据流关系和控制流关系;
切片单元,用于根据所述数据流关系和所述控制流关系,对所述软件源代码进行切片处理,得到所述软件源代码的代码片段;
检测单元,用于利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理,得到所述软件源代码的代码片段的缺陷检测结果。
8.根据权利要求7所述的装置,其特征在于,所述提取单元,具体用于:
解析并提取所述软件源代码中含有的语义信息和/或语法信息,并生成包含所述语义信息和/或语法信息的抽象语法树;
根据所述抽象语法树,提取所述软件源代码中各个函数内的控制流关系,并生成分别对应于各个函数内的控制流关系的各个控制流图;
将各个控制流图进行整合,生成具有函数间控制流关系的控制流图;
根据所述抽象语法树,提取所述软件源代码中的数据流关系,并生成相对应的数据流图;
将所述控制流图和所述数据流图进行整合,生成包含有控制流关系和数据流关系的控制流-数据流图。
9.根据权利要求8所述的装置,其特征在于,所述切片单元,具体用于:
对所述控制流-数据流图进行子图提取,得到至少一个子图;
根据至少一个子图,提取代码语句,生成对应于至少一个子图的含有控制流关系和/或数据流关系的至少一个代码片段。
10.根据权利要求9所述的装置,其特征在于,所述检测单元,具体用于:
对所述代码片段进行编码,生成所述代码片段的向量化表示;
将代码片段的向量化表示输入预先构建的人工智能模型,由所述人工智能模型对代码片段进行缺陷分析与缺陷类别判定,得到包含所述代码片段的缺陷类别的缺陷检测结果。
11.根据权利要求7所述的装置,其特征在于,还包括:
规范化处理单元,用于在利用预先构建的人工智能模型对所述软件源代码的代码片段进行缺陷检测处理之前,对所述软件源代码的代码片段进行规范化处理;
其中,对代码片段的规范化处理包括:提取代码片段的预定补充信息,和/或,剔除重复的代码片段。
12.根据权利要求7所述的装置,其特征在于,还包括:
结果输出控制单元,用于输出所述缺陷检测结果,以于可视化界面对所述检测结果进行支持交互式的信息展示。
CN202011586940.5A 2020-12-29 2020-12-29 一种源代码缺陷检测方法与装置 Pending CN112579469A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011586940.5A CN112579469A (zh) 2020-12-29 2020-12-29 一种源代码缺陷检测方法与装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011586940.5A CN112579469A (zh) 2020-12-29 2020-12-29 一种源代码缺陷检测方法与装置

Publications (1)

Publication Number Publication Date
CN112579469A true CN112579469A (zh) 2021-03-30

Family

ID=75140385

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011586940.5A Pending CN112579469A (zh) 2020-12-29 2020-12-29 一种源代码缺陷检测方法与装置

Country Status (1)

Country Link
CN (1) CN112579469A (zh)

Cited By (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113609487A (zh) * 2021-07-16 2021-11-05 深圳开源互联网安全技术有限公司 通过静态分析检测后门代码的方法
CN113791976A (zh) * 2021-09-09 2021-12-14 南京大学 一种基于程序依赖增强缺陷定位的方法和装置
CN114385491A (zh) * 2021-12-30 2022-04-22 大连理工大学 一种基于深度学习的js转译器缺陷检测方法
WO2022222499A1 (zh) * 2021-04-24 2022-10-27 华为云计算技术有限公司 代码处理方法、系统、集群、介质及程序产品
CN116302043A (zh) * 2023-05-25 2023-06-23 深圳市明源云科技有限公司 代码维护问题检测方法、装置、电子设备及可读存储介质
CN117744087A (zh) * 2023-12-07 2024-03-22 浙江大学 基于静态分析的智能设备远程代码执行漏洞检测方法

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140229922A1 (en) * 2011-03-11 2014-08-14 Oracle International Corporation Efficient model checking technique for finding software defects
CN109726120A (zh) * 2018-12-05 2019-05-07 北京计算机技术及应用研究所 一种基于机器学习的软件缺陷确认方法
CN110990273A (zh) * 2019-11-29 2020-04-10 中国银行股份有限公司 克隆代码检测方法及装置
CN111240982A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析方法
CN111459799A (zh) * 2020-03-03 2020-07-28 西北大学 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN112035345A (zh) * 2020-08-20 2020-12-04 国家电网有限公司信息通信分公司 一种基于代码片段分析的混合深度缺陷预测方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140229922A1 (en) * 2011-03-11 2014-08-14 Oracle International Corporation Efficient model checking technique for finding software defects
CN109726120A (zh) * 2018-12-05 2019-05-07 北京计算机技术及应用研究所 一种基于机器学习的软件缺陷确认方法
CN110990273A (zh) * 2019-11-29 2020-04-10 中国银行股份有限公司 克隆代码检测方法及装置
CN111240982A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析方法
CN111459799A (zh) * 2020-03-03 2020-07-28 西北大学 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN112035345A (zh) * 2020-08-20 2020-12-04 国家电网有限公司信息通信分公司 一种基于代码片段分析的混合深度缺陷预测方法

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022222499A1 (zh) * 2021-04-24 2022-10-27 华为云计算技术有限公司 代码处理方法、系统、集群、介质及程序产品
CN113609487A (zh) * 2021-07-16 2021-11-05 深圳开源互联网安全技术有限公司 通过静态分析检测后门代码的方法
CN113609487B (zh) * 2021-07-16 2023-05-12 深圳开源互联网安全技术有限公司 通过静态分析检测后门代码的方法
CN113791976A (zh) * 2021-09-09 2021-12-14 南京大学 一种基于程序依赖增强缺陷定位的方法和装置
CN113791976B (zh) * 2021-09-09 2023-06-20 南京大学 一种基于程序依赖增强缺陷定位的方法和装置
CN114385491A (zh) * 2021-12-30 2022-04-22 大连理工大学 一种基于深度学习的js转译器缺陷检测方法
CN116302043A (zh) * 2023-05-25 2023-06-23 深圳市明源云科技有限公司 代码维护问题检测方法、装置、电子设备及可读存储介质
CN116302043B (zh) * 2023-05-25 2023-10-10 深圳市明源云科技有限公司 代码维护问题检测方法、装置、电子设备及可读存储介质
CN117744087A (zh) * 2023-12-07 2024-03-22 浙江大学 基于静态分析的智能设备远程代码执行漏洞检测方法

Similar Documents

Publication Publication Date Title
CN111639344B (zh) 一种基于神经网络的漏洞检测方法及装置
CN112579469A (zh) 一种源代码缺陷检测方法与装置
US20220091827A1 (en) Pruning Engine
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN113360915B (zh) 基于源代码图表示学习的智能合约多漏洞检测方法及系统
CN111459799B (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及系统
AU2021245127B2 (en) System and method for coupled detection of syntax and semantics for natural language understanding and generation
EP3695310A1 (en) Blackbox matching engine
CN112579477A (zh) 一种缺陷检测方法、装置以及存储介质
CN108345457B (zh) 一种对程序源代码自动生成功能描述性注释的方法
EP4322009A1 (en) Test case generation method, apparatus and device
CN112307473A (zh) 一种基于Bi-LSTM网络和注意力机制的恶意JavaScript代码检测模型
CN115495755B (zh) 一种基于CodeBERT和R-GCN的源代码漏洞多分类检测的方法
CN113591093B (zh) 基于自注意力机制的工业软件漏洞检测方法
CN116661805B (zh) 代码表示的生成方法和装置、存储介质及电子设备
CN116702160B (zh) 一种基于数据依赖增强程序切片的源代码漏洞检测方法
CN115688108B (zh) 一种webshell静态检测方法及系统
CN117113347A (zh) 一种大规模代码数据特征提取方法及系统
Jadallah et al. CATE: CAusality Tree Extractor from Natural Language Requirements
Utkin et al. Evaluating the impact of source code parsers on ML4SE models
KR20220068462A (ko) 지식 그래프 생성 방법 및 장치
KR102497408B1 (ko) 지식 베이스 구축 방법
CN117010332A (zh) 一种应用异常检测方法、装置、设备及可读存储介质
CN117786702A (zh) 一种基于命名实体识别技术的源码漏洞切片提取方法
CN113918952A (zh) C或c++代码漏洞检测方法、系统、计算机及存储介质

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