CN118260765A - 一种电力数据安全监测系统代码克隆检测方法和装置 - Google Patents

一种电力数据安全监测系统代码克隆检测方法和装置 Download PDF

Info

Publication number
CN118260765A
CN118260765A CN202410344018.7A CN202410344018A CN118260765A CN 118260765 A CN118260765 A CN 118260765A CN 202410344018 A CN202410344018 A CN 202410344018A CN 118260765 A CN118260765 A CN 118260765A
Authority
CN
China
Prior art keywords
code
clone
type
pairs
token
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
CN202410344018.7A
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.)
Guangdong Power Grid Co Ltd
Information Center of Guangdong Power Grid Co Ltd
Original Assignee
Guangdong Power Grid Co Ltd
Information Center of Guangdong Power Grid Co Ltd
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 Guangdong Power Grid Co Ltd, Information Center of Guangdong Power Grid Co Ltd filed Critical Guangdong Power Grid Co Ltd
Priority to CN202410344018.7A priority Critical patent/CN118260765A/zh
Publication of CN118260765A publication Critical patent/CN118260765A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2221/00Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F2221/03Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
    • G06F2221/033Test or assess software

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computing Systems (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明公开了一种电力数据安全监测系统代码克隆检测方法和装置,所述方法包括:根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,按分区搜索获取方法;基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对;在剔除筛选的第一类型和第二类型克隆对之后,基于调用方法相似度度量标准,筛选出可能的第三类型克隆对;在剔除筛选出的上述三种克隆对之后,针对第四种克隆对,基于代码控制流和数据流分析获得代码语义表示;利用预先训练的深度学习模型进行分类,检测出语义级别克隆代码。本发明有效提高了电力数据安全监测系统研发过程中多版本迭代下的大规模代码克隆检测有效性,保障系统安全稳定运行。

Description

一种电力数据安全监测系统代码克隆检测方法和装置
技术领域
本发明涉及一种电力数据安全监测系统代码克隆检测方法和装置,应用于电力数据安全监测系统软件研发过程中的安全测试以及软件研发执行代码风险分析。
背景技术
电力系统作为电能的合成、传输、分配且兼顾消费合一的体系,在人们生活以及工作中发挥着越来越强大的作用。随着计算机技术的发展,计算机和软件的应用已经深度渗透到电力行业中。随着南方电网数字化转型的蓬勃发展,数据呈现“爆炸式”的增长和积累,电力大数据应用已经成为企业发展的战略制高点,数据安全也被提到了新的高度。针对电力数据安全监测系统研发过程中代码克隆引发的代码数据安全性以及软件执行过程中的潜在风险分析难题,主要通过设计测试案例来检测软件缺陷,通过缺陷的修复有效保障软件高质量运行,支撑电力数据安全的实时监测业务运行。
在电力数据安全监测系统研发过程中,为了提高编程效率,开发人员对代码片段进行复制、粘贴和修改是一种常见现象。重复代码或相似代码也称为代码克隆,主要指存在于代码库中两个及以上的相同或者相似的源代码片段。代码克隆的适度使用在软件生命周期中发挥着积极作用,旨在减少错误,提高软件开发效率。然而,滥用代码克隆是软件开发、测试、维护和再开发过程中的一个巨大挑战,带来了一系列的问题:
(1)在软件研发方面,代码克隆可能会导致软件系统中的代码数据冗余、规模增大,进而导致信息资源需求和维护成本不断增加;
(2)在代码安全方面,通过复制粘贴一段含有未知漏洞的代码,会造成漏洞的增加,同时在克隆过程中也有可能引入新的漏洞,对代码数据的安全产生不可估量的后果。
克隆检测是在软件系统内或软件系统之间定位精确或相似代码片段的过程,有效的克隆检测方法成为软件测试和分析的重要部分。目前,根据检测的目标和粒度,从易于检测到难以检测分为文本相似性、词汇相似性、语法相似性和语义相似性这四类。其中文本相似性主要指的是相同的代码片段,空白、布局和注释的差异除外;词汇相似性主要指的是相同的代码片段,除了标识符名称和文字值的差异,以及文本差异性;语法相似性主要指在语句级别出现的语法相似的代码片段,同时除了文本相似性和词汇相似性差异之外,片段还添加、修改和/或删除了彼此相关的语句;针对语义相似性主要指实现相同功能的语法不同的代码片段。现有的克隆代码检测主流方法是在将源代码转换为中间表示的条件下进行的,对于完全相同或者几乎一致的代码克隆检测,现有的算法和工具已经能够很好检测。电力数据安全监测系统能够在复杂网络环境下实时进行数据安全监控,进而来综合提升电力网络的安全性,其业务流程复杂且对系统自身安全具有极高要求。针对该系统研发迭代过程中底层代码数据安全,对于差异较大但文本上仍保留一定相似性的差异代码克隆和文本上未保留相似性的差异代码克隆,已有的方法存在识别率低、计算复杂度高、误报率较高等问题,如何通过有效的技术手段进行不同类型的克隆代码智能检测,对于保证电力数据安全监测系统自身的软件代码质量具有重要意义。
发明内容
发明目的:本发明的目的是提供一种面向电力数据安全监测系统研发过程版本迭代下的代码克隆检测方法和装置,至少部分地解决背景技术中的问题。
技术方案:第一方面,一种电力数据安全监测系统代码克隆检测方法,包括以下步骤:
消除不可能是克隆对的嵌入式代码后,根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,使得能够按分区索引搜索获取方法,所述分区索引机制包括:确定分区数量,基于代码方法的名称和版本确定分区键,利用哈希函数将分区键映射到特定的分区编号,将代码根据哈希函数分配到相应的分区,使得在对代码进行克隆检测时能够通过分区键定位到相应的分区,在不同的分区同时进行查找和访问方法;
将不同分区中的方法的源代码行转换为一系列token,其中token为指定的关键字、标识符,基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对,其中第一类型克隆对为代码片段完全相同的克隆对,第二类型克隆对为代码结构或代码语法构成相同的克隆对;
在剔除筛选出的第一类型和第二类型克隆对之后,通过分区键定位到相应的分区,设置token滑动窗口,通过重叠相似度衡量两种方法token之间的相似度,根据该相似度筛选出可能的第三类型克隆对,第三类型克隆对为大小相同、执行类似操作、具有相似调用的方法克隆对;
在剔除筛选出的第一类型、第二类型和第三类型克隆对之后,对于剩余的代码片段作,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图捕获数据值沿程序路径和操作的流动,获得代码行为的语义表示;
基于代码语义表示利用预先训练的深度学习模型进行分类,检测出第四类型克隆对,第四类型克隆对为语义级别克隆代码。
优选地,针对分区数量的确定,综合考虑程序规模、数据量、业务逻辑、硬件资源进行分区数量的确定。
优选地,方法大小的度量标准包括:记方法M1有x个token,方法M2有y个token,给定相似阈值T在0和1之间,当满足x×T≤y≤x/T时,判定方法M1和方法M2属于克隆对。
优选地,通过重叠相似度衡量两种方法token之间的相似度的计算方法如下:
其中,sim<M1,M2>表示方法M1与方法M2之间的相似度,记A和B分别是方法M1和方法M2中token集,方法M1中token集A的每个元素被定义为<tai,freqtai,s,Na>,方法M2中token集B每个元素被定义为<tbj,freqtbj,s,Nb>,1≤i≤j≤n;s是设置的token滑动窗口;Na是方法M1的总行数,Nb是方法M2的总行数;freqtai是方法M1中token集A的tai在该滑动窗口下出现的次数,tai是方法M1中token集A的第i个token;freqtbj是方法M2中token集B的tbj在该滑动窗口下出现的次数,tbj是方法M2中token集B的第j个token;α为经过token滑动窗口划分后滑动窗口序号。
优选地,在获取代码行为的语义表示时,通过变量特征、基本块特征以及变量和基本块之间的关系特征来编码控制流和数据流信息,其编码规则如下:
变量特征主要是通过对每个变量进行提取得到,其类型特征包含数据类型V(t)、修饰符V(m)和其他信息V(o),其中V(t)={bool、byte、char、double、float、int、long、short、void、JDK类、用户自定义类型},V(m)={final、static、none},V(o)={基本、数组、指针、引用},将上述的变量特征编码成一个18d的二进制特征向量V={V(t),V(m),V(o)};
基本块特征是针对每个基本块的特征,主要考虑以下七种类型:normal、loop、loop body、if、if body、switch、switch body,将此类型信息编码为7维的one-hot特征向量D;
变量和基本块之间的关系特征,主要指将数据流和控制流编码为变量之间的操作和基本块之间的控制跳跃,总共包括38种主要的操作类型,加法:ADD;减法:SUB;乘法:MUL;除法:DIV;求余:REM;按位与:AND;按位或:OR;按位异或:XOR;左移:SHL;右移:SHR;无符号右移:USHR;取反:NEG;逻辑非:NOT;按位取反:BITNOT;等于:EQ;不等于:NE;大于:GT;大于等于:GE;小于:LT;小于等于:LE;类型检查:INSTANCEOF;类型转换:CHECKCAST;条件分支:COND_BRANCH;跳转:GOTO;类型转换:CONVERSION;数组长度:ARRAY_LENGTH;Phi函数:PHI;方法调用:INVOKE;获取捕获的异常:GET_CAUGHT_EXCEPTION;抽象方法调用:ABSTRACT_INVOKE;检查点:CHECKPOINT;条件开关:COND_SWITCH;字段赋值:PUT;字段获取:GET;获取地址:ADDRESSOF;返回:RETURN;分支:BRANCH;标识:IDENTITY,使用一个38维one-hot特征向量M表示;
为了保留数据流图中变量之间的每个操作的信息,生成了一个18*2+38=74d特征向量T={Voption1,Voption2,M},其中Voption1和Voption2分别表示语义矩阵编码中变量option1和option2的特征向量,为了保持控制流,将T扩展为大小为81d的{Voption1,Voption2,M,D}。
优选地,代码行为的语义表示为根据所述编码规则生成语义特征矩阵E,E中的每一行和每一列都是一个变量或基本块,其顺序对应于代码指令和基本块顺序,E(i,j)=T(i,j)是大小为81的二进制特征向量,表示行i和列j之间的关系,i,j=1,2…n,其中n=nv+bb是变量计数和基本块计数的总和。
优选地,深度学习模型通过如下方式建立:
基于将数据流和控制流编码的稀疏二进制特征向量,将其映射到大小为c的隐藏状态h0,c为一个常数;然后将语义特征矩阵的每一行转换为长度为c·k的向量,k为指定的输入矩阵大小;接着添加两个全连接层,将弱化的行特征向量作为输入,以提取与每行表示的变量或基本块相关的所有信息;最后,添加一个池化层来汇总所有的行特征向量,将两个方法的语义矩阵的潜在表示向量以不同的顺序连接起来,在两个具有共享权重Wfc的连接向量上应用全连接层,对输出状态执行另一个平均池,最后添加分类层。
第二方面,一种电力数据安全监测系统代码克隆检测装置,包括:
代码分区模块,被配置用于消除不可能是克隆对的嵌入式代码后,根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,使得能够按分区索引搜索获取方法,所述分区索引机制包括:确定分区数量,基于代码方法的名称和版本确定分区键,利用哈希函数将分区键映射到特定的分区编号,将代码根据哈希函数分配到相应的分区,使得在对代码进行克隆检测时能够通过分区键定位到相应的分区,在不同的分区同时进行查找和访问方法;
方法大小检测模块,被配置用于将不同分区中的方法的源代码行转换为一系列token,其中token为指定的关键字、标识符,基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对,其中第一类型克隆对为代码片段完全相同的克隆对,第二类型克隆对为代码结构或代码语法构成相同的克隆对;
方法相似度检测模块,被配置用于在剔除筛选出的第一类型和第二类型克隆对之后,通过分区键定位到相应的分区,设置token滑动窗口,通过重叠相似度衡量两种方法token之间的相似度,根据该相似度筛选出可能的第三类型克隆对,第三类型克隆对为大小相同、执行类似操作、具有相似调用的方法克隆对;
代码语义表示构建模块,被配置用于在剔除筛选出的第一类型、第二类型和第三类型克隆对之后,对于剩余的代码片段作,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图捕获数据值沿程序路径和操作的流动,获得代码行为的语义表示;
语义克隆检测模块,被配置用于基于代码语义表示利用预先训练的深度学习模型进行分类,检测出第四类型克隆对,第四类型克隆对为语义级别克隆代码。
第三方面,本发明还提供一种计算机设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如上所述的电力数据安全监测系统代码克隆检测方法的步骤。
第四方面,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的电力数据安全监测系统代码克隆检测方法的步骤。
有益效果:本发明以待检测的代码片段集为起点,分区进行克隆检测,通过方法大小、方法相似性分析技术有效检测出文本、词汇、句法相同以及相似性高的克隆代码,针对剩余的代码片段,为了使得代码语义表示捕获更多的代码语义信息,通过代码控制流和数据流编码技术有效将控制流和数据流编码为语义特征矩阵,基于深度学习模型从语义矩阵中学习高级特征,有效进行语义相似克隆代码检测,进而实现大规模克隆代码的高效可靠检测。和现有技术相比,本方法逐层进行克隆对筛选,提高了电力数据安全监测系统研发过程中多版本迭代下的大规模代码的克隆检测的及时性、有效性、准确性,保障了系统的安全稳定运行。
附图说明
图1是本发明的电力数据安全监测系统代码克隆检测方法流程图;
图2是本发明的分类检测过程示意图;
图3是本发明的深度学习模型示意图。
具体实施方式
下面将结合附图对本发明实施例中的技术方案进行清楚、完整的描述。
参照图1,本发明提出一种电力数据安全监测系统代码克隆检测检测方法,方法包括以下步骤:
步骤S1,根据分区索引机制,将待检测数据安全监测系统软件源代码进行分区,按分区索引获取方法。
针对测数据安全监测系统软件源代码进行真实代码克隆检测时,大多数方法对不是彼此的克隆。然而,克隆检测需要处理所有可能的方法对,以便找出哪些是克隆。面向该系统多版本大规模代码检测,在两种大小相差很大的方法不太可能实现相同甚至相似的功能。
首先消除不太可能的克隆对。针对嵌入式代码,通过隔离分区进行代码的删除。主要包括基于java程序代码段中嵌入的SQL语句,将SQL语句直接进行删除。SQL语句主要包括连接到数据库、创建SQL插入语句、执行SQL插入语句、关闭数据库连接。如果在代码中涵盖DriverManager.getConnection()、PreparedStatement、executeUpdate()等方法,将这部分代码进行删除。
接着将代码划分到不同的分区进行管理,基于分区索引获取方法。对代码进行有效分区可将影响限制分区内,从而降低问题发生的数量及处理问题的代价,有效提高针对克隆代码索引效率。分区划分主要考虑2个原则,一是具有相同前缀的方法名需要最大限度划分到同一个分区内;二是将代码集划分为多个分区时,需要有效保证搜索质量的前提下,有效降低大规模查询搜索成本。针对分区数量的确定,综合考虑程序规模、数据量、业务逻辑、硬件资源等;接着确定分区键,基于代码方法的名称、版本等进行分区;同时基于确定的分区键,实现一个哈希函数,将分区键映射到特定的分区编号;将代码根据哈希函数分配到相应的分区;在代码数据进行克隆检测时,通过分区键来快速定位到相应的分区,在不同的分区同时进行查找和访问方法,有效进行克隆检测。
S2、基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对。
本发明基于方法大小进行度量考虑,为了保证源代码信息得到了更充分的利用,将不同分区中的方法的源代码行转换为一系列token。基于方法名称和token的数量作为方法大小的度量标准,其中token为关键字、标识符等。关键字主要包括Auto、break、case、char、const、continue、default等;标识符主要包括__*__、__*等特殊符号。根据本发明的实施方式,给定相似阈值T在0和1之间,方法M1有x个token,如果方法M2是M1的文本和词汇类型的克隆,则其token数量y应满足不等式x×T≤y≤x/T。在本发明中设置T=0.9。经过上述比较方法,首先筛选出第一类型和第二类型克隆对。
代码克隆主要包括文本相似和功能相似,对于文本相似性,代码克隆对分为三种类型:
类型一:代码片段是完全相同的,除了空格,代码的布局格式或者是注释不同;
类型二:代码的结构或者是代码的语法构成都是相同的,除了用户定义的变量,常量值,类型,布局或者是注释有不同;
类型三:复制粘贴的代码片段被做了一些改动。除了在类型二上的变动之外,程序本身可能增加,删除修改了部分语句;
功能相似性则被分为类型四:两个代码片段的功能是相似的或者是完全相同的。
针对类型一和类型二都可以通过本步骤的方法大小的度量进行检测。
S3、在剔除步骤S2筛选的第一类型和第二类型克隆对之后,基于方法相似度分析方法有效筛选出可能的第三类型克隆对。
如果两个方法执行相同的函数,即使这些方法在文本和词汇上不同,但其可能调用相同的库方法并引用相同的对象属性,故而可以利用这些方法函数调用的相似性来检测克隆情况。
本发明通过分区键定位到相应的分区,设置token滑动窗口有效进行代码克隆检测。设A和B分别是方法M1和方法M2中token集,方法M1中token集A的每个元素被定义为<tai,freqtai,s,Na>,方法M2中token集B每个元素被定义为<tbj,freqtbj,s,Nb>,其中1≤i≤j≤n。其中s是token滑动窗口;n是常数,可以表示为方法M1和方法M2中token集的token数的较大值;Na是方法M1的总行数,Nb是方法M2的总行数;freqtai是方法M1中token集A的tai在该滑动窗口下出现的次数,tai是方法M1中token集A的第i个token;freqtbj是方法M2中token集B的tbj在该滑动窗口下出现的次数,tbj是方法M2中token集B的第j个token。通过token进行相似度度量,有效计算出方法的度量值。
通过使用重叠相似度来衡量两种方法token之间的相似度,计算方式如下:
其中α为经过token滑动窗口划分后滑动窗口序号。
基于度量值有效判定其是否为克隆。例如,两个方法的相似度计算结果大于指定的阈值,则认为是方法克隆对。
通过上述使用方法,可以有效将大小相同、执行类似操作、具有软件相似调用的方法克隆对找出。
S4、如果度量值判定其为非克隆,则将候选对象与分区查询配对,并为候选对象创建特征向量。然后,基于经过训练的深度学习模型有效对这些候选配对进行语义相似分析,预测该配对是否为克隆配对。
在进一步剔除步骤S3筛选出的第三类型克隆对之后,基于代码控制流和数据流分析获得代码语义表示。
针对上述经过文本、词汇、句法相似克隆检测过的代码片段作为源代码的输入,由控制流和数据流表示的代码语义编码为单个语义矩阵。控制流图CFG是一种用来表示程序执行过程中所有执行路径的有向图,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图DFG捕获数据值沿程序路径和操作的流动。从控制流分析和数据流分析中获得的信息作为代码行为表示。最后得到一个包含了控制流信息和数据流信息的矩阵。
针对语义矩阵编码,本发明通过变量特征、基本块特征以及变量和基本块之间的关系特征编码控制流和数据流信息。
变量特征主要是通过对每个变量进行提取得到,其类型特征包含数据类型V(t)、修饰符V(m)和其他信息V(o)。
V(t)={bool、byte、char、double、float、int、long、short、void、JDK类、用户自定义类型};
V(m)={final、static、none};
V(o)={基本、数组、指针、引用}。
将上述的变量特征编码成一个18d的二进制特征向量V={V(t),V(m),V(o)}。
基本块特征是针对每个基本块的特征,主要考虑以下七种类型:normal、loop、loop body、if、if body、switch、switch body。同时,将此类型信息编码为7维的one-hot特征向量D。
变量和基本块之间的关系特征,主要指将数据流和控制流编码为变量之间的操作和基本块之间的控制跳跃。总共包括最主要的38种不同的操作类型,加法:ADD;减法:SUB;乘法:MUL;除法:DIV;求余:REM;按位与:AND;按位或:OR;按位异或:XOR;左移:SHL;右移:SHR;无符号右移:USHR;取反:NEG;逻辑非:NOT;按位取反:BITNOT;等于:EQ;不等于:NE;大于:GT;大于等于:GE;小于:LT;小于等于:LE;类型检查:INSTANCEOF;类型转换:CHECKCAST;条件分支:COND_BRANCH;跳转:GOTO;类型转换:CONVERSION;数组长度:ARRAY_LENGTH;Phi函数:PHI;方法调用:INVOKE;获取捕获的异常:GET_CAUGHT_EXCEPTION;抽象方法调用:ABSTRACT_INVOKE;检查点:CHECKPOINT;条件开关:COND_SWITCH;字段赋值:PUT;字段获取:GET;获取地址:ADDRESSOF;返回:RETURN;分支:BRANCH;标识:IDENTITY。使用一个38维one-hot特征向量M表示。为了保留数据流DFG中变量之间的每个操作的信息,生成了一个18*2+38=74d特征向量T={Voption1,Voption2,M},其中Voption1和Voption2分别表示语义矩阵编码中变量option1和option2的特征向量。为了保持控制流,将T扩展为大小为81d的{Voption1,Voption2,M,D}。
针对语义特征矩阵E的构建,主要基于给定的代码片段,通过上述的编码规则生成以捕获其控制流和数据流信息。E中的每一行和每一列都是一个变量或基本块,其顺序就对应于代码指令和基本块顺序。E(i,j)=T(i,j)是大小为81的二进制特征向量,表示行i和列j之间的关系,i,j=1,2…n,其中n=nv+bb是变量计数和基本块计数的总和。语义特征矩阵表示的方式并不是对程序依赖图PDG中的所有信息进行编码,但其将所有依赖性都通过变量和基本块之间的关系特征编码进行表示。通过这种方式,语义特征矩阵可以将寻找同构子图的问题简化为检测矩阵中的相似模式。
S6、基于代码语义表示,利用预先训练的深度学习模型进行分类,检测出语义级别克隆代码。
如图2和图3所示,针对该深度学习模型,首先训练了一个前馈神经网络,通过该前馈神经网络从每个代码对的语义矩阵中生成高级特征,并使用神经网络末端的分类层将它们分类为功能相似或不相似。通过该方式消除了对学习特征定义单独距离度量,同时可以以监督的方式对该模型进行精细训练,以通过反向传播分类层的标签信号从输入中学习更好的表示。通过前馈神经网络生成高级特征的方式,其需要固定大小的输入语义特征矩阵,首先将所有输入矩阵处理为固定大小k×k,实施例中k=128。对于较小的方法,通过使用用零值填充特征矩阵;对于较大的方法,通过保留所有CFG信息并丢弃超过矩阵大小的部分DFG信息来截断矩阵,原始特征矩阵大小为n=nv+bb,截断后的k=nv′+nb′=128,其中nb′=nb,nv′=128-nb
本发明选用ELU函数作为激活函数,ELU(c)={c,if c≥0;ec-1,if c<0},c为一个常数。基于将数据流和控制流编码为81d个稀疏二进制特征向量,将其映射到大小为c=6的隐藏状态h0。然后将E的每一行转换为长度为c·k的向量,接着添加了两个全连接层,将弱化的行特征向量作为输入,以提取与每行表示的变量或基本块相关的所有信息。最后,添加了一个池化层来汇总所有的行特征向量。将m1和m2的潜在表示向量h13和h23以不同的顺序连接起来:[h13,h23],[h23,h13]。m1、m2分别是从方法M1和M2生成的语义矩阵。
然后在两个具有共享权重Wfc的连接向量上应用全连接层。对输出状态执行另一个平均池,最后添加分类层。使用交叉熵作为成本函数:
将成本函数最小化以优化整个模型,S(i)是样本i的真实标签;S(i)是预测标签;N为输入样本数量。通过这种方式,模型能够学习具有不同语法的每个代码对之间的相似性。
本发明为了减轻代码语句重新排序的影响,忽略了自变量或基本块的顺序,只保留它们之间有依赖关系的变量或基本块的顺序,同时使用平均池,而不是分散整个矩阵,池化层将输入大小从c×k×k减小到c×k,而无需任何额外参数,有效降低了模型的复杂性,提高了训练和预测效率。第一个平均池化有效计算了矩阵所有行的平均状态,减少了语句重新排序造成的副作用;第二个平均池化计算方法对最终潜在表示的两个不同级联的平均状态,保证了代码相似性的对称性。
本发明以待检测的代码片段集为起点,分区进行克隆检测,通过方法大小、方法相似性分析技术有效检测出文本、词汇、句法相同以及相似性高的克隆代码,针对剩余的代码片段,为了使得代码语义表示捕获更多的代码语义信息,通过代码控制流和数据流编码技术有效将控制流和数据流编码为语义特征矩阵,基于深度学习模型从语义矩阵中学习高级特征,有效进行语义相似克隆代码检测,进而实现大规模克隆代码的高效可靠检测。
基于和方法实施例相同的发明构思,本发明还提供一种电力数据安全监测系统代码克隆检测装置,包括:
代码分区模块,被配置用于消除不可能是克隆对的嵌入式代码后,根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,使得能够按分区索引搜索获取方法,所述分区索引机制包括:确定分区数量,基于代码方法的名称和版本确定分区键,利用哈希函数将分区键映射到特定的分区编号,将代码根据哈希函数分配到相应的分区,使得在对代码进行克隆检测时能够通过分区键定位到相应的分区,在不同的分区同时进行查找和访问方法;
方法大小检测模块,被配置用于将不同分区中的方法的源代码行转换为一系列token,其中token为指定的关键字、标识符,基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对,其中第一类型克隆对为代码片段完全相同的克隆对,第二类型克隆对为代码结构或代码语法构成相同的克隆对;
方法相似度检测模块,被配置用于在剔除筛选出的第一类型和第二类型克隆对之后,通过分区键定位到相应的分区,设置token滑动窗口,通过重叠相似度衡量两种方法token之间的相似度,根据该相似度筛选出可能的第三类型克隆对,第三类型克隆对为大小相同、执行类似操作、具有相似调用的方法克隆对;
代码语义表示构建模块,被配置用于在剔除筛选出的第一类型、第二类型和第三类型克隆对之后,对于剩余的代码片段作,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图捕获数据值沿程序路径和操作的流动,获得代码行为的语义表示;
语义克隆检测模块,被配置用于基于代码语义表示利用预先训练的深度学习模型进行分类,检测出第四类型克隆对,第四类型克隆对为语义级别克隆代码。
应理解,本发明实施例中的电力数据安全监测系统代码克隆检测装置可以实现上述方法实施例中的全部技术方案,其各个功能模块的功能可以根据上述方法实施例中的方法具体实现,其具体实现过程可参照上述实施例中的相关描述,此处不再赘述。
本发明还提供一种计算机设备,包括:一个或多个处理器;存储器;以及一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如上所述的电力数据安全监测系统代码克隆检测方法的步骤。
本发明还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的电力数据安全监测系统代码克隆检测方法的步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、装置(系统)、计算机设备或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法的流程图来描述的。应理解可由计算机程序指令实现流程图中的每一流程以及流程图中的流程的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程中指定的功能的步骤。

Claims (10)

1.一种电力数据安全监测系统代码克隆检测方法,其特征在于,包括以下步骤:
消除不可能是克隆对的嵌入式代码后,根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,使得能够按分区索引搜索获取方法,所述分区索引机制包括:确定分区数量,基于代码方法的名称和版本确定分区键,利用哈希函数将分区键映射到特定的分区编号,将代码根据哈希函数分配到相应的分区,使得在对代码进行克隆检测时能够通过分区键定位到相应的分区,在不同的分区同时进行查找和访问方法;
将不同分区中的方法的源代码行转换为一系列token,其中token为指定的关键字、标识符,基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对,其中第一类型克隆对为代码片段完全相同的克隆对,第二类型克隆对为代码结构或代码语法构成相同的克隆对;
在剔除筛选出的第一类型和第二类型克隆对之后,通过分区键定位到相应的分区,设置token滑动窗口,通过重叠相似度衡量两种方法token之间的相似度,根据该相似度筛选出可能的第三类型克隆对,第三类型克隆对为大小相同、执行类似操作、具有相似调用的方法克隆对;
在剔除筛选出的第一类型、第二类型和第三类型克隆对之后,对于剩余的代码片段作,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图捕获数据值沿程序路径和操作的流动,获得代码行为的语义表示;
基于代码语义表示利用预先训练的深度学习模型进行分类,检测出第四类型克隆对,第四类型克隆对为语义级别克隆代码。
2.根据权利要求1所述的方法,其特征在于,针对分区数量的确定,综合考虑程序规模、数据量、业务逻辑、硬件资源进行分区数量的确定。
3.根据权利要求1所述的方法,其特征在于,方法大小的度量标准包括:记方法M1有x个token,方法M2有y个token,给定相似阈值T在0和1之间,当满足x×T≤y≤x/T时,判定方法M1和方法M2属于克隆对。
4.根据权利要求1所述的方法,其特征在于,通过重叠相似度衡量两种方法token之间的相似度的计算方法如下:
其中,sim<M1,M2>表示方法M1与方法M2之间的相似度,记A和B分别是方法M1和方法M2中token集,方法M1中token集A的每个元素被定义为<tai,freqtai,s,Na>,方法M2中token集B每个元素被定义为<tbj,freqtbj,s,Nb>,1≤i≤j≤n;s是设置的token滑动窗口;Na是方法M1的总行数,Nb是方法M2的总行数;freqtai是方法M1中token集A的tai在该滑动窗口下出现的次数,tai是方法M1中token集A的第i个token;freqtbj是方法M2中token集B的tbj在该滑动窗口下出现的次数,tbj是方法M2中token集B的第j个token;α为经过token滑动窗口划分后滑动窗口序号。
5.根据权利要求1所述的方法,其特征在于,在获取代码行为的语义表示时,通过变量特征、基本块特征以及变量和基本块之间的关系特征来编码控制流和数据流信息,其编码规则如下:
变量特征主要是通过对每个变量进行提取得到,其类型特征包含数据类型V(t)、修饰符V(m)和其他信息V(o),其中V(t)={bool、byte、char、double、float、int、long、short、void、JDK类、用户自定义类型},V(m)={final、static、none},V(o)={基本、数组、指针、引用},将上述的变量特征编码成一个18d的二进制特征向量V={V(t),V(m),V(o)};
基本块特征是针对每个基本块的特征,主要考虑以下七种类型:normal、loop、loopbody、if、if body、switch、switch body,将此类型信息编码为7维的one-hot特征向量D;
变量和基本块之间的关系特征,主要指将数据流和控制流编码为变量之间的操作和基本块之间的控制跳跃,总共包括38种主要的操作类型,加法:ADD;减法:SUB;乘法:MUL;除法:DIV;求余:REM;按位与:AND;按位或:OR;按位异或:XOR;左移:SHL;右移:SHR;无符号右移:USHR;取反:NEG;逻辑非:NOT;按位取反:BITNOT;等于:EQ;不等于:NE;大于:GT;大于等于:GE;小于:LT;小于等于:LE;类型检查:INSTANCEOF;类型转换:CHECKCAST;条件分支:COND_BRANCH;跳转:GOTO;类型转换:CONVERSION;数组长度:ARRAY_LENGTH;Phi函数:PHI;方法调用:INVOKE;获取捕获的异常:GET_CAUGHT_EXCEPTION;抽象方法调用:ABSTRACT_INVOKE;检查点:CHECKPOINT;条件开关:COND_SWITCH;字段赋值:PUT;字段获取:GET;获取地址:ADDRESSOF;返回:RETURN;分支:BRANCH;标识:IDENTITY,使用一个38维one-hot特征向量M表示;
为了保留数据流图中变量之间的每个操作的信息,生成了一个18*2+38=74d特征向量T={Voption1,Voption2,M},其中Voption1和Voption2分别表示语义矩阵编码中变量option1和option2的特征向量,为了保持控制流,将T扩展为大小为81d的{Voption1,Voption2,M,D}。
6.根据权利要求5所述的方法,其特征在于,代码行为的语义表示为根据所述编码规则生成语义特征矩阵E,E中的每一行和每一列都是一个变量或基本块,其顺序对应于代码指令和基本块顺序,E(i,j)=T(i,j)是大小为81的二进制特征向量,表示行i和列j之间的关系,i,j=1,2…n,其中n=nv+bb是变量计数和基本块计数的总和。
7.根据权利要求6所述的方法,其特征在于,深度学习模型通过如下方式建立:
基于将数据流和控制流编码的稀疏二进制特征向量,将其映射到大小为c的隐藏状态h0,c为一个常数;然后将语义特征矩阵的每一行转换为长度为c·k的向量,k为指定的输入矩阵大小;接着添加两个全连接层,将弱化的行特征向量作为输入,以提取与每行表示的变量或基本块相关的所有信息;最后,添加一个池化层来汇总所有的行特征向量,将两个方法的语义矩阵的潜在表示向量以不同的顺序连接起来,在两个具有共享权重Wfc的连接向量上应用全连接层,对输出状态执行另一个平均池,最后添加分类层。
8.一种电力数据安全监测系统代码克隆检测装置,其特征在于,包括:
代码分区模块,被配置用于消除不可能是克隆对的嵌入式代码后,根据分区索引机制,将待检测电力数据安全监测系统软件源代码进行分区,使得能够按分区索引搜索获取方法,所述分区索引机制包括:确定分区数量,基于代码方法的名称和版本确定分区键,利用哈希函数将分区键映射到特定的分区编号,将代码根据哈希函数分配到相应的分区,使得在对代码进行克隆检测时能够通过分区键定位到相应的分区,在不同的分区同时进行查找和访问方法;
方法大小检测模块,被配置用于将不同分区中的方法的源代码行转换为一系列token,其中token为指定的关键字、标识符,基于方法大小的度量标准,筛选出可能的第一类型和第二类型克隆对,其中第一类型克隆对为代码片段完全相同的克隆对,第二类型克隆对为代码结构或代码语法构成相同的克隆对;
方法相似度检测模块,被配置用于在剔除筛选出的第一类型和第二类型克隆对之后,通过分区键定位到相应的分区,设置token滑动窗口,通过重叠相似度衡量两种方法token之间的相似度,根据该相似度筛选出可能的第三类型克隆对,第三类型克隆对为大小相同、执行类似操作、具有相似调用的方法克隆对;
代码语义表示构建模块,被配置用于在剔除筛选出的第一类型、第二类型和第三类型克隆对之后,对于剩余的代码片段作,通过控制流捕获代码基本块和过程之间的依赖关系,通过数据流图捕获数据值沿程序路径和操作的流动,获得代码行为的语义表示;
语义克隆检测模块,被配置用于基于代码语义表示利用预先训练的深度学习模型进行分类,检测出第四类型克隆对,第四类型克隆对为语义级别克隆代码。
9.一种计算机设备,其特征在于,包括:
一个或多个处理器;
存储器;以及
一个或多个程序,其中所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述程序被处理器执行时实现如权利要求1-7中任一项所述的电力数据安全监测系统代码克隆检测方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-6中任一项所述的电力数据安全监测系统代码克隆检测方法的步骤。
CN202410344018.7A 2024-03-25 2024-03-25 一种电力数据安全监测系统代码克隆检测方法和装置 Pending CN118260765A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410344018.7A CN118260765A (zh) 2024-03-25 2024-03-25 一种电力数据安全监测系统代码克隆检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410344018.7A CN118260765A (zh) 2024-03-25 2024-03-25 一种电力数据安全监测系统代码克隆检测方法和装置

Publications (1)

Publication Number Publication Date
CN118260765A true CN118260765A (zh) 2024-06-28

Family

ID=91608668

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410344018.7A Pending CN118260765A (zh) 2024-03-25 2024-03-25 一种电力数据安全监测系统代码克隆检测方法和装置

Country Status (1)

Country Link
CN (1) CN118260765A (zh)

Similar Documents

Publication Publication Date Title
Bui et al. Infercode: Self-supervised learning of code representations by predicting subtrees
WO2023124204A1 (zh) 反欺诈风险评估方法、训练方法、装置及可读存储介质
CN111459799B (zh) 一种基于Github的软件缺陷检测模型建立、检测方法及系统
CN112579477A (zh) 一种缺陷检测方法、装置以及存储介质
CN114861194A (zh) 一种基于bgru与cnn融合模型的多类型漏洞检测方法
Cao et al. FTCLNet: Convolutional LSTM with Fourier transform for vulnerability detection
Liu et al. Tell: log level suggestions via modeling multi-level code block information
Zhang et al. CPVD: Cross project vulnerability detection based on graph attention network and domain adaptation
Wang et al. BugPre: an intelligent software version-to-version bug prediction system using graph convolutional neural networks
CN113076089B (zh) 一种基于对象类型的api补全方法
Chen et al. Definition, approaches, and analysis of code duplication detection (2006–2020): a critical review
Wen et al. A cross-project defect prediction model based on deep learning with self-attention
Huang et al. Code clone detection based on event embedding and event dependency
CN114090769A (zh) 实体挖掘方法、装置、计算机设备和存储介质
Tang et al. An attention-based automatic vulnerability detection approach with GGNN
Huang et al. Software defect prediction model based on attention mechanism
US20230385037A1 (en) Method and system for automated discovery of artificial intelligence (ai)/ machine learning (ml) assets in an enterprise
Haojie et al. Vulmg: A static detection solution for source code vulnerabilities based on code property graph and graph attention network
CN115098389B (zh) 一种基于依赖模型的rest接口测试用例生成方法
Tsai et al. Generating construction safety observations via CLIP-based image-language embedding
US20220179894A1 (en) Automatic document classification
CN118260765A (zh) 一种电力数据安全监测系统代码克隆检测方法和装置
Duan et al. A New Smart Contract Anomaly Detection Method by Fusing Opcode and Source Code Features for Blockchain Services
Liu et al. Prompt Learning for Multi-Label Code Smell Detection: A Promising Approach
Fang et al. Log Anomaly Detection Based on Hierarchical Graph Neural Network and Label Contrastive Coding.

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