基本信息 书名: | 源代码分析 |
作者: | 宫云战,邢颖,肖庆 |
出版社: | 中国科技出版传媒股份有限公司 |
出版日期: | 2017-11-01 |
版次: | 1版4次 |
ISBN: | 9787030551887 |
市场价: | 115.0 |
目录 目录
前言
第1章 源代码分析概要 1
1.1 基本概念 1
1.1.1 源代码 1
1.1.2 源代码分析 1
1.1.3 分析过程 2
1.1.4 源代码建模 2
1.2 语法与语义分析 4
1.2.1 语法分析 4
1.2.2 抽象语法树 4
1.2.3 符号表 5
1.2.4 语义分析 7
1.3 控制流分析 8
1.3.1 控制流图 9
1.3.2 支配图 11
1.3.3 依赖图 12
1.4 数据流分析 13
1.5 源代码分析常用方法 15
1.6 常用源代码分析技术 17
1.6.1 程序的抽象 17
1.6.2 区间运算 18
1.6.3 程序切片计算 19
1.6.4 路径计算 20
1.6.5 约束求解 21
参考文献 22
第2章 抽象解释 24
2.1 引言 24
2.2 基本概念 26
2.2.1 格与不动点理论 26
2.2.2 伽罗瓦连接 34
2.2.3 Widening/Narrowing算子 38
2.3 程序分析与抽象解释 40
2.3.1 程序分析的不可判定 40
2.3.2 程序语义及其不动点形 41
2.3.3 抽象解释中的语义层次体系 43
2.4 抽象解释应用实例 45
参考文献 48
第3章 符号计算 50
3.1 简介 50
3.2 符号执行技术的基本原理 50
3.3 符号执行技术的形式化表达 52
3.4 符号执行实现方法 55
3.4.1 静态符号执行 55
3.4.2 动态符号执行 56
3.4.3 符号执行技结 57
3.5 符号执行工具简介 58
3.5.1 SPF 58
3.5.2 KLEE 59
3.5.3 SAGE 59
3.5.4 PEX 60
参考文献 60
第4章 区间运算技术 63
4.1 经典的区间代数 63
4.1.1 区间及区间运算 63
4.1.2 区间向量和区间函数 64
4.2 扩展的区间运算 64
4.2.1 数值型区间集代数 64
4.2.2 非数值型区间代数 67
4.2.3 条件表达式中的区间计算 68
4.2.4 基于区间运算的变量值范围分析 74
4.3 变量的相关分析 80
4.3.1 变量间关联关系的分类 80
4.3.2 符号分析 82
4.4 区间运算在程序分析中的应用 90
4.4.1 检测矛盾节点 90
4.4.2 检测不可达路径 93
4.4.3 提高缺陷检测效率 93
参考文献 95
第5章 路径敏感分析 97
5.1 概述 97
5.2 路径不敏感分析方法 97
5.2.1 数据流分析 97
5.2.2 四种典型数据流问题 99
5.2.3 数据流分析的理论依据 109
5.2.4 数据流解的含义 109
5.3 路径敏感分析方法 113
5.3.1 缺陷模式状态机 113
5.3.2 不可达路径引入误报 116
5.3.3 路径信息抽象 117
5.3.4 检测算法 118
参考文献 120
第6章 抽象内存建模 122
6.1 传统的程序分析模型 122
6.1.1 二元模型 122
6.1.2 数组模型 123
6.2 抽象内存模型 124
6.2.1 模型定义 125
6.2.2 模型的基本操作 128
6.3 语义模拟算法 129
6.3.1 通用操作符 130
6.3.2 指针 130
6.3.3 数组 137
6.3.4 结构体 138
6.3.5 字符串 138
6.4 基于抽象内存模型的测例生成 142
参考文献 144
第7章 上下文分析 146
7.1 问题分析 146
7.1.1 函数调用后影响上下文 146
7.1.2 函数调用前约束上下文 148
7.1.3 函数特征影响上下文 149
7.2 函数影响 150
7.2.1 函数影响描述 150
7.2.2 函数影响生成 150
7.2.3 函数影响应用 152
7.2.4 函数影响实验 153
7.3 函数约束 154
7.3.1 函数约束描述 154
7.3.2 函数约束生成 157
7.3.3 函数约束应用 162
7.3.4 函数约束实验 163
7.4 函数特征 164
7.4.1 函数特征描述 164
7.4.2 函数特征生成 165
7.4.3 函数特征实验 166
参考文献 168
第8章 程序切片 169
8.1 基本概念 169
8.1.1 程序切片的定义 169
8.1.2 程序切片标准 171
8.2 常见程序切片种类 171
8.2.1 静态切片 172
8.2.2 动态切片 173
8.2.3 后向切片 174
8.2.4 前向切片 174
8.2.5 准静态切片 175
8.2.6 同步切片 176
8.2.7 条件切片 177
8.2.8 无定型切片 178
8.2.9 混合切片 179
8.2.10 程序片 179
8.3 程序切片计算方法 180
8.3.1 过程内切片计算方法 180
8.3.2 过程间切片计算方法 183
8.3.3 面向对象的程序切片计算方法 185
8.4 程序切片的应用 187
8.4.1 软件质量保证 187
8.4.2 软件维护 187
8.4.3 软件度量 188
参考文献 188
第9章 路径计算 192
9.1 路径生成 192
9.1.1 含循环结构的路径生成 192
9.1.2 循环结构路径生成 194
9.2 路径可达计算 199
9.2.1 基于矛盾片段模式的路径可达计算 199
9.2.2 基于优化区间运算的路径可达计算 200
9.2.3 基于等式系数矩阵的路径可达计算 208
9.2.4 基于仿射运算的路径可达计算 210
参考文献 210
第10章 约束求解 212
10.1 求解布尔约束满足问题 212
10.1.1 布尔约束满足问题 212
10.1.2 基础知识 213
10.1.3 算法 214
10.1.4 典型的SAT求解器和SMT求解器 216
10.2 求解有限约束满足问题 219
10.2.1 有限约束满足问题 219
10.2.2 回溯法 220
10.2.3 不完备算法-局部搜索法 221
10.3 求解混合约束满足问题 225
10.3.1 混合布尔约束满足问题 225
10.3.2 数值约束求解算法 225
10.4 基于约束求解的测例自动生成 228
10.4.1 常见的测例生成方法 228
10.4.2 基于抽象内存模型的分支限界法 237
参考文献 241
第11章 源代码分析应用 244
11.1 缺陷检测系统DTS 244
11.1.1 产能 244
11.1.2 产品 245
11.1.3 缺陷模式 246
11.1.4 技术架构 247
11.1.5 技术指标 248
11.1.6 使用步骤 248
11.2 代码测试系统CTS 255
11.2.1 系能 255
11.2.2 操作步骤 257
11.3 其他代码分析工具 261
11.3.1 Emma 262
11.3.2 C++test 268
11.3.3 Teed 272
内容介绍 目前,源代码分析是软件工程方法之一,有着强烈的工程需求和实用价值,已成为靠前学术界和工业界的一个热点。《源代码分析》从源代码分析的基本概念开始,将其中所涉及的重要的技术和应用——抽象解释、符号计算、区间运算、路径敏感分析、抽象内存建模、上下文分析、程序切片、路径计算和约束求解等,结合大量的实例进行由浅入深的介绍和讲解;同时,在《源代码分析》的很后专门介绍应用源代码分析技术所研发的一些常用测试工具,并介绍两款静态分析工具——DTS、CTS。本书是软件工程领域的专业书籍,可供从事软件工程领域相关工作的研究人员学习和参考。
在线试读 程序实际运行时的动态存储构造。
;;数组对象的分析十分复杂,尤其是在c/c++语言中存在着大量的别名关系、变量类型之间的层次关系等关联关系,如果不能有效、完整地表示这些复杂关系,那么分析的精度将会下降。针对数组的内存建模,其难点主要表现在数组的抽象内存表示、数组元素计算、数组与指针的结合、数组与字符串数组的结合等方面。
;;字符串是通用编程语言中的一种基本数据类型,是一种特殊的字符数组,应用相当普遍。指针的使用使得针对字符串的内存建模更加困难。操作字符串变量的程序经常使用一组库函数,如字符串比较函数、字符串查找函数和字符串函数等。目前,常用的字符串法有数组模型方法和约束求解方法。
;;(1)数组模型方法是使用数组模型对库函数进行模拟操作,把字符串中的每一个字符元素当做取值范围为O~255的整型变量来处理,并且用一组由赋值语句组成的逻辑公式来模拟字符串函数的操作。
;;;;(2)约束求解法是构建字符串变量约束条件,用一组约束条件来刻画字符串变量的属。给定一个字符串变量的一组约束条件,会输出满足所有约束条件的字符串,或者报告该约束条件是不可满足的。
;;2.函数摘要建模
;;函数间分析主要关注函数调用引起的上下文变化,其分析结果可以提高调用函数(caller)内的分析精度。函数调用对调用上下文的影响可以归纳为如下三种:
;;;;(1)函数调用对调用上下文的数据流更新情况的影响括传引用式形参及全局变量的数据流更新。
;;;;(z)函数返回值、函数调用引起的其他数据流及控制流的变化。
;;;;(3)调用点处必须满足的数据约束条件。
;;;;因此,可以根据上述函数调用的影响和实际分析需求对函数摘要进行建模。
;;;;3.循环语句处理建模
;;;;在源代码分析过程中,循环语句分析往往难以确定循环具体的执行次数,如果循环每迭代一次都当做一条新的路径,那么将会引起路径爆炸问题。因此,结合分析给出一个有效的循环语句处理模型是源代码分析的必然选择。传统的O一1模型和O-K模型并不能满足实际计算的需要,主要原因是这种静态的模型往往和实际不符,而本书提出并采用的动静K+1模型是一个可行的方法......
;
媒体评论