一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于模板的并发缺陷修复系统及方法

2022-04-13 22:19:56 来源:中国专利 TAG:


1.本发明属于软件安全领域,特别涉及一种基于模板的并发缺陷修复系统及方法。


背景技术:

2.随着计算机软件技术的发展,并发程序正广泛应用于软件系统的开发过程中。由于其内在的并发性、线程调度的不确定性和代码规模的庞大,并发程序易于遭遇并发缺陷。并发缺陷通常会导致程序或系统陷入一种不确定的运行状态,甚至带来系统崩溃等严重问题,造成巨大的经济损失。然而,并发缺陷往往暴露在罕见且特定的交错执行中,开发人员很难有效、高效地检测并修复它们。因此,对并发缺陷修复的研究已经成为近年来学术界和工业界的热点问题。当开发人员面临大量并发缺陷时,如果能够根据缺陷代码以及修复代码挖掘出相关的修复模板,则可以大幅提高开发人员修复并发缺陷的效率。
3.目前,已有的并发缺陷修复工作大多通过动态或静态地插入门锁,以序列化并发缺陷中涉及的所有线程的执行。如文献《g.jin,l.h,song,w.zhang,s.lu,b.liblit.automated atomicity-violation fixing.in proc.pldi,389

400,2011.》通过插入新的锁来修复并发缺陷中的常见类型:原子性违背。然而,这种方法的修复很可能会引入新的死锁,并导致较高的运行时开销。并且该修复不考虑缺陷上下文,即导致缺陷的共享变量和锁的混叠配置,因此,不能保证修复的准确性。也用一些工作在此基础上提出改进,避免修复引入新的死锁,如文献《p.liu,o.tripp,and c.zhang.grail:context-aware fixing of concurrency bugs.in proc.fse,318

329,2014.》采用petri-net分析来消除这种引入的死锁,但它只能修复由两个线程引发的死锁,普适性不高。


技术实现要素:

