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 越低意味着误报

