Page 36 - 《软件学报》2025年第7期
P. 36
欧先飞 等: 语义可感知的灰盒编译器模糊测试 2957
的变异操作符, 其测试修复的工作量远低于我们的 72 个操作符. 如果投入更多的测试运行时间, 我们相信
SemaAFL 的可编译程序比例可以比肩甚至超越 GrayC. 此外, AFL++仅能维持约 4% 的可编译程序比例, 这是由于
字符级别变异对程序结构的不可知性. 在表 4 中, 输出程序数量与变异次数正相关, 同时会受崩溃次数、havoc 机
制的影响, 在这里不存在严格的等式关系.
表 4 输出程序和可编译程序吞吐量对比
工具 输出程序数量 可编译程序数量 可编译比例 (%)
SemaAFL 1 717 460 1 332 405 77.58
AFL++ 2 772 711 110 353 3.98
GrayC 716 227 708 562 98.92
4.2.2 可靠性对比
在可靠性方面, 由于 AFL++的字符级别变异操作符实现逻辑非常简单, 易于人工验证. 如表 5 所示, 在整个 5
次 24 h 的对比实验中, 我们未曾观测到 AFL++的崩溃发生. 而相较而言, SemaAFL 平均在每 24 h 的时间段内仅发
生了 4 821 次崩溃, 这一崩溃频率仅有 GrayC 的约 1/80. 同时由于我们采用了进程隔离, 这些崩溃没有对 SemaAFL
的模糊测试进程产生任何影响. 平均到每个崩溃而言, SemaAFL 发生一个崩溃需要耗费近 20 s 的时间, 而 GrayC
仅需要 0.22 s. 这里需要额外说明的是, 由于 GrayC 在实施变异前需要先将输入文件复制到输出文件, 然后再在输
出文件上进行原地变异, 因此即使发生崩溃, 也至少能保留输出文件, 这也是表 3 中 GrayC 有高达 83% 的输出与
输入相同的原因.
表 5 崩溃发生的频率对比
工具 总崩溃次数 每小时崩溃次数 平均每个崩溃发生的时间 (s)
SemaAFL 4 821 200 17.92
AFL++ 0 0 -
GrayC 379 805 15 825 0.22
4.3 测试能力横向对比
图 5 展示了 SemaAFL、GrayC 和 AFL++ 在 GCC-14 和 Clang-18 上的平均覆盖率趋势. 总体而言, SemaAFL
在 GCC 和 Clang 上比 GrayC 和 AFL++ 的最佳结果提高了 14.5% 和 11.2%. 而 GrayC 仅通过 5 个精心设计的语
义级别的变异操作符, 便在 GCC 和 Clang 上的表现优于 AFL++. 这些结果表明, SemaAFL 在探索编译器的不同行
为上较 GrayC 和 AFL++具有显著优势.
350 350
Covered brances (k) 300 Covered brances (k) 300
250
250
AFL++
200
GrayC 200 AFL++
GrayC
SemaAFL SemaAFL
150 150
0 6 12 18 24 0 6 12 18 24
时间 (h) 时间 (h)
(a) GCC-14 (b) Clang-18
图 5 GCC-14 和 Clang-18 的各个测试工具在 24 h 内的覆盖率趋势
SemaAFL 的出色表现归因于其高效的语义级别的变异策略, 这使得它能够更深入地探索代码路径, 发现更多
的边界情况和潜在的漏洞. 此外, GrayC 虽然没有 SemaAFL 表现出色, 其利用少量但高效的可感知语法的变异操

