一种基于重构控制流图的控制流错误检测优化方法转让专利

申请号 : CN201010504386.1

文献号 : CN101944064B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 谭庆平李建立宁洪徐建军周会平谭兰芳徐锡山

申请人 : 中国人民解放军国防科学技术大学

摘要 :

本发明公开了一种基于重构控制流图的控制流错误检测优化方法,目的是提供一种新的基于重构控制流图的控制流错误检测优化方法,解决检错效率不高等问题。技术方案是将源程序划分为基本块,构建基本块表,并基于基本块表构建程序控制流图,然后基于控制流图,划分逻辑块,构建逻辑块表,接着复制基本块,使得逻辑块相互独立,再根据配置要求均匀切割逻辑块,构建基本逻辑块表,最后基于基本逻辑块表,重构程序控制流图。基于重构的控制流图即可实现现有的控制流错误检测算法。采用本发明能够灵活配置基本块的划分,使得现有的控制流检错算法能够基于重构的控制流图直接应用,有效提高检错算法的效率。

权利要求 :

1.一种基于重构控制流图的控制流错误检测优化方法,包括以下步骤:第一步,将源程序划分为基本块,构建基本块表;

第二步,基于基本块表,构建程序控制流图;

其特征在于还包括以下步骤:

第三步,基于控制流图,划分逻辑块,构建逻辑块表:

3.1构造并初始化局部路径链和标志位:分别为每个基本块构造一个局部路径链,局部路径链是多个基本块组成的链表,链表中每个结点存放一个基本块编号,链表的第一个结点定义为链头,链表的最后一个结点定义为链尾;为基本块Bm构造的局部路径链Lm的链头存放Bm的编号;针对每个局部路径链分别创建一个对应的标志位,初始值置为真;

3.2基于控制流图更新局部路径链:针对每个对应标志位为真的局部路径链,若该链表的链尾对应的基本块Bend是分界块,则将该链表对应的标志位置为假;若Bend不是分界块,则查找控制流图中Bend的后继基本块,并将后继基本块的编号作为一个新结点插入到链表尾部;分界块指多扇出块、程序结束块、函数调用块的前驱、函数调用块或出口块,多扇出块是指控制流图中有多于一个后继的基本块;

3.3判断是否所有局部路径链对应的标志位都为假,如果是则执行第3.4步,否则转到第3.2步;

3.4删除符合条件的局部路径链:选择满足如下删除条件的链表Lshort和Llong,然后删除Lshort:·Lshort是Llong中的一段;且

·Lshort的链头对应的基本块在控制流图中的任何前驱基本块都不是分界块;

3.5判断是否还存在符合第3.4步删除条件的局部路径链,如果是则执行第3.4步,否则转到第3.6步;

3.6基于局部路径链构建逻辑块表:为每个局部路径链分配编号,将每个局部路径链和对应的编号作为一条记录存入逻辑块表,此时,每个局部路径链里的所有基本块构成一个逻辑块,每个局部路径链的编号即为对应逻辑块的编号;逻辑块是一个确定先后执行的基本块序列,逻辑块的最后一个基本块是分界块,第一个基本块在控制流图中的前驱至少有一个是分界块;

第四步,复制基本块,使得逻辑块相互独立,本步骤的具体过程是:

4.1复制公共基本块:从逻辑块表中选择含有公共基本块的两个逻辑块L1和L2,然后选择距离L1的链头最近的公共基本块B,并在源程序中复制B得到副本基本块B′;

4.2修改控制流关系:保持逻辑块L1不变,修改L2内部的控制流关系,将L2中基本块B的前驱的后继变为副本基本块B′;

4.3更新基本块表和逻辑块表:为复制得到的副本基本块分配不同的编号,将副本基本块的编号和入口指令地址、出口指令地址存入基本块表;更新L2在逻辑块表中的局部路径链信息;

4.4判断是否所有的逻辑块都不存在公共基本块,如果是则第四步结束,否则转到第

4.1步;

第五步,根据配置要求均匀切割逻辑块,构建基本逻辑块表:

5.1基于逻辑块表和基本块表,统计每个逻辑块包含的指令数量N;

