Page 37 - 《软件学报》2025年第7期
P. 37

2958                                                       软件学报  2025  年第  36  卷第  7  期


                 作符也展示了强大的能力, 特别是在处理复杂语法结构时表现尤为突出. 相比之下, AFL++ 尽管作为传统模糊测
                 试工具同样表现出色, 但在感知语义方面略显不足.
                    这些结果表明, 当模糊测试工具能够利用语义信息进行变异时, 其探索代码覆盖率的能力能够得到显著提升,
                 SemaAFL  成功例证了这一点. 这也进一步揭示了未来模糊测试工具的发展方向, 即结合语义信息的利用能力, 全
                 面提升代码覆盖率和缺陷发现能力.

                 4.4   缺陷挖掘的能力
                    我们在一台第      4.1  节所述的服务器上运行      SemaAFL  一周时间, 合计在    GCC-14  和  Clang-18  上找到并上报了
                 6  个缺陷, 这些缺陷的详细信息如表         6  所示. 这  6  个缺陷均在  24 h  内被开发者确认, 且均为前所未知的缺陷          (尽在
                 最近的数个版本可以触发).

                                            表 6 已上报的    GCC-14  和  Clang-18  的缺陷

                 编译器 缺陷编号                                       缺陷概述
                  GCC   #115641 GCC crashes on function has attribute ‘__attribute__((const))’
                  GCC   #115642 internal compiler error: tree check: expected class ‘type’, have ‘exceptional’ (error_mark) in c_expr_sizeof_expr
                  GCC   #115644 ICE if redeclare a variable with different type
                  GCC   #115646 ICE in gen_conditions_for_pow_int_base, at tree-call-cdce.cc:587
                  Clang  #96624 UNREACHABLE executed: Non-canonical and dependent types shouldn’t get here
                  Clang  #96627 UNREACHABLE executed: Type not integer, floating, or complex

                    下面讨论两个上报的缺陷案例, 并展示基于语义信息的变异操作符是如何找到这两个缺陷的. 这两个缺陷均
                 导致了编译器的崩溃, 一个在         GCC  的最新版本中, 一个在     Clang  的最新版本中.
                    缺陷案例    1: 图  6 展示了我们所发现的其中一个 GCC 的缺陷. 该缺陷会导致 GCC 在运行过程中崩溃. 我们通
                 过“随机插入属性”这一语义级别的变异操作符, 给函数                 f 插入了__attribute__((const)) 这一属性, 如图  6 第 8 行所
                 示. 该属性会通知编译器函数         f 是纯函数, 不会依赖外部状态且具有相同输入时总是返回相同的输出. 在添加这一
                 属性之后, GCC 崩溃并抛出了内部编译器错误             (ICE) 信息: expected tree that contains ‘decl common’ structure, have
                 ‘call_expr’ in tree_could_trap_p.
                    缺陷案例    2: 图  7 展示了我们所发现的其中一个 Clang 的缺陷. 该缺陷会导致 Clang 在运行过程中崩溃. 我们
                 通过“随机插入数学函数调用”这一语义级别的变异操作符, 给函数                      f 的返回语句的返回表达式中的子表达式              c1
                 插入了对数学函数       abs 的调用, 如图  7  第 11、12 行所示. 在添加这一数学函数调用之后, Clang 崩溃并抛出了内部
                 编译器错误    (ICE) 信息: UNREACHABLE executed: Type not integer, floating, or complex.





















                       图 6    GCC  的崩溃缺陷  (编号#115641)               图 7    Clang  的崩溃缺陷  (编号#96627)
   32   33   34   35   36   37   38   39   40   41   42