Page 34 - 《软件学报》2025年第7期
P. 34
欧先飞 等: 语义可感知的灰盒编译器模糊测试 2955
分支覆盖的信息来更新组合 (p,o) 的权重.
算法 5. 更新变异操作符权重映射.
[ ]
′ ∗
全局: 种子程序池 P, 变异操作符集合 O, 权重映射 W, 变异历史记录 H : (p,o, p ) ;
,
,
超参: N d N ⊥ ∈ N w t ,w s ,w c ∈ R;
′
p
输入: 被选中的程序 p, 被选中的变异操作符 o, 和变异后的程序 .
1. function update( p,o, p ) {
′
[ ]
2. if ( W (p,o) =⊥) {
3. W [( p,o)] ← 1
4. }
5. if ( p =⊥ ∨count((∗,∗, p ),H) > N d ) { // 用 o 变异 p 失败或生成重复程序
′
′
6. W [( p,o)] ← max(1,W[(p,o)]–w s )
]
[
7. if ( count((p,o,⊥),H) > N ⊥ ∧W (p,o) ⩽ w t ) { // 用 o 变异 p 已多次失败且权重低于阈值
8. W ← W–{( p,o)}
9. }
10. } else if ( ||brCover(p )−∪ q∈P brCover(q)|| > 0) { // p 覆盖了新的分支
′
′
′
11. P ← P∪{p }
′
12. W ← W ∪{(p ,o) 7→⊥ |o ∈ O}
[ ] [ ]
13. W (p,o) ← W (p,o) +w c
14. } else {
[ ] [ ]
15. W (p,o) ← W (p,o) +w s // 成功变异但未覆盖新分支
16. }
17. }
首先, 我们在第 2 行检测组合 (p,o) 的权重是否为 ⊥, 如果是, 则将权重 W (p,o) 初始化为 1. 接着, 如果用操
[
]
作符 o 变异程序 p 失败或生成了重复的程序 (第 5 行), 我们会在第 6 行给组合 (p,o) 的权重减去一个惩罚值 w s . 如
果对于同一个组合 (p,o), 变异失败的次数超过了阈值 N ⊥ , 并且当前权重低于另一个阈值 (第 7 行), 我们会在第
w t
8 行将该组合从权重映射 W 中完全移除.
′
如果变异成功, 并且生成的程序 p 覆盖了新的分支 (第 10 行), 我们不仅会在第 13 行给组合 (p,o) 的权重加上
w c , 还会在第 11、12 ′ ′
一个更大的奖励值 行将 p 加入到种子程序池 P 中, 并对所有的操作符 o, 将新的组合 (p ,o)
加入到权重映射 W 中, 以探索从这个新的有价值的种子程序开始的变异可能性. 如果变异成功, 但生成的程序 p ′
并未覆盖任何新的分支 (第 14 行), 我们会在第 15 行给组合 (p,o) 的权重加上一个奖励值 w s , 以鼓励该组合的进一
步尝试.
通过这种动态调整权重的方式, 我们可以不断地根据变异的反馈来优化种子程序和变异操作符的选择, 将更
多的计算资源投入到更有可能产生有价值变异的组合上, 提高模糊测试的效率.
4 实验评估
我们将前文所述的语义可感知的灰盒模糊测试实现为工具 SemaAFL. 为了全面评估 SemaAFL 的性能表现, 我
们设计了一系列实验, 并选取了具有代表性的测试工具 AFL++和 GrayC 作为性能对比的基准. 这些实验会横向对
比 SemaAFL 与其他工具在可用性/可靠性、代码覆盖率方面的优劣. 通过这些实验结果, 我们可以判断感知语义的
策略对提升模糊测试性能的贡献, 并明确 SemaAFL 的优势和不足. 具体而言, 本节的评估会围绕这 3 个问题展开.
(1) SemaAFL 在可靠性和可用性方面与其他测试工具的横向对比.

