Page 219 - 《软件学报》2026年第3期
P. 219

1182                                                       软件学报  2026  年第  37  卷第  3  期


                 AVERLOC [45] 、RoPGen [47] 和  StyleTransfer  [16] 则在语句/代码块级别执行保留语义的代码转换  (例如插入死代码或
                 将  while 循环语句转换为    for 循环语句), 而  StyleTransfer 作为其中最先进的方法, 集成了其余        3  种方法的全部代
                 码转换攻击策略, 因此在实验过程中选择             StyleTransfer 作为该类别的代表性方法. 总的来说, 本研究选择了           3  种最
                 典型或最先进的针对代码模型的对抗性攻击方法来评估                    CoDefense 和对比方法的防御效果. 下面是针对所选的            3
                 种对抗性攻击方法的描述.
                                 [21]
                    (1) WIR-Random  . 该方法首先利用     WIR (word importance rank) 策略来确定变量名的替换顺序. 具体来说,
                 WIR  策略将变量名依次替换为“UNK”, 然后计算替换前后模型的生成概率的差异, 并据此对每个变量名进行重要
                 程度排序. 最后, WIR-Random   按重要程度顺序以随机的方式选择候选变量名替换原始变量名. 在实验过程中, 将
                 候选变量名的数量限制为         15, 以避免攻击过程中产生的巨大的计算成本和时间开销.
                    (2) ALERT  [19] . 该方法利用上下文感知变量名预测方法, 迭代地进行变量名替换. 在变量名选择策略方面,
                 ALERT  采用了贪心算法和遗传算法两种策略. 在实验过程中, 我们同样把候选变量名的数量设置为                             15 (与  WIR-
                 Random  保持一致), 把遗传算法的最大迭代次数设置为             5× Num i  和  10  之间的较大者  (其中  Num i  表示给定代码片
                 段中变量名的数量).
                    (3) StyleTransfer [16] . 该方法执行特定的保留语义的代码结构转换. 具体而言, 该方法包含以下代码结构转换策
                 略: 1) 随机添加日志语句; 2) for 循环语句和      while 循环语句的互相转换; 3) 随机更改两个独立代码行的位置; 4) 重
                 新排序二元条件语句; 5) switch    条件语句和     if 条件语句的互相转换; 6) 随机添加        try-catch  代码块; 7) 随机添加一
                 段死代码; 8) 用非逻辑替换原有的布尔变量值. 然后, StyleTransfer 应用这些代码结构转换规则来生成                    N  个候选对
                 抗性样本, 并利用这些候选样本迭代地攻击模型. 在实验过程中, 我们把                    N  设置为  15, 以避免过大的计算成本和时
                 间开销.
                  4.4   评测指标
                    为了衡量    CoDefense 和对比方法在对抗性防御方面的有效性和效率, 我们使用如下的评测指标进行实验验证.
                    (1) 攻击成功率    ASR (attack success rate). ASR  用于衡量对抗性攻击方法成功生成对抗性样本的能力. 具体而
                 言, 对于给定测试集      TestX (需要注意的是, TestX  只包含能够被目标模型正确预测的测试集, 具体的原因已经在第
                 2.2    节讨论), 攻击成功率的计算公式如下:
                                                       |TestX attack-success |
                                                  ASR =           ×100%                               (1)
                                                          |TestX|
                 其中,  |TestX| 代表给定测试集   TestX  中代码片段的总数, 而    |TestX attack-success | 代表对抗性攻击方法能够成功生成对抗
                 性样本的数量. 对于对抗性攻击方法, ASR          越高意味着对抗性攻击方法越有效.
                    (2) 防御成功率   DSR (defense success rate). DSR  用于衡量对抗性防御方法成功防御对抗性攻击的能力. 具体而
                 言, 对于给定测试集     TestX, 防御成功率的计算公式如下:

                                                       |TestX defense-success |
                                                 DSR =             ×100%                              (2)
                                                       |TestX attack-success |
                 其中,  |TestX attack-success | 代表对抗性攻击方法生成的攻击成功的对抗性样本的总数, 而       |TestX defense-success | 代表对抗性防
                 御方法能够成功防御攻击成功的对抗性样本的数量. 对于对抗性防御方法, DSR                      越高意味着对抗性防御方法越有效.
                    (3) 错误防御率   FDR (false defense rate). 对抗性攻击方法生成的对抗性样本可能未能攻击成功, 即目标模型仍
                 能正确预测某些对抗性样本. 我们把这些样本称为攻击失败的对抗性样本. 然而, 对抗性防御方法可能会导致这些
                 原本攻击失败的对抗性样本错误地变为攻击成功的对抗性样本, 这种误报情况称为错误防御. 因此, 设计了                                  FDR
                 用于衡量对抗性防御方法造成的此类负面影响. 具体而言, 对于给定测试集                       TestX, 错误防御率的计算公式如下:

                                                        |TestX defense-fail |
                                                  FDR =           ×100%                               (3)
                                                        |TestX attack-fail |
                 其中,  |TestX attack-fail | 代表对抗性攻击方法生成的攻击失败的对抗性样本数量, 而        |TestX defense-fail | 代表对抗性防御方法
                 把原本攻击失败的对抗性样本误报为攻击成功的对抗性样本的数量. 对于对抗性防御方法, FDR                              越低意味着误报
   214   215   216   217   218   219   220   221   222   223   224