一种基于控制流图的代码错误自动检出方法技术

技术编号:35151621 阅读:15 留言:0更新日期:2022-10-05 10:30
本发明专利技术涉及一种基于控制流图的代码错误自动检出方法。本发明专利技术根据提交代码生成控制流图;根据提交代码的控制流图与数据库中已有的代码进行比对,找到结构上最相似的代码;通过计算每个节点的代码相似度来判断该节点是否可能出错;通过找到数据库内与源代码逻辑相似的正确代码,从而进一步定位代码的错误位置。本发明专利技术通过发挥控制流图的特点,弥补了现有在线测评系统的短板。目前在线测评系统中大多只有代码检测抄袭系统,而没有代码错误自动检出系统,通过本系统能帮助用快速定位自己程序的错误位置,从而加快编程效率。在教学活动中,减少教师为学生检查代码的时间,从而大大减轻教师的负担,将时间更多的用在教学任务上。将时间更多的用在教学任务上。将时间更多的用在教学任务上。

【技术实现步骤摘要】
一种基于控制流图的代码错误自动检出方法


[0001]本专利技术属于代码错误自动检出
,涉及一种基于控制流图的代码错误自动检出方法。

技术介绍

[0002]国外学者在20世纪70年代便出现了关于文本复制检测的相关研究,诸多学者们开始主要针对程序代码克隆复制检测技术进行研究。目前代码克隆技术主要有以下几类:
[0003]一、现有基于tree的代码查重技术:T.Kamiya,S.Kusumoto(2002)等人发现基于token的查重方法速度快,所需资源更少。但却无法检测所有类型的代码克隆。而基于树的查重方法可以检测所有类型的代码克隆,但它速度慢且需要大量计算资源。因此提出了一种基于树和基于token的方法相结合的高速,高精度代码查重方法,以提高检测代码克隆的效率和准确性。曾杰,贲可荣(2020)等人提出一种基于程序向量树的代码查重方法,通过实验分析发现,对于Moderately Type

3和Type

4类型的表面相似程度较低的代码克隆而言,利用该方法进行检测具有明显优势,但是该方法目前只针对Java程序,以及评测数据集BigCloneBench只包含Java程序,因此迁移到其他程序语言需要进一步提出针对性的二叉树生成规则。
[0004]二、基于图的代码查重技术:Komondoor R,Horwitz S(2001)介绍了使用程序依赖图PDG(Program Dependence Graph)和程序切片来查找表示克隆的同构PDG子图。该方法可以找到不连续的代码克隆,对匹配语句进行了重新排序的克隆以及彼此交织的克隆。汪敏(2018)对传统的基PDG的代码查重技术进行优化,实现了一种基于机器学习的新型PDG的代码查重方法,该方法对于检测时间有明显的提升,但是进行PDG的子图同构判定时是首先将PDG的节点转化为一个类型进行匹配,这使得部分的语句的语义信息会损失,在克隆判定中可能会出现假阳性的结果。
[0005]三、基于度量的代码查重技术:Kontogiannis K A,DeMori R(1996)等人提出了一种基于源代码度量动态编程算法,用于在两个代码片段之间找到最佳对齐方式,以及一种以抽象语言表示的抽象代码描述与实际源代码之间的统计匹配算法[5]。Perumal A,Kanmani S(2010)等人提出了一种用于查找相似代码块并量化其相似性的新技术。他们的技术可用于查找用户提供的相似度内的克隆簇,代码块集。它使用类型1,类型2的度量标准检测相似的克隆。
[0006]综上,近年来代码查重方法引起了广泛国内外学者们的关注与重视,并取得了一定的研究成果。但绝大多数的代码查重技术仍停留在研究层面,并未发展到实际应用中。针对学生作业、竞赛提交代码,不仅仅需要依据代码查重技术对提交代码和正确代码进行比对,还需要判断代码具体出错位置。本专利对学生作业、竞赛的提交代码进行了研究,设计出一种基于控制流图的代码错误自动检出方法。

技术实现思路

[0007]本专利技术的目的就是提供一种基于控制流图的代码错误自动检出方法,能自动检出用户向在线评测系统提交的代码错误,方便用户定位错误位置。
[0008]本专利技术具体包括如下步骤:
[0009]步骤1、生成控制流图:
[0010]设数据库中的待检测代码有n份,编号为1,2,3,

,n。在编译代码时,编号为i的代码生成对应的控制流图G[i],G[i]中会生成m+1个节点的第j(0≤j≤m)个节点为N[i][j],其对应的源代码为C[i][j];
[0011]并通过编译器去除对代码逻辑不产生影响的节点并对单入单出的多个节点进行合并。
[0012]步骤2、子图匹配:
[0013]将待检测代码的控制流图G[i]与正确代码C[k]生成的控制流图G[k]进行子图同构和节点的匹配,若两个程序的控制流图最多相差一个节点并且通过简单的加边加点的操作后两图同构,则认为这两份控制流图是能匹配的。子图同构指的是给定两个图G=(V,E,u,v)和G'=(V',E',u',v'),S是G'的子图,如果存在一个函数f:V

