本书主要介绍程序切片的起源和发展,程序切片技术的图论基础,程序切片的各种变体(如静态切片、动态切片、有条件切片、并发切片、面向对象程序的切片、体系结构切片和规约切片等),计算程序切片的各种方法,以及程序切片技术在软件调试、波动分析、软件测试、度量、重用、程序理解、逆向工程和软件安全等方面的应用,并讨论了程序切片技术的发展趋向。本书适合作为高等院校计算机软件专业学生学习"软件工程"、"软件分析与测试"等课程的参考书或工具书,也适合作为软件分析与测试研究人员的参考书。上篇程序切片技术基本原理第1章 概论1.1 程序切片技术的起源和发展1.1.1 从数据流方程到程序依赖图1.1.2 从可执行的程序切片到不可执行的程序切片1.1.3 静态切片、动态切片和有条件切片1.1.4 后向切片和前向切片1.1.5 从源程序代码切片到软件规约切片1.1.6 从单一切片到多种切片1.2 程序切片技术的应用概述1.2.1 程序调试1.2.2 软件维护1.2.3 同归测试1.2.4 软件度量1.2.5 软件重用1.2.6 软件安全1.3 程序切片工具简介1.3.1 支持C语言的PST1.3.2 支持Ada语言的PST1.3.3 支持Oberon-2语言的PST1.3.4 支持Java语言的PST1.3.5 其他PST小结思考题参考文献第2章 图论基础2.1 控制流图2.1.1 基本模块2.1.2 控制流图定义2.1.3 基本属性2.2 控制流分析2.2.1 控制流2.2.2 控制流的表示方法2.2.3 支配节点和后必经节点2.2.4 循环识别2.3 数据流分析2.3.1 可到达定义2.3.2 数据流方程2.3.3 活性分析2.4 数据依赖和控制依赖2.4.1 控制依赖2.4.2 数据依赖2.5 程序依赖图2.5.1 过程内依赖图2.5.2 过程间依赖图小结思考题参考文献第3章 静态程序切片3.1 引言3.2 Mark weiser程序切片3.2.1 初步理解3.2.2 基本术语3.2.3 Mark weiser的数据流算法3.3 过程内切片3.3.1 构造程序依赖图3.3.2 图可达性算法3.3.3 例子分析3.4 过程间切片3.4.1 构造系统依赖图3.4.2 构造特征子图的算法3.4.3 过程间切片的算法小结思考题参考文献第4章 动态程序切片4.1 引言4.2 基本术语4.2.1 程序依赖图和静态切片4.2.2 执行历史和动态切片准则4.3 Agrawal和Horgan的动态切片4.3.1 动态切片方法14.3.2 动态切片方法24.3.3 动态切片方法34.3.4 动态切片方法44.4 Korel和Laski的动态切片小结思考题参考文献第5章 有条件程序切片5.1 引言5.2 有条件切片5.2.1 准静态切片5.2.2 同时动态切片5.2.3 一般的有条件切片模型5.2.4 有条件切片计算5.3 切片模型关系分析5.4 分割分析小结思考题参考文献第6章 面向对象程序切片6.1 引言6.2 传统系统依赖图的缺陷分析6.3 面向对象系统依赖图6.3.1 OOSDG的基本组成模型6.3.2 OOSDG对SDG的扩充6.3.3 类依赖图6.3.4 虚函数调用图的构造6.3.5 OOSDG的构造算法6.3.6 基于OOSDG的程序切片算法小结思考题参考文献第7章 并发程序切片7.1 引言7.2 Cheng的并发程序切片思想7.3 Krinke多线程程序静态切片方法7.3.1 线程控制流图7.3.2 线程程序依赖图7.3.3 基于tPDG的切片7.4 Nanda和Ramesh的并发程序切片方法7.5 并发程序的动态切片7.5.1 进程图和静态程序依赖图7.5.2 进程图到并发图7.5.3 构建DPDG7.6 面向对象并发程序的切片方法7.6.1 Zhao的早期方法7.6.2 Java并发程序的切片方法小结思考题参考文献第8章 规约切片8.1 形式规约切片8.1.1 静态形式规约切片8.1.2 动态形式规约切片8.1.3 其他形式规约切片8.2 基于规约的程序切片8.2.1 前置和后置条件8.2.2 基于规约的切片8.3 体系结构规约切片8.3.1 体系结构规约8.3.2 体系结构切片定义8.3.3 体系结构信息流图和体系结构切片的计算8.4 动态软件体系结构切片8.5 JVM规约切片小结思考题参考文献第9章 新型切片变体9.1 无定型切片9.1.1 程序投影9.1.2 无定型简单性度量9.1.3 无定型静态切片9.1.4 无定型有条件切片9.1.5 无定型切片的实现以及相关问题9.2 削片9.2.1 静态削片9.2.2 动态削片9.2.3 削片的性质和构造策略9.3 砍片小结思考题参考文献中篇程序切片技术的基本应用第lO章 程序调试10.1 引言10.1.1 什么是程序渊试10.1.2 为什么用切片进行调试10.2 如何用切片辅助程序调试10.2.1 调试中的错误分析及切片选取10.2.2 面向对象程序切片与调试10.3 基于切片的调试工具10.3.1 C-Debug10.3.2 SPYDER小结思考题参考文献第11章 波动分析11.1 引言11.2 程序切片与REA过程11.3 后向切片存在的必要性11.3.1 定义修改11.3.2 使用修改11.3.3 控制修改11.4 程序切片运算11.5 直接波动和诱导波动11.5.1 通用程序切片11.5.2 REA例子小结思考题参考文献第12章 软件测试12.1 引言12.2 基于程序切片的软件测试12.2.1 例子简介12.2.2 依赖图模型12.2.3 基本性质12.3 回归测试12.3.1 受影响的定义一使用关系类型12.3.2 BackwardWalk算法12.3.3 ForwardWalk算法12.3.4 进一步讨论12.3.5 回归测试的一般步骤12.4 基于切片技术的软件测试工具模型小结思考题参考文献第13章 软件维护13.1 引言13.2 软件维护模型13.3 分解切片与软件维护13.3.1 分解切片13.3.2 使用分解切片的几条规则13.4 联合切片与软件维护13.4.1 联合切片13.4.2 利用联合切片维护软件13.5 基于切片的软件维护模型小结思考题参考文献第14章 复杂性度量14.1 引言14.2 早期基于切片的度量14.3 内聚度量14.3.1 数据切片14.3.2 胶水、强力胶水和粘性14.3.3 内聚度量14.3.4 类内切片和类内聚14.4 耦合度量14.4.1 Java源代码中存在的耦合问题分析14.4.2 基于切片的Java耦合度量框架小结思考题参考文献第15章 软件安全15.1 引言15.2 软件安全分析的几种常用方法15.2.1 失效模式效应分析法15.2.2 软件故障树分析法15.2.3 Petri网分析法15.3 临界安全组件与软件故障树分析15.3.1 共同模式失效问题15.3.2 临界安全组件15.4 基于程序切片的共同模式失效分析方法15.4.1 基本原理15.4.2 例子分析小结思考题参考文献第16章 软件重用16.1 引言16.2 转换切片Lj重用16.3 有条件切片与重用16.4 规约驱动切片与重用16.5 软件体系结构切片与重用小结思考题参考文献第17章 应用扩展17.1 程序分析理解17.1.1 Lucia等人的初步思想17.1.2 Korel的大型程序理解手段17.1.3 Kumar的CONCEPT技术17.2 逆向工程和再工程17.2.1 传统切片17.2.2 接口切片17.3 Tip的类型错误定位方法17.3.1 静态语义规约和类型检17.3.2 项重写和依赖追踪17.3.3 切片精确度问题17.4 程序验证17.5 其他应用小结思考题参考文献下篇程序切片技术展望第18章 层次切片模型及其实现18.1 面向对象程序的层次结构模型18.2 层次切片模型18.3 SSA算法的基本思想18.4 HSM和SSA的实现18.4.1 代码信息树18.4.2 依赖图的生成算法和切片算法18.5 Jato:Java程序切片工具18.5.1 依赖图生成层18.5.2 切片生成层18.6 层次切片复杂度小结思考题参考文献第19章 层次切片模型的应用19.1 静态信息流分析19.2 耦合度量19.2.1 方法m1和m2之间的耦合度量19.2.2 类c的耦合度量19.3 内聚度量19.3.1 子功能内聚19.3.2 功能内聚19.4 复杂度度量小结思考题参考文献第20章 结束语20.1 基本原理总结20.2 基本应用总结20.3 未来研究课题20.3.1 程序切片的形式语义20.3.2 无定型程序切片20.3.3 规约切片20.3.4 基于规约程序切片20.3.5 软件体系结构切片20.3.6 程序切片应用参考文献附录附录A 汉英名词对照附录B 缩略语英汉对照