Page 209 - 《软件学报》2026年第3期
P. 209
1172 软件学报 2026 年第 37 卷第 3 期
覆盖的同粒度对抗性样本时仍然脆弱 [15] .
(3) 对抗性训练的效率较低. 现有的对抗性攻击方法通常需要基于模型预测来引导攻击过程, 因此频繁地调用
代码模型导致对抗性样本生成过程效率低下 [16] . 由于对抗性训练依赖于此类对抗性样本, 因此其效率也会受到限
制. 此外, 在面对不同粒度和策略的对抗性攻击时, 对抗性训练可能需要多次执行, 这进一步降低了其效率. 这表明
对抗性训练在实际应用中的时间成本非常高, 因此提升对抗性防御的效率仍是一个亟待解决的问题.
基于此, 本文提出了一种对抗性防御方法 CoDefense, 其能够更有效地防御多粒度、不同策略的对抗性攻击,
并显著提升时间效率, 同时不损害原始模型的性能和代码嵌入质量. 不同于已有的对抗性训练策略, CoDefense
的核心思想是通过多粒度代码归一化策略将 (训练阶段的) 原始训练集和 (推理阶段的) 原始代码输入进行预处理,
以避免潜在的对抗性样本输入到代码模型, 因此能够有效防御不同粒度和策略的对抗性攻击. 基于这一核心思想,
CoDefense 的多粒度代码归一化策略包括 3 种类型: 变量名归一化、死代码消除和代码结构归一化. 具体来说,
CoDefense 的部署包括两个阶段: (1) 在训练阶段, CoDefense 对原始训练集进行代码归一化, 并使用处理后的代码
数据训练防御增强的代码模型; (2) 在推理阶段, CoDefense 对输入的原始代码 (可能包括对抗性样本) 进行与训练
阶段相同的代码归一化处理, 然后再输入到增强后的代码模型中, 从而避免可能存在对抗性扰动的代码直接输入
到代码模型. 此外, CoDefense 的创新之处还在于其作为代码模型的一个前置的数据处理模块, 与代码模型集成,
共同构成整体预测系统, 而非依赖于基于对抗性样本的对抗性训练. 与最先进的对抗性训练方法相比, CoDefense
能够更有效地防御不同粒度和策略的对抗性攻击. 由于 CoDefense 不依赖于生成的攻击成功的对抗性样本, 因此
相比于对抗性训练方法, 其显著提升了时间效率.
为了探索 CoDefense 与对比方法在防御对抗性攻击方面的有效性和效率, 本文在 27 个实验场景 (3 个对抗性
攻击方法×3 个代码模型×3 个数据集) 下进行了大规模的实证研究, 涵盖了 3 种最先进的对抗性攻击方法 (即 WIR-
[1]
Random [21] 、ALERT [19] 和 StyleTransfer [16] )、3 种广泛使用的预训练代码模型 (即 CodeBERT 、CodeGPT [7] 和
[6]
PLBART ) 以及 3 个关键的基于代码的分类和生成任务 (即漏洞检测 [8] 、代码克隆检测 [9] 和代码摘要生成 [10] ). 实
验结果表明, CoDefense 在防御有效性和效率方面均优于最先进的对抗性训练方法. 具体来说, 相比于对抗性训练
方法, CoDefense 平均提升了 10.75% 的防御成功率, 并平均降低了 65.14% 的错误防御率. 同时, CoDefense 完成全
部实验场景的防御过程的总运行时间为 59.82 h, 而对抗性训练方法则需 130.56–997.81 h. 另外, 我们研究了
CoDefense 和对抗性训练对于原始模型性能和嵌入质量的影响. 结果表明, CoDefense 不会损害原始模型的性能和
嵌入质量, 而对抗性训练方法在部分实验场景会损害原始模型的性能, 这进一步表明了 CoDefense 在提升模型鲁
棒性和保持模型性能方面的优势. 综上所述, 本文的主要贡献总结如下.
(1) 本文提出了一种基于代码归一化的预训练代码模型对抗性防御方法 CoDefense. 该方法可以作为代码模型
的前置处理模块, 通过多粒度代码归一化策略将 (训练阶段的) 原始训练集和 (推理阶段的) 原始代码输入进行预
处理, 以避免对抗性样本影响代码模型, 进而能够有效地防御不同粒度和策略的对抗性攻击.
(2) 本文在由 3 种先进的对抗性攻击方法、3 种流行的预训练代码模型和 3 个基于代码的分类和生成任务数
据集所组成的共 27 个实验场景下进行了广泛的实证研究. 实验结果表明, 相比于对抗性训练方法, CoDefense 平
均提升了 10.75% 的防御成功率和 85.86% 的时间效率, 并降低了 65.14% 的错误防御率. 这展现了 CoDefense 相
对于最先进的对抗性训练策略的有效性和高效性.
(3) 本文实现并开源了 CoDefense, 将相关代码开源在工具主页 https://github.com/tianzhaotju/CoDefense, 以便
其他研究者开展未来研究和实际使用.
2 背景知识
2.1 预训练代码模型
近年来, 基于深度学习的预训练模型在基于代码的软件工程任务上取得了显著进展, 这些模型在智能代码场
景中展现出广泛的应用前景, 我们称其为预训练代码模型 [16,22,23] . 这种预训练-微调范式通常包括两个阶段: 预训练

