程序分析技術(shù)是編譯器、軟件開發(fā)以及軟件質(zhì)量保障的基礎(chǔ)。本書共6章,主要內(nèi)容包括程序分析基礎(chǔ)、程序的中間表示、數(shù)據(jù)流分析、程序切片與程序插樁、軟件缺陷檢測、智能化程序分析技術(shù)等,涵蓋了程序分析基礎(chǔ)理論和技術(shù),還貫穿若干案例,講解工業(yè)界的程序分析實(shí)踐。
更多科學(xué)出版社服務(wù),請(qǐng)掃碼獲取。
作為技術(shù)負(fù)責(zé)人,參加并完成國家自然科學(xué)基金、國防基礎(chǔ)科研、航天支撐基金等科研項(xiàng)目多項(xiàng)。
目錄
前言
1 程序分析基礎(chǔ) 1
1.1 程序分析概述 1
1.1.1 什么是程序分析? 1
1.1.2 為何需要程序分析技術(shù)? 1
1.1.3 程序分析技術(shù)的分類 2
1.2 靜態(tài)程序分析 3
1.2.1 靜態(tài)程序分析的程序?qū)傩?3
1.2.2 靜態(tài)程序分析的一般流程和方法 5
1.3 動(dòng)態(tài)程序分析 8
1.3.1 動(dòng)態(tài)程序分析的程序?qū)傩?8
1.3.2 動(dòng)態(tài)程序分析的一般流程和方法 9
1.4 靜態(tài)和動(dòng)態(tài)程序分析的特性對(duì)比 11
1.4.1 程序不變量的含義 12
1.4.2 程序不變量實(shí)例分析 12
1.4.3 基于動(dòng)態(tài)程序分析的可能程序不變量檢測 13
1.4.4 基于靜態(tài)程序分析的程序不變量推導(dǎo) 14
1.4.5 完備分析、完全分析和可終止 17
1.4.6 靜態(tài)和動(dòng)態(tài)程序分析技術(shù)的比較 18
1.5 程序分析技術(shù)的應(yīng)用 20
1.5.1 編譯器優(yōu)化 20
1.5.2 軟件質(zhì)量保障工具 21
1.5.3 集成開發(fā)環(huán)境 23
1.6 小結(jié) 24
2 程序的中間表示 26
2.1 token序列 26
2.2 語法樹 27
2.3 控制流圖 29
2.4 調(diào)用圖 33
2.5 程序依賴圖和系統(tǒng)依賴圖 33
2.5.1 程序依賴圖 33
2.5.2 系統(tǒng)依賴圖 35
2.6 靜態(tài)單賦值 36
2.7 指向圖 37
2.8 靜態(tài)程序分析策略 38
2.8.1 可能分析和必然分析 38
2.8.2 程序分析的范圍 39
2.8.3 敏感程度 39
2.9 程序中間表示生成工具 43
2.9.1 編譯器前端 43
2.9.2 控制流和數(shù)據(jù)流分析工具 46
2.9.3 靜態(tài)二進(jìn)制代碼分析工具 47
2.10 程序的中間表示在克隆代碼檢測中的應(yīng)用 47
2.10.1 克隆代碼的含義和類型 48
2.10.2 克隆代碼的產(chǎn)生原因和危害 48
2.10.3 克隆代碼檢測方法分類 49
2.10.4 典型的克隆代碼檢測方法 51
2.10.5 克隆代碼檢測技術(shù)的應(yīng)用 57
2.11 小結(jié) 57
3 數(shù)據(jù)流分析 59
3.1 數(shù)據(jù)流分析中的抽象 59
3.2 數(shù)據(jù)流分析的單調(diào)框架 61
3.2.1 前向和反向、可能和必然分析 61
3.2.2 迭代法求解數(shù)據(jù)流 62
3.3 經(jīng)典的數(shù)據(jù)流分析 64
3.3.1 到達(dá)定值分析 64
3.3.2 活躍變量分析 71
3.3.3 可用表達(dá)式分析 75
3.3.4 非常繁忙表達(dá)式分析 79
3.4 過程間數(shù)據(jù)流分析 82
3.5 小結(jié) 83
4 程序切片與程序插樁 84
4.1 程序切片的基本概念 84
4.1.1 語句之間相互影響的分析 84
4.1.2 程序切片的定義 86
4.2 程序切片的分類 87
4.2.1 前向切片和反向切片 87
4.2.2 過程內(nèi)切片和過程間切片 88
4.2.3 靜態(tài)切片和動(dòng)態(tài)切片 88
4.3 程序切片算法 90
4.3.1 基于數(shù)據(jù)流等式的程序切片算法 90
4.3.2 基于圖可達(dá)性的過程內(nèi)切片算法 90
4.3.3 基于圖可達(dá)性的過程間切片算法 92
4.3.4 動(dòng)態(tài)反向切片算法 96
4.4 程序插樁的基本概念 99
4.5 程序插樁方法 101
4.5.1 基于抽象語法樹的程序插樁方法 101
4.5.2 基于二進(jìn)制代碼的程序插樁方法 103
4.6 程序切片的應(yīng)用 106
4.7 小結(jié) 109
5 軟件缺陷檢測 110
5.1 軟件缺陷的定義和分類 110
5.1.1 軟件缺陷的定義 110
5.1.2 軟件缺陷的分類 111
5.2 軟件缺陷檢測技術(shù) 115
5.2.1 靜態(tài)缺陷檢測技術(shù) 116
5.2.2 基于模式的缺陷檢測方法 117
5.2.3 動(dòng)態(tài)缺陷檢測技術(shù) 122
5.2.4 基于運(yùn)行時(shí)監(jiān)測的缺陷檢測方法 123
5.2.5 安全開發(fā)生命周期 125
5.3 靜態(tài)缺陷檢測工具 126
5.3.1 基于詞法分析的缺陷檢測工具 127
5.3.2 基于語法分析的缺陷檢測工具 127
5.3.3 基于數(shù)據(jù)流分析的缺陷檢測工具 128
5.3.4 基于靜態(tài)污點(diǎn)分析的缺陷檢測工具 128
5.3.5 基于模型檢查的缺陷檢測工具 129
5.3.6 基于靜態(tài)符號(hào)執(zhí)行的缺陷檢測工具 130
5.3.7 基于抽象解釋的缺陷檢測工具 130
5.3.8 基于定理證明的缺陷檢測工具 131
5.3.9 商業(yè)的基于靜態(tài)程序分析的缺陷檢測工具 131
5.4 動(dòng)態(tài)缺陷檢測工具 133
5.4.1 基于運(yùn)行時(shí)監(jiān)測的缺陷檢測工具 133
5.4.2 基于模糊測試的缺陷檢測工具 134
5.4.3 基于動(dòng)態(tài)符號(hào)執(zhí)行的缺陷檢測工具 135
5.4.4 基于動(dòng)態(tài)污點(diǎn)分析的缺陷檢測工具 136
5.4.5 滲透測試工具 137
5.4.6 商業(yè)的基于動(dòng)態(tài)程序分析的缺陷檢測工具 137
5.5 小結(jié) 138
6 智能化程序分析技術(shù) 140
6.1 基于搜索的程序分析技術(shù) 140
6.1.1 基于遺傳編程的程序自動(dòng)化修復(fù) 141
6.1.2 基于搜索的軟件測試 144
6.1.3 基于搜索的程序分析技術(shù)的難點(diǎn)問題 144
6.2 數(shù)據(jù)驅(qū)動(dòng)的程序分析技術(shù) 144
6.2.1 基于深度學(xué)習(xí)的程序自動(dòng)化修復(fù) 145
6.2.2 基于深度學(xué)習(xí)的克隆代碼檢測 148
6.2.3 深度學(xué)習(xí)技術(shù)應(yīng)用于程序分析領(lǐng)域的難點(diǎn)問題 150
6.3 小結(jié) 151
參考文獻(xiàn) 152