4.发明目的:针对上述现有技术的问题,本发明目的在于提供一种具有应用领域更广、精度更高、定位更准等特点的基于模板的并发缺陷修复系统及方法。
5.技术方案:为实现上述发明目的,本发明具体采用了如下技术方案:
6.本发明提供了一种基于模板的并发缺陷修复系统,包括:数据集采集模块,用以通过爬取开源缺陷跟踪系统中开源项目的缺陷报告,检索并筛选所有与并发相关的缺陷,并提取对应的补丁文件;富编辑脚本计算模块,用以将补丁文件转化为特殊的变更树表示;修复模板提取模块,用以通过比较变更树的相似度来提取修复模板;并发缺陷修复模块,用以把修复模板和已知缺陷代码行号的待修复文件作为输入进行模板匹配,匹配成功后通过重构源码完成并发缺陷的修复。
7.进一步的,在数据集采集模块中:
8.以类型为“缺陷”,状态为“已解决”、“已修复”和“已关闭”,爬取开源缺陷跟踪系统bugzilla中开源项目的缺陷报告;以“并发的”、“并发性”、“死锁”、“原子性违背”、“数据竞争”、“资源竞争”、“顺序违背”、“线程安全”、“多线程”以及“同步”作为关键词检索缺陷报告,筛选所有与并发相关的缺陷,并提取对应的补丁文件。
9.进一步的,在富编辑脚本计算模块中:
10.将补丁文件使用gumtree计算出该补丁文件的抽象语法树ast的编辑操作序列并重新映射到程序ast中的相关节点;从gumtree编辑操作的节点开始,从下到上遍历已解析的程序ast,直到到达一个预定义的根节点,预定义的根节点类型如下:类型声明、域声明、方法声明、分支语句、抓取子句、构造器调用、父构造器调用或任何语句节点;对到达的预定义的根节点,从根节点到映射到gumtree编辑操作的叶节点之间提取ast子树;对提取的ast子树,创建有序序列,并将该有序序列存储为富编辑脚本;富编辑脚本描述了对一个给定的修复前的程序ast进行的操作,以将修复前的程序ast转换为修复后的程序ast,树中的每个节点都是受变更的代码影响的ast节点,富编辑脚本中的每个节点都包含三种不同类型的信息:形状、操作和令牌。
11.进一步的,在修复模板提取模块中:
12.构建搜索索引,即一组比较子空间,为每次迭代分别定义一个搜索索引,依次得到形状索引、操作索引、令牌索引;其中,迭代的类型包括:形状、操作以及令牌;搜索索引的构建方法是将富编辑脚本按照标准进行分组,其中,这些标准依赖于不同迭代中所使用的变更树表示的嵌入信息;
13.形状索引的构建是将富编辑脚本的形状树表示为输入,并根据该形状树的结构按照ast节点类型进行分组,具有相同根节点和相同深度的富编辑脚本被分为一组,对于每个组,通过枚举组成员的成对组合来创建一个比较空间;形状索引通过存储每个组的标识符来构建,表示为根节点/深度;
14.操作索引的构建遵循与形状索引相同的原则,重新分组基于形状树的聚类输出,输入由富编辑脚本的操作树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id;
15.令牌索引的构建遵循与操作索引相同的原则,重新分组基于操作树的聚类输出,输入由富编辑脚本的令牌树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id/基于操作树的聚类生成的id;
16.分别计算富编辑脚本的前两种表示的树编辑距离,即将一棵树转换为另一棵树的编辑操作序列,对于前两次迭代,即形状与操作,利用gumtree的编辑脚本算法,将两棵树作为输入,并生成编辑脚本,编辑脚本的大小即表示两棵树之间的树编辑距离,当树编辑距离为零时,输入的两棵树被认为是相同的,两棵相同的树被称为相同树对;
17.为了提取修复模板,利用富编辑脚本的特殊的变更树表示的簇,从为每个迭代生成的相同树对开始,根据迭代提取相应的变更树表示,利用基于图中连接组件识别理论的聚类过程以找到一组相同的树,即簇;从树对集合中创建一个无向图,图中的节点表示树,边表示关联的树,即相同树对;在图中,将簇定义为子图,每个子图包含一组树,这组树彼此相同,互不关联,一个簇包含一个富编辑脚本集合,同一集合中的富编辑脚本共享一个公共的特殊树表示,当一个簇至少有两个成员时,该簇被限定为一个模板。
18.进一步的,在并发缺陷修复模块中:
19.利用开源工具antlr将待修复文件解析为ast,源码中的空格、注释的内容也被antlr解析成对应类型的节点;修复模板的匹配是基于缺陷代码的ast上下文信息进行的,依次遍历可疑语句ast的每个节点,从可疑语句ast的第一个子节点到最后一个叶子节点,
并尝试将每个节点与修复模板的上下文ast匹配,若一个节点可以匹配给出的任何缺陷上下文,则成功匹配相应的修复模板,若该节点非叶子节点,则继续遍历它的叶子节点;成功匹配修复模板后,对缺陷代码的ast上相应的节点进行插入、删除、更新、移动操作,以重构源码,并完成并发缺陷的修复。
20.另外,本发明提供了一种基于模板的并发缺陷修复方法,包括:步骤1,通过爬取开源缺陷跟踪系统中开源项目的缺陷报告,检索并筛选所有与并发相关的缺陷,并提取对应的补丁文件;步骤2,将补丁文件转化为特殊的变更树表示;步骤3,通过比较变更树的相似度来提取修复模板;步骤4,把修复模板和已知缺陷代码行号的待修复文件作为输入进行模板匹配,匹配成功后通过重构源码完成并发缺陷的修复。
21.进一步的,在步骤1中:
22.以类型为“缺陷”,状态为“已解决”、“已修复”和“已关闭”,爬取开源缺陷跟踪系统bugzilla中开源项目的缺陷报告;以“并发的”、“并发性”、“死锁”、“原子性违背”、“数据竞争”、“资源竞争”、“顺序违背”、“线程安全”、“多线程”以及“同步”作为关键词检索缺陷报告,筛选所有与并发相关的缺陷,并提取对应的补丁文件。
23.进一步的,在步骤2中:
24.将补丁文件使用gumtree计算出该补丁文件的抽象语法树ast的编辑操作序列并重新映射到程序ast中的相关节点;从gumtree编辑操作的节点开始,从下到上遍历已解析的程序ast,直到到达一个预定义的根节点,预定义的根节点类型如下:类型声明、域声明、方法声明、分支语句、抓取子句、构造器调用、父构造器调用或任何语句节点;对到达的预定义的根节点,从根节点到映射到gumtree编辑操作的叶节点之间提取ast子树;对提取的ast子树,创建有序序列,并将该有序序列存储为富编辑脚本;富编辑脚本描述了对一个给定的修复前的程序ast进行的操作,以将修复前的程序ast转换为修复后的程序ast,树中的每个节点都是受变更的代码影响的ast节点,富编辑脚本中的每个节点都包含三种不同类型的信息:形状、操作和令牌。
25.进一步的,在步骤3中:
26.构建搜索索引,即一组比较子空间,为每次迭代分别定义一个搜索索引,依次得到形状索引、操作索引、令牌索引;其中,迭代的类型包括:形状,操作以及令牌;搜索索引的构建方法是将富编辑脚本按照标准进行分组,其中,这些标准依赖于不同迭代中所使用的变更树表示的嵌入信息;
27.形状索引的构建是将富编辑脚本的形状树表示为输入,并根据该形状树的结构按照ast节点类型进行分组,具有相同根节点和相同深度的富编辑脚本被分为一组,对于每个组,通过枚举组成员的成对组合来创建一个比较空间;形状索引通过存储每个组的标识符来构建,表示为根节点/深度;
28.操作索引的构建遵循与形状索引相同的原则,重新分组基于形状树的聚类输出,输入由富编辑脚本的操作树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id;
29.令牌索引的构建遵循与操作索引相同的原则,重新分组基于操作树的聚类输出,输入由富编辑脚本的令牌树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id/基于操作树的聚类生成的id;
violations(原子性违背)、“data race”(数据竞争)、“race condition”(资源竞争)、“order violations”(顺序违背)、“thread-safety”(线程安全)、“multi-thread”(多线程)以及“synchronization”(同步)作为关键词检索缺陷报告,筛选所有与并发相关的缺陷,并提取对应的补丁文件。
41.进一步的,在富编辑脚本计算模块中:
42.将补丁文件使用gumtree计算出该补丁文件的抽象语法树ast的编辑操作序列并重新映射到程序ast中的相关节点;从gumtree编辑操作的节点开始,从下到上遍历已解析的程序ast,直到到达一个预定义的根节点,预定义的根节点类型如下:typedeclaration(类型声明)、fielddeclaration(域声明),methoddeclaration(方法声明)、switchcase(分支语句)、catchclause(抓取子句)、constructorinvocation(构造器调用)、superconstructorinvocation(父构造器调用)或任何语句节点;对到达的预定义的根节点,从根节点到映射到gumtree编辑操作的叶节点之间提取ast子树;对提取的ast子树,创建有序序列,并将该有序序列存储为富编辑脚本;富编辑脚本描述了对一个给定的修复前的程序ast进行的操作,以将修复前的程序ast转换为修复后的程序ast,树中的每个节点都是受变更的代码影响的ast节点,富编辑脚本中的每个节点都包含三种不同类型的信息:形状、操作和令牌。
43.进一步的,在修复模板提取模块中:
44.为了解决富编辑脚本的直接成对比较而导致的比较空间的组合爆炸问题,构建搜索索引,即一组比较子空间,为每次迭代分别定义一个搜索索引,依次得到形状索引、操作索引、令牌索引;其中,迭代的类型包括:形状、操作以及令牌;搜索索引的构建方法是将富编辑脚本按照标准进行分组,其中,这些标准依赖于不同迭代中所使用的变更树表示的嵌入信息;
45.形状索引的构建是将富编辑脚本的形状树表示为输入,并根据该形状树的结构按照ast节点类型进行分组,具有相同根节点和相同深度的富编辑脚本被分为一组,对于每个组,通过枚举组成员的成对组合来创建一个比较空间;形状索引通过存储每个组的标识符来构建,表示为根节点/深度;
46.操作索引的构建遵循与形状索引相同的原则,重新分组基于形状树的聚类输出,输入由富编辑脚本的操作树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id;
47.令牌索引的构建遵循与操作索引相同的原则,重新分组基于操作树的聚类输出,输入由富编辑脚本的令牌树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id/基于操作树的聚类生成的id;
48.分别计算富编辑脚本的前两种表示的树编辑距离,即将一棵树转换为另一棵树的编辑操作序列,对于前两次迭代,即形状与操作,利用gumtree的编辑脚本算法,将两棵树作为输入,并生成编辑脚本,编辑脚本的大小即表示两棵树之间的树编辑距离,当树编辑距离为零时,输入的两棵树被认为是相同的,两棵相同的树被称为相同树对;
49.为了提取修复模板,利用富编辑脚本的特殊的变更树表示的簇,从为每个迭代生成的相同树对开始,根据迭代提取相应的变更树表示,利用基于图中连接组件识别理论的聚类过程以找到一组相同的树,即簇;从树对集合中创建一个无向图,图中的节点表示树,
边表示关联的树,即相同树对;在图中,将簇定义为子图,每个子图包含一组树,这组树彼此相同,互不关联,一个簇包含一个富编辑脚本集合,同一集合中的富编辑脚本共享一个公共的特殊树表示,当一个簇至少有两个成员时,该簇被限定为一个模板。
50.进一步的,在并发缺陷修复模块中:
51.利用开源工具antlr将待修复文件解析为ast,源码中的空格、注释的内容也被antlr解析成对应类型的节点;修复模板的匹配是基于缺陷代码的ast上下文信息进行的,依次遍历可疑语句ast的每个节点,从可疑语句ast的第一个子节点到最后一个叶子节点,并尝试将每个节点与修复模板的上下文ast匹配,若一个节点可以匹配给出的任何缺陷上下文,则成功匹配相应的修复模板,若该节点非叶子节点,则继续遍历它的叶子节点;成功匹配修复模板后,对缺陷代码的ast上相应的节点进行插入、删除、更新、移动操作,以重构源码,并完成并发缺陷的修复。
52.实施例二
53.本实施例提供一种基于模板的并发缺陷修复方法,如图1所示。基于模板的并发缺陷修复方法,包括:步骤1,通过爬取开源缺陷跟踪系统中开源项目的缺陷报告,检索并筛选所有与并发相关的缺陷,并提取对应的补丁文件;步骤2,将补丁文件转化为特殊的变更树表示;步骤3,通过比较变更树的相似度来提取修复模板;步骤4,把修复模板和已知缺陷代码行号的待修复文件作为输入进行模板匹配,匹配成功后通过重构源码完成并发缺陷的修复。
54.进一步的,在步骤1中:
55.以类型为“bug”(缺陷),状态为“resolved”(已解决)、“fixed”(已修复)和“closed”(已关闭),爬取开源缺陷跟踪系统bugzilla中开源项目的缺陷报告;以“concurrent”(并发的)、“concurrency”(并发性)、“deadlock”(死锁)、“atomicity violations(原子性违背)、“data race”(数据竞争)、“race condition”(资源竞争)、“order violations”(顺序违背)、“thread-safety”(线程安全)、“multi-thread”(多线程)以及“synchronization”(同步)作为关键词检索缺陷报告,筛选所有与并发相关的缺陷,并提取对应的补丁文件。
56.进一步的,在步骤2中:
57.将补丁文件使用gumtree计算出该补丁文件的抽象语法树ast的编辑操作序列并重新映射到程序ast中的相关节点;从gumtree编辑操作的节点开始,从下到上遍历已解析的程序ast,直到到达一个预定义的根节点,预定义的根节点类型如下:typedeclaration(类型声明)、fielddeclaration(域声明),methoddeclaration(方法声明)、switchcase(分支语句)、catchclause(抓取子句)、constructorinvocation(构造器调用)、superconstructorinvocation(父构造器调用)或任何语句节点;对到达的预定义的根节点,从根节点到映射到gumtree编辑操作的叶节点之间提取ast子树;对提取的ast子树,创建有序序列,并将该有序序列存储为富编辑脚本;富编辑脚本描述了对一个给定的修复前的程序ast进行的操作,以将修复前的程序ast转换为修复后的程序ast,树中的每个节点都是受变更的代码影响的ast节点,富编辑脚本中的每个节点都包含三种不同类型的信息:形状、操作和令牌。
58.进一步的,在步骤3中:
59.为了解决富编辑脚本的直接成对比较而导致的比较空间的组合爆炸问题,构建搜索索引,即一组比较子空间,为每次迭代分别定义一个搜索索引,依次得到形状索引、操作索引、令牌索引;其中,迭代的类型包括:形状、操作以及令牌;搜索索引的构建方法是将富编辑脚本按照标准进行分组,其中,这些标准依赖于不同迭代中所使用的变更树表示的嵌入信息;
60.形状索引的构建是将富编辑脚本的形状树表示为输入,并根据该形状树的结构按照ast节点类型进行分组,具有相同根节点和相同深度的富编辑脚本被分为一组,对于每个组,通过枚举组成员的成对组合来创建一个比较空间;形状索引通过存储每个组的标识符来构建,表示为根节点/深度;
61.操作索引的构建遵循与形状索引相同的原则,重新分组基于形状树的聚类输出,输入由富编辑脚本的操作树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id;
62.令牌索引的构建遵循与操作索引相同的原则,重新分组基于操作树的聚类输出,输入由富编辑脚本的令牌树表示构成,每个比较空间的组标识符生成为根节点/深度/基于形状树的聚类生成的id/基于操作树的聚类生成的id;
63.分别计算富编辑脚本的前两种表示的树编辑距离,即将一棵树转换为另一棵树的编辑操作序列,对于前两次迭代,即形状与操作,利用gumtree的编辑脚本算法,将两棵树作为输入,并生成编辑脚本,编辑脚本的大小即表示两棵树之间的树编辑距离,当树编辑距离为零时,输入的两棵树被认为是相同的,两棵相同的树被称为相同树对;
64.为了提取修复模板,利用富编辑脚本的特殊的变更树表示的簇,从为每个迭代生成的相同树对开始,根据迭代提取相应的变更树表示,利用基于图中连接组件识别理论的聚类过程以找到一组相同的树,即簇;从树对集合中创建一个无向图,图中的节点表示树,边表示关联的树,即相同树对;在图中,将簇定义为子图,每个子图包含一组树,这组树彼此相同,互不关联,一个簇包含一个富编辑脚本集合,同一集合中的富编辑脚本共享一个公共的特殊树表示,当一个簇至少有两个成员时,该簇被限定为一个模板。
65.进一步的,在步骤4中:
66.利用开源工具antlr将待修复文件解析为ast,源码中的空格、注释的内容也被antlr解析成对应类型的节点;修复模板的匹配是基于缺陷代码的ast上下文信息进行的,依次遍历可疑语句ast的每个节点,从可疑语句ast的第一个子节点到最后一个叶子节点,并尝试将每个节点与修复模板的上下文ast匹配,若一个节点可以匹配给出的任何缺陷上下文,则成功匹配相应的修复模板,若该节点非叶子节点,则继续遍历它的叶子节点;成功匹配修复模板后,对缺陷代码的ast上相应的节点进行插入、删除、更新、移动操作,以重构源码,并完成并发缺陷的修复。
67.本发明具体实现该技术方案的方法和途径很多,以上仅是本发明的优选实施方式。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。本实施例中未明确的各组成部分均可用现有技术加以实现。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献