5.2对每个逻辑块,如果其长度N大于长度上限n,则将其平均分割为 个基本逻辑块;如果其长度N小于等于n,该逻辑块也为一个基本逻辑块;基本逻辑块为长度原本小于n的逻辑块和将逻辑块根据n进行平均分割得到的块,所有基本逻辑块的长度都小于或等于n;n为所有的基本逻辑块大小的上限,取值范围是1≤n≤Nmax,Nmax是最大的逻辑块的长度; 表示上取整运算;

5.3为分割得到的每个基本逻辑块分配不同的编号,并将基本逻辑块编号和入口指令地址、出口指令地址存入基本逻辑块表;

第六步,基于基本逻辑块表,重构程序控制流图。

2.如权利要求1所述的基于重构控制流图的控制流错误检测优化方法,其特征在于n取5。

说明书 :

一种基于重构控制流图的控制流错误检测优化方法

技术领域

[0001] 本发明涉及一种控制流错误检测的优化方法,尤其是在空间辐射环境下对由于单粒子效应引起的程序控制流错误进行检测的优化方法。

背景技术

[0002] 空间探测活动投入大、风险高,对可靠性有着极高的要求。太空中影响空间探测器安全的主要因素是宇宙射线的辐射,因为这些宇宙射线中的高能带电粒子流会使电子器件出现硬件故障。空间辐射环境对电子器件的影响主要表现为单粒子效应。
[0003] 普通计算机所使用的芯片一般是商用微处理 器COTS(Commercial Off-the-Shelf),在空间环境中,为了防止空间辐射的影响,一般使用经过特殊工艺设计与加工的微处理器芯片,即抗辐照器件。抗辐照器件主要通过硬件冗余实现容错,具有很高的可靠性。但是由于其设计非常复杂,研制周期很长,产业规模和产量都很小,价格非常昂贵。由于硬件的冗余,抗辐照器件的芯片面积通常成倍增加,这不仅使芯片成品率下降,也带来了功耗的迅速增长。而且按照这种方式生产出来的抗辐照器件的性能通常落后于同时代的COTS很多代。COTS由于产量很大且使用广泛、经过充分的市场竞争,所以一般性能很高,价格相对较低,且任何国家都无法对其进行封锁和禁运。其缺点是对空间环境比较敏感,容易产生单粒子效应。
[0004] 计算机发展的历史表明,很多原本用硬件实现的技术同样可以用软件来实现,在COTS上进行面向硬件故障的软件容错可以弥补COTS在容错能力方面的不足。国内外已开展很多实验探讨在空间环境中能否使用以及如何使用COTS。实验结果表明:在COTS上面向硬件故障的软件容错方法所实现的性能,可以比基于抗辐照器件的空间计算机高一个数量级;面向硬件故障的软件容错方法可以有效提高基于COTS的空间计算机的可靠性,能够很好地应对空间辐射的影响,同时还能够使成本降低。
[0005] 通过与采用抗辐照器件的硬件容错方法比较可以发现,基于COTS的软件容错方法除可靠性方面比硬件容错方法略低之外,在性能、成本、功耗和灵活性方面都拥有巨大的优势。软件容错方法包括故障检测、定位、恢复等过程,其中,故障检测是故障定位及恢复的基础。空间辐射环境中的单粒子效应可能导致星载计算机上的寄存器、存储器、缓存等存储部位出现故障,也可能导致总线、算术逻辑运算单元、指令译码器等功能部件出现故障。这些故障可能致使计算机中的指令序列出现执行顺序错误或者数据错误,前者又称控制流错误。针对数据错误和控制流错误,现有的软件容错方法一般采用不同的故障检测策略分别对其检测。现有的针对控制流错误的软件检测方法大多是采用标签分析的方法,这类方法的基本步骤是:
[0006] 第一步,为程序构造控制流图。构造控制流图前需要先将程序划分为基本块,基本块是程序中能够顺序执行的指令序列的最大集合,这组指令只有一个入口和一个出口,入口就是第一条指令,出口就是最后一条指令,基本块中除了最后一条指令可能是跳转指令外,其它指令都不能是跳转指令。控制流图是以基本块为结点,以基本块之间存在的跳转关系为边的有向图。划分出基本块后即可根据基本块间固有的控制流关系直接得出控制流图,因此划分基本块是构造控制流图的关键。这一步的具体步骤是:
[0007] 1.1将程序划分为基本块,构建基本块表。基本块表存放每个基本块的信息,包括基本块编号、入口指令地址和出口指令地址。具体过程为:
[0008] 1.1.1确定各个基本块的入口指令,它们是:
[0009] l 程序的第一条指令;或者
[0010] l 条件转移指令或无条件转移指令跳转到的指令;或者
[0011] l 紧跟在条件转移指令或函数调用后面的指令;或者
[0012] l 被调用函数的第一条指令。
[0013] 1.1.2 对每个入口指令,确定其对应的出口指令,它们是:
[0014] l 入口指令后除当前入口指令外的第一个入口指令前的指令;或者[0015] l 入口指令后的第一个转移指令或函数调用指令;或者
[0016] l 程序的结束指令。
[0017] 1.1.3 分别将每个入口指令和其对应的出口指令之间的程序块划分为一个基本块。为每个基本块分配一个基本块编号,并将基本块编号和入口指令地址、出口指令地址存入基本块表。
[0018] 1.2 基于基本块表,构造程序控制流图。定义函数调用所在的基本块为函数调用块,定义紧接在函数调用块后面的基本块为返回块,定义被调用函数的第一个基本块为入口块,定义被调用函数的结束基本块为出口块。控制流图的构造方法是:分析基本块表中每个基本块的出口指令,如果是转移指令,则存在当前基本块到转移目标所在的基本块之间的控制流关系;如果是函数调用指令,则存在函数调用块到对应入口块的控制流关系;如果不是转移指令或函数调用指令,则存在当前基本块到下一条指令所在的基本块之间的控制流关系。将基本块作为结点,如果一个结点Bi到另一个结点Bj有控制流关系,则产生Bi到Bj的一条有向边,用这种方法构造出控制流图。Bi定义为Bj的前驱基本块,Bj定义为Bi的后继基本块。
[0019] 第二步,基于控制流图,实现控制流错误检测算法。具体方法是为每个基本块分配不同的静态标签并在其中插装检测指令。程序运行时这些插装的检测指令根据当前控制流为每个基本块计算出一个动态标签,并比较动态标签和静态标签是否一致来确定控制流是否出错。控制流正常时,每个基本块的静态标签应该和动态标签相等,否则说明控制流出现错误。采用标签分析方法的不同控制流错误检测算法在执行第一步时的操作完全相同,其不同之处主要体现为本步中静态标签的设计和在基本块中插装的检测指令不同。另外,同一种算法在所有基本块内插装检测指令的方式是相同的(插装的指令相同,指令条数相同,插装指令在基本块内的相对位置也相同)。
[0020] 基于标签分析的控制流错误检测方法在程序内部插装少量的指令,可以检测出绝大部分的控制流错误。但是这类方法在第一步中构造出的控制流图所包含的基本块大小一般存在明显的差异,导致第二步在所有基本块内插装相同的检测指令后,算法的保护效率下降(算法的保护效率和可靠性成正比,和时间开销成反比),原因是:对于较小的基本块,如只包含1条跳转指令的基本块,发生控制流错误的概率很小,但是却需要在基本块内插装多条指令实现控制流错误检测,检错的时空开销很大;对于部分较大的基本块,发生各种控制流错误的概率很大,插装同样数量的检测指令却难以保证错误检测率,尤其是现有的绝大多数控制流错误检测方法不能检测基本块内指令执行顺序的错误,这些算法受这种问题的影响更为明显。鉴于标签分析方法存在的上述问题,需要在其第一步的基础上重构控制流图,使得基于重构的控制流图实现的控制流检错算法能够获得算法时空开销、可靠性的平衡和保护效率的提高。重构控制流图的方法是调整基本块的划分方法,然后基于调整后的基本块和基本块之间的控制流关系重新构造程序的控制流图。
[0021] 目前通过重构控制流图方法平衡性能和可靠性的算法并不多,由于基本块间的控制流关系是由程序的固有属性决定的,一旦基本块的划分完成,基本块间的控制流关系也就可以确定,所以不同的重构控制流图方法的区别主要表现为基本块的划分方法不同。2007年9月《航天返回与遥感》第28卷第3期发表的作者为康晓军、王劲强、王芸的论文“基于扩展块的星载软件控制流容错评价方法”提出了一种基于扩展块重构控制流图,实现控制流错误检测优化的方法,其基本步骤是:
[0022] 第一步,为程序构造控制流图。具体方法同标签分析方法第一步。
[0023] 第二步,重构控制流图。具体过程是先将部分基本块合并成单入口、单出口的扩展块,然后采用标签分析方法第1.2步的方法重构出基于扩展块的控制流图。
[0024] 第三步,基于重构的控制流图,实现现有的控制流错误检测算法。具体方法是为每个扩展块分配不同的静态标签并在其中插装检测指令。
[0025] 2007年《计算机工程与应用》第43卷第25期发表的作者为吴艳霞、顾国昌、王克惠的论文“一种基于控制流检测的低功耗基本块划分方法”则提出了一种基于超块重构控制流图,实现控制流错误检测优化的方法,其基本步骤是:
[0026] 第一步,为程序构造控制流图。具体方法同标签分析方法第一步。
[0027] 第二步,重构控制流图。具体过程是先将部分基本块合并成单入口、多出口的超块,然后采用标签分析方法第1.2步的方法重构出基于超块的控制流图。
[0028] 第三步,基于重构的控制流图,实现现有的控制流错误检测算法。具体方法是为每个超块分配不同的静态标签并在其中插装检测指令。
[0029] 因为基于重构控制流图进行控制流错误检测优化时,并不需要修改原算法的设计,所以,对同一种算法,这两种方法第三步所做的操作均和标签分析方法第二步相同。这两种基于重构控制流图的优化方法在第二步合并部分基本块,进而减少第三步需要插装检测指令的块的数量,实际上是以牺牲部分基本块的保护为代价提高性能,而且在重构后的控制流图中,合并得到的扩展块或超块大小差异更为明显,算法的保护效率并没有提高。尽管这两种方法都具有可配置性,但是只能通过调整被合并的基本块的数量优化性能,而不能通过配置提高算法可靠性。后一种方法假设第三步实现的算法只在基本块头部插装检测指令,即这种方法只能和只在基本块头部插装检测指令的控制流错误检测算法结合,而目前大多数的控制流错误检测算法都是在基本块头部和尾部分别插装不同的检测指令,所以这种方法在应用范围方面也有很大的限制。
[0030] 由于星载系统计算资源的宝贵和上述方法存在的保护效率不高、可应用的范围较小、不能通过配置提高可靠性等不足,研究新的重构控制流图方法,克服已有方法存在的不足,进一步提高控制流检错算法的效率具有重要的意义。

