Page 38 - 《软件学报》2025年第7期
P. 38
欧先飞 等: 语义可感知的灰盒编译器模糊测试 2959
5 讨 论
5.1 局限性
SemaAFL 专为 C/C++语言模糊测试而设计, 与 AFL 系列通用模糊测试工具相比, 其适用范围更为聚焦. 通用
模糊测试工具采用字符串级别变异, 不依赖具体输入结构, 可应用于任意软件系统. 相比之下, SemaAFL 专注于
C/C++编译器测试, 原因如下: 首先, C/C++是系统级编程中最广泛使用的语言, 其编译器质量对整个软件生态系统
的安全性和可靠性具有关键影响. 其次, 聚焦特定领域使我们能够精确建模程序的语法和语义结构合法性. 借助成
熟的 C/C++语法语义分析工具 (同为编译器工具链的组成部分) 即可实现高效、可靠的语法和语义分析.
与 C/C++语言的绑定导致了 SemaAFL 实现方面的局限. 目前, SemaAFL 依赖 libclang 对 C/C++程序进行语
法和语义分析, 因此无法解析非标准的语言扩展特性, 从而无法对这些特性进行有效测试. 例如, 虽然嵌套的函数
定义并不属于 C/C++语言标准, 但在 GCC 等编译器中却作为一种语言扩展特性而被支持. 而 libclang 对这一特性
就缺乏支持, 导致含有该特性的程序无法被正确解析.
5.2 多语言支持
SemaAFL 目前支持 C/C++编译器的模糊测试, 但其基于语义信息的变异操作符理念并不局限于特定编程语
言. 主流编程语言普遍遵循相似的设计范式, 使得某些语义级别的操作符 (如“修改二元表达式”) 可适用于多种语
言 (如 Java、Python、Go、Rust 等). 这为 SemaAFL 向其他语言的扩展提供了基础, 使我们能够在很大程度上复
用现有实现, 而非完全重新开发.
具体来说, 若要适配新的编程语言, 我们需要为 SemaAFL 的变异操作符实现以下功能.
(1) AST 解析与重写: 目前, 最广泛使用的 C/C++解析器是 libClang, 它支持 C/C++标准语法及多种 GNU 扩
展. 对于其他编程语言, 开发者可以利用 ANTLR [24] 和 tree-sitter [25] 等工具, 这些工具提供了比 libClang 更简易的
API.
(2) 语义查询与检查: 开发者可以复用使用语言服务器协议 (language server protocol) [26] 实现的现有分析 (如标
识符索引器和 linter). 此外, 这些分析不需要非常精确——保守的方法仍然可以产生有用的变异操作符, 尽管代价
是会产生更多无效的程序.
以 Java 为例, 实现变异操作符的流程可概括为使用 ANTLR 解析程序为语法树, 遍历树以定位二元操作符节
点, 确定操作符在源程序中的位置, 替换为其他合法操作符, 最后通过 LSP 进行语义合法性检查, 若合法则输出变
异体.
然而, 将 SemaAFL 扩展至其他语言仍面临挑战. 每种语言都有其独特特性 (如 Java 的注解、C++的模板、
Python 的装饰器), 这些语言特有元素可能需要定制处理逻辑, 难以直接跨语言移植. 尽管存在这些障碍, 我们认
为 SemaAFL 的核心理念具有跨语言应用潜力. 通过精心设计和实现, 我们可逐步将 SemaAFL 扩展到更多编程
语言.
6 相关工作
6.1 灰盒模糊测试
灰盒模糊测试作为一种有效的软件测试方法, 近年来得到了广泛的研究和应用. 最初的灰盒模糊测试通过随
机变异格式正确的输入来探测程序是否会崩溃 [27] . 随后, 研究者借鉴遗传算法思路, 引入代码覆盖率作为变异指
[2]
导. 其中, AFL 是一个里程碑式的工作, 它使用轻量级插桩技术收集覆盖率信息, 大大提高了测试效率. AFL++ [20]
[5]
在其基础上整合了多个 AFL 变种的优秀特性, 进一步增强了工具的功能和适用性. CollAFL 通过改进覆盖率收
[4]
集方案, 解决了路径碰撞问题, 提高了覆盖率精确度. FairFuzz 专注于提高对稀有分支的覆盖, 有助于发现深层次
[3]
漏洞. Steelix 则致力于解决对比较操作的处理难题, 提高了对魔法字节的识别能力.
在此基础上, 一些研究者提出了更加专门化的方法. 例如, Angora [10] 通过字节级别的污点分析和梯度下降算法

