Page 211 - 《软件学报》2026年第3期
P. 211
1174 软件学报 2026 年第 37 卷第 3 期
对于生成任务来说, 鉴于代码摘要生成模型的输出包含了多种可能, 直接套用代码分类任务中用以判断对抗
性攻击成功与否的标准是不切实际的. 因此, 为合理地评估此类攻击, 先前的研究广泛采纳了基于 BLEU 的度量方
法, 该方法通过量化代码摘要间的文本相似度来反映对抗性攻击对模型输出的影响程度. 本文遵循这一评估策略,
给出了 3 个对应条件: 首先, 生成任务中的对抗性样本也需同时遵循分类任务中既定的要求 (1); 其次, 原始预测摘
要与参考摘要之间的 BLEU 非零, 这确保了在没有攻击干扰的情况下, 模型能够生成与真实摘要互相匹配的内容
(对应分类任务的要求 (2)); 最后, 对抗性摘要与参考摘要之间的 BLEU 为零, 这表明对抗性摘要与参考摘要之间
几乎不存在任何匹配关系 (对应分类任务的要求 (3)).
2.3 对抗性防御
为了防御对抗性攻击, 目前最常见且有效的方法是对抗性训练 [15,16,19,20] . 对抗性训练通过将生成的对抗性样本
作为增强数据, 与已有的原始训练集结合进行训练. 该策略尽可能地在不影响代码模型原始性能的前提下提高模
型防御对抗性攻击的能力. 对应第 2.2 节的描述, 我们分别给出了基于代码的分类任务和生成任务的对抗性防御
的形式化定义.
M : X → Y, 对抗性攻击
对于分类任务来说, 给定一个代码片段 x ∈ X, 其真实类别标签为 y ∈ Y. 针对代码模型
方法生成了攻击成功的对抗性样本 x adv . 我们通过对抗性防御方法得到了增强后的代码模型 M defense : X → Y. 具体
来说, 成功的对抗性防御需要满足 3 个条件 (x adv ≜ x)∧(y = M defense (x))∧(M defense (x) = M defense (x adv )), 下面给出具体
的描述.
(1) x adv ≜ x 表示满足语法约束并保留原始代码 x 的代码语义.
(2) y = M defense (x) 表示 M defense 能够对给定输入 x 得到正确预测类别.
(3) M defense (x) = M defense (x adv ) 表示 M defense 没有被对抗性样本 x adv 误导为错误的分类结果, 成功地防御了对抗性
样本 x adv 的攻击.
类似地, 对于生成任务来说, 同样需要满足 3 个条件: 首先, 生成任务中的对抗性样本也需遵循分类任务中既
定的要求 (1); 其次, 原始预测摘要与参考摘要之间的 BLEU 非零, 这确保了在没有攻击干扰的情况下, 模型能够生
成与真实摘要互相匹配的内容 (对应分类任务的要求 (2)); 最后, 对抗性摘要与参考摘要之间的 BLEU 也为非零,
这表明对抗性摘要无法误导模型的预测结果 (对应分类任务的要求 (3)).
3 基于代码归一化的对抗性防御方法
在本节中, 我们首先通过一个简化的动机示例来直观地激发我们的关键思想, 接着介绍了 CoDefense 的概述
设计, 然后介绍 CoDefense 的多粒度代码归一化策略以及实际场景下的部署和应用过程.
3.1 动机示例
我们使用一个简化的示例来阐明多粒度对抗性防御方法的动机与必要性. 给定一个原始的代码片段, 对抗性
攻击技术可以通过执行特定的等价代码转换来生成一系列对抗性样本. 总结了最近 5 年的主要会议和期刊上发表
的最先进的针对代码模型的对抗性攻击方法 (具体细节将在第 4.3 节介绍), 并将它们的对抗性攻击策略分为 3 类:
变量名替换、死代码插入和代码结构转换.
基于变量名替换的对抗性攻击通常利用随机策略或启发式搜索策略, 引导对抗性样本的生成过程 [18] . 该策略
在满足代码语法和语义约束的前提下, 不产生语法错误且不改变代码语义, 通过逐步改变原始代码的预测结果, 最
终生成攻击成功的对抗性样本. 以图 1 中的 AdvCode-1 为例, 对抗性攻击方法通过把原始代码中的变量名 n 和 k
分别替换为新的变量名 nan 和 kick 生成了攻击成功的对抗性样本, 该对抗性样本成功地误导了代码模型的预测
结果.
类似地, 基于死代码插入的对抗性攻击通常利用随机策略或启发式搜索策略, 迭代地寻找死代码插入的位置
和内容 [20] . 死代码插入规则不会产生语法错误也不会改变代码语义, 通过迭代攻击过程最终生成攻击成功的对抗
性样本. 以图 1 中的 AdvCode-2 为例, 对抗性攻击方法通过在原始代码的第 4 行插入死代码 while (i!=i){int b=10;