发明内容

[0031] 本发明要解决的技术问题是,克服已有方法存在的检错效率不高等问题,提供一种新的基于重构控制流图的控制流错误检测优化方法,能够灵活配置基本块的划分,使得现有的控制流检错算法能够基于重构的控制流图直接应用,并有效提高检错算法的效率。
[0032] 本发明的技术方案是:将程序的汇编源程序(以下简称为源程序)划分为基本块,构建基本块表,并基于基本块表构建程序控制流图,然后基于控制流图,划分逻辑块,构建逻辑块表,接着复制基本块,使得逻辑块相互独立,再根据配置要求均匀切割逻辑块,构建基本逻辑块表,最后基于基本逻辑块表,重构程序控制流图。基于重构的控制流图即可实现现有的控制流错误检测算法。
[0033] 具体技术方案为:
[0034] 第一步,将源程序划分为基本块,构建基本块表。具体方法同背景技术所述标签分析方法第1.1步。
[0035] 第二步,基于基本块表,构建程序控制流图。具体方法同背景技术所述标签分析方法第1.2步。
[0036] 第三步,基于控制流图,划分逻辑块,构建逻辑块表。定义控制流图中有多于一个后继的基本块为多扇出块。定义多扇出块、程序结束块、函数调用块的前驱、函数调用块或出口块为分界块。则逻辑块是一个确定先后执行的基本块序列,逻辑块的最后一个基本块是分界块,第一个基本块在控制流图中的前驱至少有一个是分界块。划分逻辑块的步骤如下:
[0037] 3.1 构造并初始化局部路径链和标志位:分别为每个基本块构造一个局部路径链,局部路径链是多个基本块组成的链表,链表中每个结点存放一个基本块编号,链表的第一个结点定义为链头,链表的最后一个结点定义为链尾。设为基本块Bm构造的局部路径链为Lm,Lm的链头存放Bm的编号。针对每个局部路径链分别创建一个对应的标志位,初始值置为真,标志位不存放在局部路径链结点中,而是作为一个独立数据单独存储。
[0038] 3.2 基于控制流图更新局部路径链:针对每个对应标志位为真的局部路径链,若该链表的链尾对应的基本块Bend是分界块,则将该链表对应的标志位置为假;若Bend不是分界块,则查找控制流图中Bend的后继基本块,并将后继基本块的编号作为一个新结点插入到链表尾部。
[0039] 3.3 判断是否所有局部路径链对应的标志位都为假,如果是则执行第3.4步,否则转到第3.2步。
[0040] 3.4 删除符合条件的局部路径链:选择满足如下删除条件的链表Lshort和Llong,然后删除Lshort:
[0041] l Lshort是Llong中的一段;且
[0042] l Lshort的链头对应的基本块在控制流图中的任何前驱基本块都不是分界块。
[0043] 3.5 判断是否还存在符合第3.4步删除条件的局部路径链,如果是则执行第3.4步,否则转到第3.6步。
[0044] 3.6 基于局部路径链构建逻辑块表:为每个局部路径链分配编号,将每个局部路径链和对应的编号作为一条记录存入逻辑块表。此时,每一个局部路径链里的所有基本块即构成一个逻辑块,每个局部路径链的编号即为对应逻辑块的编号。
[0045] 第四步,复制基本块,使得逻辑块相互独立。本步骤的具体过程是:
[0046] 4.1 复制公共基本块:从逻辑块表中选择含有公共基本块的两个逻辑块L1和L2,然后选择距离L1的链头最近的公共基本块B,并在源程序中复制B得到副本基本块B??。
[0047] 4.2 修改控制流关系:保持逻辑块L1不变,修改L2内部的控制流关系,将L2中基本块B的前驱的后继变为副本基本块B??,这样基本块B就不再是公共基本块。
[0048] 4.3更新基本块表和逻辑块表:为复制得到的副本基本块分配不同的编号,将副本基本块的编号和入口指令地址、出口指令地址存入基本块表;更新L2在逻辑块表中的局部路径链信息。
[0049] 4.4 判断是否所有的逻辑块都不存在公共基本块,如果是则第四步结束,否则转到第4.1步。
[0050] 第五步,根据配置要求均匀切割逻辑块,构建基本逻辑块表。定义长度原本小于n的逻辑块和将逻辑块根据n进行平均分割得到的块为基本逻辑块,所有基本逻辑块的长度都小于或等于n。基本逻辑块表存放每个基本逻辑块的信息,包括基本逻辑块编号、入口指令地址和出口指令地址。n为所有的基本逻辑块大小的上限,n的默认值是5,取值范围是1≤n≤Nmax,Nmax是第三步得到的最大的逻辑块的长度。当n的值较大时,由逻辑块切割得到的基本逻辑块的总数就会较少,由于控制流检错算法在每个基本逻辑块中插入相同的指令,所以插装指令带来的性能开销就会减小,但是同时算法的检错能力也会下降。当n的值较小时,插装指令带来的性能开销就会增加,但是算法的检错能力则会增强。因此,n由用户根据可靠性和性能的需求配置。本步骤的具体过程是:
[0051] 5.1 基于逻辑块表和基本块表,统计每个逻辑块包含的指令数量N。
[0052] 5.2 对每个逻辑块,如果其长度N大于长度上限n,则将其平均分割为éN/nù(é ù表示上取整运算)个基本逻辑块。如果其长度N小于等于n,该逻辑块也为一个基本逻辑块。
[0053] 5.3 为分割得到的每个基本逻辑块分配不同的编号,并将基本逻辑块编号和入口指令地址、出口指令地址存入基本逻辑块表。
[0054] 第六步,基于基本逻辑块表,重构程序控制流图。具体方法同背景技术所述标签分析方法第1.2步。
[0055] 基于以上六步重构的控制流图,就可以采用背景技术所述标签分析方法第二步的方法实现现有的控制流检错算法。
[0056] 与已有的优化方法相比,采用本发明可以达到以下的技术效果:
[0057] (1)本发明由于第4步复制了逻辑块之间的公共基本块,使得逻辑块和基本逻辑块具有基本块的单入口、单出口和控制流只从块头进入及控制流只从块尾流出的特征,而现有的软件实现的控制流检错算法绝大多数都是基于由基本块构成的控制流图实现的,所以已有的控制流检错算法可以基于由基本逻辑块重构的控制流图直接实现,即本发明可以和现有的控制流检错算法自然结合;
[0058] (2)本发明由于第5.2步将合并得到的逻辑块进行均匀切割,达到了将源程序中较大的基本块进行分割、将较小的基本块合并的效果。前者可以提高控制流检错算法的检错率,后者可以优化算法的性能。因此,基于本发明实现的控制流检错算法的效率明显提高;
[0059] (3)本发明第五步允许用户设置基本逻辑块的大小,当基本逻辑块设置较大时,可增加被合并的较小基本块的数量,减少块的总数,进而减少插入块中的检测指令数量,达到以较少的可靠性损失为代价优化性能的效果;当基本逻辑块设置较小时,可增加被分割的较大基本块的数量,达到以较少的性能消耗为代价提高可靠性的目的。因此,本发明具有简单、灵活而又有效的可配置性。

