第1章 概论 3
1.1 程序切片技术的起源和发展 3
上篇 程序切片技术基本原理 3
1.1.1 从数据流方程到程序依赖图 4
1.1.2 从可执行的程序切片到不可执行的程序切片 5
1.1.3 静态切片、动态切片和有条件切片 6
1.1.4 后向切片和前向切片 7
1.1.5 从源程序代码切片到软件规约切片 7
1.1.6 从单一切片到多种切片 8
1.2.2 软件维护 9
1.2 程序切片技术的应用概述 9
1.2.1 程序调试 9
1.2.3 回归测试 10
1.2.4 软件度量 11
1.2.5 软件重用 11
1.2.6 软件安全 11
1.3 程序切片工具简介 12
1.3.1 支持C语言的PST 12
1.3.4 支持Java语言的PST 13
1.3.2 支持Ada语言的PST 13
1.3.3 支持Oberon-2语言的PST 13
1.3.5 其他PST 14
小结 14
思考题 14
参考文献 15
第2章 图论基础 17
2.1 控制流图 17
2.1.1 基本模块 17
2.1.2 控制流图定义 18
2.1.3 基本属性 19
2.2 控制流分析 20
2.2.1 控制流 20
2.2.2 控制流的表示方法 20
2.2.3 支配节点和后必经节点 21
2.2.4 循环识别 23
2.3 数据流分析 24
2.3.1 可到达定义 24
2.3.2 数据流方程 26
2.3.3 活性分析 28
2.4 数据依赖和控制依赖 30
2.4.1 控制依赖 30
2.4.2 数据依赖 31
2.5 程序依赖图 31
2.5.1 过程内依赖图 32
2.5.2 过程间依赖图 32
小结 32
参考文献 33
思考题 33
第3章 静态程序切片 35
3.1 引言 35
3.2 Mark Weiser程序切片 35
3.2.1 初步理解 36
3.2.2 基本术语 37
3.2.3 Mark Weiser的数据流算法 42
3.3 过程内切片 43
3.3.1 构造程序依赖图 43
3.3.3 例子分析 44
3.3.2 图可达性算法 44
3.4 过程间切片 46
3.4.1 构造系统依赖图 46
3.4.2 构造特征子图的算法 48
3.4.3 过程间切片的算法 51
小结 54
思考题 54
参考文献 54
4.1 引言 56
第4章 动态程序切片 56
4.2 基本术语 57
4.2.1 程序依赖图和静态切片 57
4.2.2 执行历史和动态切片准则 58
4.3 Agrawal和Horgan的动态切片 59
4.3.1 动态切片方法1 59
4.3.2 动态切片方法2 60
4.3.3 动态切片方法3 62
4.3.4 动态切片方法4 63
小结 65
4.4 Korel和Laski的动态切片 65
思考题 66
参考文献 66
第5章 有条件程序切片 68
5.1 引言 68
5.2 有条件切片 69
5.2.1 准静态切片 69
5.2.2 同时动态切片 70
5.2.3 一般的有条件切片模型 70
5.2.4 有条件切片计算 72
5.3 切片模型关系分析 76
5.4 分割分析 77
小结 78
思考题 78
参考文献 79
第6章 面向对象程序切片 80
6.1 引言 80
6.2 传统系统依赖图的缺陷分析 81
6.3.1 OOSDG的基本组成模型 83
6.3 面向对象系统依赖图 83
6.3.2 OOSDG对SDG的扩充 84
6.3.3 类依赖图 86
6.3.4 虚函数调用图的构造 88
6.3.5 OOSDG的构造算法 95
6.3.6 基于OOSDG的程序切片算法 97
小结 97
思考题 97
参考文献 98
7.1 引言 100
第7章 并发程序切片 100
7.2 Cheng的并发程序切片思想 101
7.3 Krinke多线程程序静态切片方法 102
7.3.1 线程控制流图 102
7.3.2 线程程序依赖图 104
7.3.3 基于tPDG的切片 105
7.4 Nanda和Ramesh的并发程序切片方法 109
7.5 并发程序的动态切片 112
7.5.1 进程图和静态程序依赖图 112
7.5.3 构建DPDG 113
7.5.2 进程图到并发图 113
7.6.1 Zhao的早期方法 114
7.6 面向对象并发程序的切片方法 114
7.6.2 Java并发程序的切片方法 115
小结 116
思考题 117
参考文献 117
8.1 形式规约切片 118
8.1.1 静态形式规约切片 118
第8章 规约切片 118
8.1.2 动态形式规约切片 121
8.1.3 其他形式规约切片 121
8.2 基于规约的程序切片 122
8.2.1 前置和后置条件 122
8.2.2 基于规约的切片 123
8.3 体系结构规约切片 126
8.3.1 体系结构规约 126
8.3.2 体系结构切片定义 128
8.3.3 体系结构信息流图和体系结构切片的计算 129
8.4 动态软件体系结构切片 130
8.5 JVM规约切片 131
小结 132
思考题 132
参考文献 132
第9章 新型切片变体 135
9.1 无定型切片 135
9.1.1 程序投影 135
9.1.2 无定型简单性度量 136
9.1.3 无定型静态切片 137
9.1.4 无定型有条件切片 138
9.1.5 无定型切片的实现以及相关问题 139
9.2 削片 139
9.2.1 静态削片 139
9.2.2 动态削片 140
9.2.3 削片的性质和构造策略 141
9.3 砍片 143
小结 143
参考文献 144
思考题 144
中篇 程序切片技术的基本应用 147
第10章 程序调试 147
10.1 引言 147
10.1.1 什么是程序调试 147
10.1.2 为什么用切片进行调试 148
10.2 如何用切片辅助程序调试 150
10.2.1 调试中的错误分析及切片选取 150
10.3.1 C-Debug 151
10.2.2 面向对象程序切片与调试 151
10.3 基于切片的调试工具 151
10.3.2 SPYDER 152
小结 153
思考题 154
参考文献 154
第11章 波动分析 155
11.1 引言 155
11.3.1 定义修改 157
11.3 后向切片存在的必要性 157
11.2 程序切片与REA过程 157
11.3.2 使用修改 158
11.3.3 控制修改 158
11.4 程序切片运算 159
11.5 直接波动和诱导波动 161
11.5.1 通用程序切片 161
11.5.2 REA例子 162
小结 163
参考文献 164
思考题 164
第12章 软件测试 165
12.1 引言 165
12.2 基于程序切片的软件测试 165
12.2.1 例子简介 166
12.2.2 依赖图模型 167
12.2.3 基本性质 169
12.3 回归测试 170
12.3.1 受影响的定义-使用关系类型 171
12.3.2 BackwardWalk算法 172
12.3.3 ForwardWalk算法 173
12.3.4 进一步讨论 176
12.3.5 回归测试的一般步骤 181
12.4 基于切片技术的软件测试工具模型 182
小结 184
思考题 184
参考文献 184
第13章 软件维护 186
13.1 引言 186
13.3 分解切片与软件维护 187
13.2 软件维护模型 187
13.3.1 分解切片 188
13.3.2 使用分解切片的几条规则 189
13.4 联合切片与软件维护 191
13.4.1 联合切片 191
13.4.2 利用联合切片维护软件 192
13.5 基于切片的软件维护模型 193
小结 193
思考题 193
参考文献 194
第14章 复杂性度量 195
14.1 引言 195
14.2 早期基于切片的度量 197
14.3 内聚度量 198
14.3.1 数据切片 198
14.3.2 胶水、强力胶水和粘性 200
14.3.3 内聚度量 200
14.3.4 类内切片和类内聚 202
14.4 耦合度量 205
14.4.1 Java源代码中存在的耦合问题分析 206
14.4.2 基于切片的Java耦合度量框架 210
小结 214
思考题 214
参考文献 214
第15章 软件安全 215
15.1 引言 215
15.2 软件安全分析的几种常用方法 216
15.2.1 失效模式效应分析法 216
15.2.3 Petri网分析法 217
15.2.2 软件故障树分析法 217
15.3.1 共同模式失效问题 219
15.3.2 临界安全组件 219
15.3 临界安全组件与软件故障树分析 219
15.4 基于程序切片的共同模式失效分析方法 220
15.4.1 基本原理 221
15.4.2 例子分析 222
小结 225
思考题 225
参考文献 225
第16章 软件重用 227
16.1 引言 227
16.2 转换切片与重用 228
16.3 有条件切片与重用 228
16.4 规约驱动切片与重用 230
16.5 软件体系结构切片与重用 233
思考题 234
参考文献 234
小结 234
第17章 应用扩展 235
17.1 程序分析理解 235
17.1.1 Lucia等人的初步思想 236
17.1.2 Korel的大型程序理解手段 237
17.1.3 Kumar的CONCEPT技术 238
17.2 逆向工程和再工程 239
17.2.1 传统切片 239
17.2.2 接口切片 240
17.3.1 静态语义规约和类型检查 241
17.3 Tip的类型错误定位方法 241
17.3.2 项重写和依赖追踪 242
17.3.3 切片精确度问题 243
17.4 程序验证 244
17.5 其他应用 245
小结 245
思考题 246
参考文献 246
第18章 层次切片模型及其实现 251
18.1 面向对象程序的层次结构模型 251
下篇 程序切片技术展望 251
18.2 层次切片模型 252
18.3 SSA算法的基本思想 253
18.4 HSM和SSA的实现 254
18.4.1 代码信息树 256
18.4.2 依赖图的生成算法和切片算法 262
18.5 Jato——Java程序切片工具 273
18.5.1 依赖图生成层 274
18.5.2 切片生成层 275
18.6 层次切片复杂度 277
小结 278
思考题 278
参考文献 278
第19章 层次切片模型的应用 280
19.1 静态信息流分析 280
19.2 耦合度量 282
19.2.1 方法m1和m2之间的耦合度量 283
19.2.2 类c的耦合度量 283
19.3.2 功能内聚 284
19.3.1 子功能内聚 284
19.3 内聚度量 284
19.4 复杂度度量 285
小结 286
思考题 286
参考文献 286
第20章 结束语 288
20.1 基本原理总结 288
20.2 基本应用总结 288
20.3.2 无定型程序切片 289
20.3.1 程序切片的形式语义 289
20.3 未来研究课题 289
20.3.3 规约切片 290
20.3.4 基于规约程序切片 290
20.3.5 软件体系结构切片 290
20.3.6 程序切片应用 290
参考文献 291
附录 293
附录A 汉英名词对照 293
附录B 缩略语英汉对照 296