Page 216 - 《软件学报》2026年第3期
P. 216
田朝 等: CoDefense: 面向对抗性攻击的多粒度代码归一化防御方法 1179
质量平均提升率的指标, 即对每个质量指标分别计算其提升百分比, 并获取平均值, 该公式具体为:
( )
1 ∑ 3 Quality [i]− Quality [i]
× after before ×100%,
3 i=1 Quality before [i]
其中, i 代表不同质量指标的索引. 这一计算不仅考虑了代码质量的相对提升, 还通过平均化处理, 使得不同维度上
的提升能够公平地反映在整体改进效果上. 若计算结果显示, 经过转换后的代码在整体代码质量上相较于转换前
有所提升, 则 CoDefense 决定保留该代码位置上的当前代码结构转换规则, 并继续迭代此过程, 直至所有预定义的
代码结构归一化规则在所有可能的代码位置上都得到了充分的评估与可能的应用. 通过这种迭代优化策略,
CoDefense 能够有效提升代码的整体质量, 最终输出一个经过精细的代码归一化处理且代码质量显著提升的代码版本.
3.4 CoDefense 的部署和应用
上文介绍了 CoDefense 的多粒度代码归一化过程, 通过 3 种代码归一化处理策略, 可以得到处理后的代码数
据. 接下来, 我们将详细描述 CoDefense 方法的部署和应用流程. 如图 2 所示, CoDefense 作为代码模型的一个前置
的数据处理模块, 与代码模型集成, 共同构成整体预测系统. 它的输入包括原始代码模型 M、原始训练集 Data train
test
和原始测试集 Data .
在训练阶段, CoDefense 方法首先利用代码归一化方法对原始训练数据迭代进行代码归一化预处理, 得到归
一化的训练集 Data train . 然后, CoDefense 利用归一化后的训练集对原始模型进行训练以得到防御增强的代码模
normal
test
data , CoDefense 同样会将其进行代码归一化处理, 得到归一化
型 M defense . 在推理阶段, 对于任意给定的代码输入
后的代码输入 data test . 最后, 我们把归一化后的代码输入到防御增强的代码模型 M defense 中, 得到正确的预测结
normal
果. 第 5 节和第 6.1 节将会深入分析 CoDefense 增强后的模型的性能表现和代码嵌入分布.
在整个工作流程中, CoDefense 与代码模型集成为一个整体系统运行. 通过将训练集和推理过程的代码输入
都进行归一化处理以避免可能是对抗性样本的代码直接输入到代码模型, 进而从根本上提高了代码模型的对抗性
防御能力.
4 实验分析
4.1 实验研究问题
为了全面探究 CoDefense 在防御对抗性攻击方面的有效性和效率, 并评估 CoDefense 对目标模型的原始性能
影响, 本文设计了以下 3 个研究问题.
研究问题 1: 与现有方法相比, CoDefense 在防御不同对抗性攻击方面的效果如何?
研究问题 2: 与现有方法相比, CoDefense 在防御不同对抗性攻击方面的效率如何?
研究问题 3: 与现有方法相比, CoDefense 对目标代码模型的原始性能影响如何?
4.2 数据集和模型
为了充分评估 CoDefense, 本文考虑了最新研究 [15] 中的 3 个关键的基于代码的任务 (即漏洞检测 [8] 、代码克
[6]
[1]
隆检测 [9] 和代码摘要生成 [10] ) 和 3 个流行的预训练代码模型 (即 CodeBERT 、CodeGPT 和 [7] PLBART ), 共计 9
组实验对象. 表 3 展示了这些实验对象的具体信息, 其中第 2、3 列分别表示数据集和代码模型的组合, 第 4–8 列
分别是训练集规模、验证集规模、测试集规模、测试指标以及模型测试集性能.
● 数据集: 与最新研究一致 [16] , 我们选择了 3 个代表性的数据集来进行实验评估, 分别涵盖了以代码为输入的
分类任务和生成任务. 漏洞预测 (vulnerability detection) 任务旨在预测给定的代码片段是否存在漏洞. 对于该任务,
采用 OWASP (open Web application security project) 数据集作为实验数据. 它是一个用于评估漏洞检测工具的
Java 测试套件, 被广泛地应用于漏洞检测任务 [64–66] . 与现有工作 [16] 保持一致, 我们也采用该数据集的 1.1 版本, 它
包含了更多的数据, 更适合训练代码模型. 具体来说, 该版本包含 13 041 个训练样本、4 000 个验证样本和 4 000 个
测试样本. 代码克隆检测 (code clone detection) 任务旨在检测两个给定的代码片段在语义上是否等价. 对于该任务,
采用 BigCloneBench [67] 作为实验数据集. 它是一个被广泛使用的代码克隆检测数据集, 包含了多种克隆类型的项

