因果学习赋能代码模型:提升鲁棒性的全新范式
“ 近年来,基于深度学习的源代码模型(如漏洞检测、代码分类模型)取得了显著进展。然而,这类模型普遍存在一些关键问题:对数据分布偏差敏感;容易学习“伪相关特征”;在跨项目或真实场景中鲁棒性不足。
换句话说:模型往往“看起来学会了”,但实际上并没有真正理解代码语义。
针对这一问题,论文提出:一种基于因果学习(Causal Learning)的框架,用于提升源代码模型的鲁棒性与泛化能力。”
📄 论文标题:A Causal Learning Framework for Enhancing Robustness of Source Code Models
📅 发表时间:Proceedings of the ACM on Software Engineering,2025
🏫 作者单位:华中科技大学、科罗拉多大学科罗拉多斯普林斯分校
💡开源代码:https://github.com/CGCL-codes/CausalCode
01—方法介绍
图1是一个代码分析任务中虚假特征与因果特征的例子。
(a)缺陷检测中,模型能识别变量名为`t`的代码为“有缺陷”,但将语义相同、仅变量名改为 `dict` 的代码误判为“无缺陷”。
(b)函数分类中,模型能正确识别原始代码为“求和计算”,但在插入死代码后,误判为“其他函数”。

图1. 代码分析任务中虚假特征(黄色)与因果特征(绿色)的图示。
CausalCode工作的核心思想是:从“相关性学习”转向“因果关系建模”,让模型真正关注影响预测结果的关键因素。
整体框架可以概括为三层:
- 因果视角建模
分析代码特征与标签之间的因果关系;
- 数据层干预
构造不同分布下的训练样本;
- 模型层优化
通过因果约束提升学习目标。

图2. CausalCode架构
小结:与传统方法相比,该框架不再依赖单一数据分布,而是通过“多环境学习”提升鲁棒性。
02—关键机制
- 首次将因果学习系统性引入代码模型鲁棒性研究
- 结合干预与反事实机制,削弱伪相关特征影响
- 支持跨项目、跨数据集的稳定泛化
- 为漏洞检测等安全任务提供更可靠的模型基础
| 模块 | 设计思路 | 作用 |
|---|---|---|
| 因果变量建模 | 区分因果特征与非因果(伪相关)特征 | 避免模型依赖错误信号 |
| 干预机制(Intervention) | 通过数据干预打破特征间的虚假相关性 | 逼迫模型学习真实因果关系 |
| 反事实学习(Counterfactual Learning) | 构造反事实样本进行对比训练 | 增强模型判别能力 |
| 鲁棒训练策略 | 结合因果约束优化模型参数 | 提升跨分布泛化能力 |
小结:从“拟合数据”转向“理解机制”,是代码模型演进的关键一步。
03—实验结果
数据集选用四个公开数据集,所有示例均保证语义正确性,满足语义保持变换要求。
-
POJ-104:51,976个程序,104种功能类别,用于功能分类。
-
CodeChef:33,822个程序,分四类:OK(正确)、WA(输出错误)、TLE(超时)、RE(运行时错误),用于缺陷检测。
-
CodeTrans:11,800对Java-C#并行函数,平均长度38.51(Java)和46.16(C#)个token,用于代码转换。
-
Bugs2fixs:65,454个Java函数,由错误代码与修正代码配对组成,用于错误修正。
(1)评估对高级攻击的性能和鲁棒性,结果见表1-2。
-
表1显示:与缺陷检测分类器相比,功能分类分类器表现更优,准确率高出约 19%,攻击成功率(ASR)低 24.93%。
-
表2总结了对抗攻击结果:
(i)三类攻击在原始模型上的平均攻击成功率为39.41%,在对比学习预训练模型 ContraBERT 上为 35.13%。面对高级对抗攻击时,ContraBERT 带来的增强效果十分有限。
(ii)在两种对抗学习增强方法中,使用大量对抗样本进行再训练的 ALERT-T 方法,其效果优于使用小批量对抗样本继续训练的 CARROT-T 方法。
(iii)采用 CausalCode 增强的模型显著优于现有最先进方法,攻击成功率降低了 30.16%。
表1. 在分类任务上,针对 CodeBERT 和 GraphCodeBERT 模型,采用五种不同方法增强后的随机扰动(RP)结果(%)。

表2. 针对 CodeBERT 和 GraphCodeBERT 模型,在分类任务上采用五种不同方法增强后的对抗攻击结果(%)。

(2)扩展到代码生成任务的结果见表3。主要结果如下:
(i)ContraBERT 不仅未能降低 Δ_espq,反而在 CodeAttack 攻击下变得更加脆弱。
(ii)在代码转换和代码精化任务中,对抗学习方法 CARROT-T 平均仅使 Δ_espq 分别降低 0.50% 和 0.14%。而 ALERT-T 方法效果更佳,在这两项任务中平均使 Δ_espq 降低 0.85% 和 0.42%。
(iii)与基线相比,CausalCode的提升最为显著,在代码转换和代码精化任务中平均使 Δ_espq 分别降低 1.63% 和 0.76%。
表3. 针对 CodeBERT 和 GraphCodeBERT 模型,在生成任务上采用四种不同方法增强后的对抗结果(%)。

小结:CausalCode通过利用因果图和对对抗性操作具有抵抗力的干预方法,能够区分因果特征与虚假特征。使用最先进的基于深度学习的分类与生成模型进行的实验评估表明,CausalCode 能显著提升模型对抗对抗性攻击的鲁棒性。
📌 总结
该论文的核心贡献在于:将代码模型从“相关性驱动”提升到“因果驱动”,显著增强其鲁棒性与可解释性。这意味着未来的漏洞检测模型:不仅要“看起来有效”,更要“在不同环境下始终有效”。该工作为构建可信代码智能系统提供了重要理论与方法基础。
📣 欢迎留言讨论
-
你认为因果学习是否会成为代码智能的核心范式?
-
相比数据规模扩展,模型“理解能力”的提升是否更关键?
📌 点赞 + 收藏 + 分享,你的支持,是我们持续解析高水平软件安全论文的最大动力!
更多推荐
所有评论(0)