附图说明

[0060] 图1是本发明的总流程图;
[0061] 图2是本发明的第三步基于控制流图,划分逻辑块,构建逻辑块表流程图;
[0062] 图3是本发明的第四步复制基本块,使得逻辑块相互独立流程图;
[0063] 图4是本发明第4.2步修改控制流关系示意图。

具体实施方式

[0064] 图1是本发明的总流程图,主要包括以下六个步骤:
[0065] 1. 将源程序划分为基本块,构建基本块表。
[0066] 2. 基于基本块表,构建程序控制流图。
[0067] 3. 基于控制流图,划分逻辑块,构建逻辑块表。
[0068] 4. 复制基本块,使得逻辑块相互独立。
[0069] 5. 根据配置要求均匀切割逻辑块,构建基本逻辑块表。
[0070] 6. 基于基本逻辑块表,重构程序控制流图。
[0071] 基于重构的控制流图,就可以实现现有的控制流检错算法。
[0072] 图2是本发明的第三步基于控制流图,划分逻辑块,构建逻辑块表流程图,包括以下步骤:
[0073] 1.构造并初始化局部路径链和标志位:分别为每个基本块Bm构造一个局部路径链Lm,Lm初始有一个结点即链头,链头存放Bm的编号。针对每个局部路径链分别创建一个对应的标志位,初始值置为真,标志位不存放在局部路径链结点中,而是作为一个独立数据单独存储。
[0074] 2.基于控制流图更新局部路径链:针对每个对应标志位为真的局部路径链,若该链表的链尾对应的基本块Bend是分界块,则将该链表对应的标志位置为假;若Bend不是分界块,则查找控制流图中Bend的后继基本块,并将后继基本块的编号作为一个新结点插入到链表尾部。
[0075] 3.判断是否所有局部路径链对应的标志位都为假,如果是则执行第4步,否则转到第2步。
[0076] 4.删除符合条件的局部路径链:选择满足删除条件的链表Lshort和Llong,然后删除Lshort。
[0077] 5.判断是否还存在符合第4步删除条件的局部路径链,如果是则执行第4步,否则转到第6步。
[0078] 6.基于局部路径链构建逻辑块表:为每个局部路径链分配编号,将每个局部路径链和对应的编号作为一条记录存入逻辑块表。
[0079] 图3是本发明的第四步复制基本块,使得逻辑块相互独立流程图,包括以下步骤: [0080] 1.复制公共基本块:从逻辑块表中选择含有公共基本块的两个逻辑块L1和L2,然后选择距离L1的链头最近的公共基本块B,并在源程序中复制B得到副本基本块B??。
[0081] 2.修改控制流关系:保持逻辑块L1不变,修改L2内部的控制流关系,使得L2中基本块B的前驱的后继变为副本基本块B??。
[0082] 3.更新基本块表和逻辑块表:为复制得到的副本基本块分配不同的编号,将副本基本块的编号和入口指令地址、出口指令地址存入基本块表;更新第2步中被修改内部控制流关系的逻辑块L2在逻辑块表中的局部路径链信息。
[0083] 4.判断是否所有的逻辑块都不存在公共基本块,如果是则第四步结束,否则转到第1步。
[0084] 图4是本发明第4.2步修改控制流关系示意图。图中实线椭圆表示基本块,虚线椭圆表示逻辑块,带箭头实线表示基本块间的控制流关系。左图中两个逻辑块L1和L2有一个公共基本块B。通过保持逻辑块L1不变,修改L2内部的控制流关系,将L2中基本块B的前驱的后继变为副本基本块B??,得到右图所示结果,右图中基本块B已不再是公共基本块。