控制依赖与切片的新基础
1. CFG的唯一结束节点限制
大多数已知的控制依赖定义都要求控制流图(CFG)满足唯一结束节点的要求,但许多软件系统无法满足这一特性。现有工作要么直接要求CFG具有此属性,要么建议对CFG进行扩充以实现这一属性,具体步骤如下:
1. 向CFG中插入一个新节点e。
2. 从每个出口节点(除e外)添加一条边到e。
3. 在每个非终止循环中选择一个任意节点n,并添加一条从n到e的边。
然而,这种扩充会在多个方面使被分析的系统变得复杂:
- 非破坏性扩充:会生成一个新的CFG,消耗时间和内存。
- 破坏性扩充:可能与CFG其他使用者的要求冲突,需要在后续分析前撤销扩充;若不撤销,图算法和分析算法需要能够处理嵌入在扩充CFG中的实际CFG。
许多系统的主线程控制循环没有出口,例如Xt库中的应用程序会进入一个无限循环来管理事件分发,PalmOS中的应用程序可能会忽略停止代码而不终止,除非被显式杀死。在这种情况下,为了扩充CFG而选择循环中的一个节点作为出口节点可能会干扰控制依赖的计算。
2. 新的依赖定义
为了解决上述问题,我们考虑不强制要求唯一结束节点的控制依赖的替代定义。
2.1 非终止敏感的控制依赖(ni ntscd → nj)
在CFG中,如果节点ni至少有两个后继节点nk和nl,并且满足以下两个条件,则节点nj(直接)非终止敏感地控制依赖于节点ni:
1. 对于从nk出发的所有最大路径,nj总是出现,并且要么nj = ni,要么nj在ni的任何出现之前出现。
2. 存在一条从nl出发的最大路径,在该路径上nj不出现,
控制依赖与切片的新基础及应用
超级会员免费看
订阅专栏 解锁全文

958

被折叠的 条评论
为什么被折叠?



