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

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


                    挑战  3. 覆盖新分支时的权重奖励. 在灰盒模糊测试工具中, 分支覆盖信息用以指导灰盒模糊测试如何选择种
                 子程序. 由于我们替换了灰盒模糊测试工具中的选择策略, 因此我们的算法需要承担起这部分功能. 更具体地, 我
                                                              ′
                 们需要在当前变异操作符         o 应用在程序   p 上所生成的程序     p  探索到新的分支时, 进行权重调整, 以奖励这样的行为.

                 3.1   动态权重选择算法
                    给定种子程序池       P  和变异操作符集合      O, 该算法的重心是维护一个权重映射            W = {(p,o) 7→ w|(p,o) ∈ P×O}.
                                                                                                   ,
                 在模糊测试进行到选择种子程序和变异操作符这一阶段的时候, 通过                       W  加权采样出一组     (p,o), 其中  p ∈ P o ∈ O,
                                              p
                                               ′
                 并将操作符    o 应用于  p 获得新的程序  .
                    我们将选择操作符和种子程序表述为算法 4                中的  select 函数  (对应前文算法 1  的第  2  行所调用的函数), 给
                 定动态维护的权重映射        W = {(p,o) 7→ w|(p,o) ∈ P×O}, 在进行选择时, 选择算法根据当前权重采样一个          (p,o) 组合
                 (算法 4  第  6  行) 返回给算法 1  进行变异.

                 算法  4. 寻找适合的基于语义信息的变异操作符和种子程序.

                 全局: 种子程序池     P, 变异操作符集合     O, 权重映射   W : P×O 7→ weight;
                 输出:   (p,o) 一组可以进行变异操作的操作符        o 和程序  p.
                 1. function select() {
                 2.     E ← {(p,o)|W [e] =⊥}
                                    |E|
                             (0,1) <
                 3.   if (random       ) {
                                  |P×O|
                 4.   return randomly_select  (E)
                 5.  } else {
                 6.   return weighted_sample  (P×O− E,W)
                 7.  }
                 8. }

                                             ⊥, 表示当前没有历史信息可供参考, 所有权重均未知. 这样的设计是为了在
                    权重映射    W  初始化所有权重为
                                                                                     (p,o) 组合. 对于这部分组
                 整个模糊测试刚开始的阶段, 以及新的程序被加入的时候, 区分出没有变异历史记录的
                 合, 我们以一定概率进行完全随机采样            (算法 4  第  4  行), 该概率会随着权重映射     W  中有记录的项数占比提升而降
                 低. 对应算法 4   第  3  行  |E| 越大, random  (0,1) < |E|/|P×O| 的概率越小, 进行第  4  行  randomly_select  (E) 的概率也越

                 小. 且当   |E| = |P×O| 时, random  (0,1) < |E|/|P×O| 的概率为  0, 意味着当所有组合都有记录时, 不再进行完全随机
                 采样.

                 3.1.1    权重更新策略
                    前文描述了在给定权重映射           W  的情况下, 如何进行采样以选出合适的程序             p 和变异操作符    o. 而对于权重映
                                                                                              p  以及权重映
                                                                                              ′
                 射  W  如何进行更新, 这里会详细展开说明. 具体来说, 给定变异操作符                o, 种子程序   p, 变异后的程序
                 射  W, 我们会就表   2  所示的事件对权重映射       W  进行调整.

                                          表 2 动态权重算法关注的事件和会采取的策略

                                 事件                                        采取动作
                       用  o 变异  p 失败或生成重复程序                           给组合   (p,o) 降低权重
                           p 已多次失败且权重低于阈值
                     用  o 变异                                      将组合  (p,o) 从权重映射  W  中移除
                         成功变异但未覆盖新分支                                  给组合   (p,o) 增加权重
                            p 覆盖了新的分支                   给组合   (p,o) 增加权重, 并对所有  o ∈ O 将  (p ,o) 加入权重映射  W
                                                                                      ′
                             ′

                    算法 5  描述了如何基于表       2  所示的事件对权重映射       W  进行调整更新, 对应权重更新函数记为           update, 该函数
                 同样也对应前文算法 1       第  4  行所调用的函数. 该函数用以在操作符          o 被用于变异程序      p 之后, 根据变异的结果和
   28   29   30   31   32   33   34   35   36   37   38