V',且f是从G到S的同构,那么,称f是从G到G'的子图同构。经过子图同构算法之后,得到一个结构相似度的集合S,取S中的最大值S[k],表示代码i与k最为相似,即K=argmax(S[k]);
[0014]步骤3、分支修正:
[0015]在获得图同构的相关映射之后,直接进行后续的操作,由于在匹配过程中没有将节点的具体的代码内容加入考虑,一个节点的分支对应关系有可能发生颠倒,容易发生误判;
[0016]因此进行分支修正,对于源控制流图的每一个分支的节点,将其与目标控制流图的分支节点使用基于字符的文本相似度计算进行相应的相似度检测,将相似度最高的两个节点定义为匹配关系,从而尽可能使得分支的顺序正确,降低错误检出的误报率。
[0017]设正确的代码C[k]生成的控制流图中的分支节点有m+1个,编号为0,1,2,3,

,q。对于C[k]中的每一个分支节点N[k][j](0≤j≤q),将其与C[i]生成的控制流图中的分支节点集合N[i]中的所有分支节点进行LCS(最长公共子序列)距离计算。若N[k][j]与N[i]中p节点的相似度大于与N[i]中其他节点的相似度,认为k中的分支节点N[k][j]与i中的分支节点N[i][p]是匹配的。
[0018]步骤4、以节点为单位进行相似度计算:
[0019]采用编辑距离进行文本相似度比较,采用LCS(最长公共子序列)距离来定义编辑距离。LCS距离源字符串S的长度为L1,目标字符串T的长度为L2,S与T之间的LCS距离为EL,那么可以将S与T之间的文本相似度similarity定义为:similarity=1

EL/(L1+L2)。
[0020]得到两份代码的匹配关系后,要判断两者节点内代码的相似度。将提交代码C[i]与正确代码C[k],即两份代码的源代码的所有节点按照节点匹配关系进行一次基于文本相似度的比较,得到的文本相似度集合T,若其中T[j]的数值小于阈值(根据需求人为设定),则认为代码C[i][j]处有错误。
[0021]本专利技术通过发挥控制流图的特点,弥补了一些现有在线测评系统的短板。目前在线测评系统中大多只有代码检测抄袭系统,而没有代码错误自动检出系统,通过本系统能
帮助用快速定位自己程序的错误位置,从而加快编程效率。在教学活动中,减少教师为学生检查代码的时间,从而大大减轻教师的负担,将时间更多的用在教学任务上。
附图说明
[0022]图1为本专利技术的整体过程流程图。
具体实施方式
[0023]为了使本专利技术的目的、技术方案及优点更加清楚明白,以下将结合附图及实施例,对本专利技术进一步详细说明。
[0024]如图1所示,一种基于控制流图的代码错误自动检出方法,具体为:根据提交代码生成控制流图;根本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于控制流图的代码错误自动检出方法,其特征在于:具体包括如下步骤:步骤1、生成控制流图:设数据库中的待检测代码有n份,编号为1,2,3,

,n;在编译代码时,编号为i的代码生成对应的控制流图G[i],G[i]中会生成m+1个节点的第j(0≤j≤m)个节点为N[i][j],其对应的源代码为C[i][j];步骤2、子图匹配:将待检测代码的控制流图G[i]与正确代码C[k]生成的控制流图G[k]进行子图同构和节点的匹配,若两个程序的控制流图最多相差一个节点并且通过简单的加边加点的操作后两图同构,则认为这两份控制流图是能匹配的;子图同构指的是给定两个图G=(V,E,u,v)和G'=(V',E',u',v'),S是G'的子图,如果存在一个函数f:V

V',且f是从G到S的同构,那么,称f是从G到G'的子图同构;经过子图同构算法之后,得到一个结构相似度的集合S,取S中的最大值S[k],表示代码i与k最为相似,即K=argmax(S[k]);步骤3、分支修正:在获得图同构的相关映射之后,直接进行后续的操作,由于在匹配过程中没有将节点的具体的代码内容加入考虑,一个节点的分支对应关系有可能发生颠倒,容易发生误判;因此进行分支修正,对于源控制流图的每一个分支的节点,将其与目标控制流图的分支节点使用基于字符的文本相似度计算进行相应的相似度检测,将相似度最高的两个节点...

【专利技术属性】
技术研发人员:单振宇周婉婧陈雨欣
申请(专利权)人:杭州师范大学
类型:发明
国别省市:

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

1