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] 通过字节级别的污点分析和梯度下降算法
   33   34   35   36   37   38   39   40   41   42   43