Page 72 - 《软件学报》2025年第4期
P. 72

1478                                                       软件学报  2025  年第  36  卷第  4  期


                    2023  年, Improta 等人  [41] 提出通过在代码描述中添加单词级别扰动的方法提高代码生成模型的鲁棒性, 扰动
                 具体分为单词替换和单词省略方法. 首先, 通过余弦相似性证明扰动保留了原始语义. 在实验中, 他们评估了
                 Seq2Seq、CodeBERT  和  CodeT5+模型受到新扰动的影响大, 性能下降明显. 基于此, 他们对训练数据进行不同比
                 例的数据增强, 通过实验证明了该方法可以提高对于扰动样本的鲁棒性, 并且对于非扰动数据也能提高模型性能,
                 获得更高的语义正确性.
                    上述提到的对抗防御研究          [9,16,19,41] 主要是通过采用对抗性训练或数据增强技术来提升模型的鲁棒性. 这些研
                 究使用基于梯度的扰动, 在最坏的情况下对程序进行转换. 相较于随机扰动, 更有可能生成健壮的模型. 然而, 这些
                 方法在提升模型鲁棒性的同时却会降低模型的正常性能. 虽然, 一些研究通过基于梯度的对抗训练与编程语言的
                 数据特征相结合或设计特定的损失项来对模型鲁棒性和性能进行加强                         [26,31] . 但是, 这些方法需要消耗更多的计算
                 资源. 因此, 如何有效地提升模型鲁棒性的同时保持模型的性能仍是未来对抗防御研究需要解决的问题.

                 3.3   小    结
                    本节重点关注目前针对深度代码模型的对抗攻击和对抗防御的相关研究. 对抗攻击旨在通过制作的对抗样本
                 对深度代码模型发起攻击, 从而误导模型做出错误的或者攻击者预定目标的预测. 根据攻击者对模型的信息掌握
                                                      726 768
                 程度, 对抗攻击可以分为黑盒对抗攻击和白盒对抗攻击. 在白盒攻击中, 攻击者能够获得目标模型的结构和参数等
                 信息, 并可以根据这些已知信息生成对抗样本. 而在黑盒攻击中, 攻击者无法得知目标模型的详细信息, 只能获取
                 模型的最终决策结果, 攻击者需要通过与系统互动过程来生成对抗样本. 针对上述不同的对抗攻击, 研究者提出了
                 有针对性的对抗防御方法. 相比于对抗攻击在深度代码模型安全领域的广泛研究, 目前针对该领域的对抗防御相
                 关研究集中在对抗训练方法中. 与修改模型和附加模型相关的对抗防御研究仍然缺失.

                 4   深度代码模型安全数据集与评估指标总结
                    本节总结深度代码模型安全研究领域常用的基准数据集                    (benchmark) 以及常用的评估指标     (metrics).

                 4.1   数据集
                    在表  5  中, 详细列出了深度代码模型安全领域常用的数据集, 并给出了每个数据集的相关信息, 包括数据名
                 称、参考文献、发表时间、包含的编程语言、数据量、数据来源以及下载地址链接, 以方便后续研究人员下载并
                 使用.


                                          表 5 深度代码模型安全性研究常用基准数据集

                              发表
                    数据名称           编程语言     数据来源      数据量              下载地址                  应用场景
                              年份
                          [25]
                   SPEC2000   2000  C/C++   开源项目       -         https://www.spec.org/cpu2000  计算机系统性能评估
                            [47]                             https://github.com/clonebench/BigCloneBe  代码克隆检测、
                 BigCloneBench  2014  Java  开源项目     6 260 000
                                                                         nch                代码克隆搜索
                  Open judge (OJ)  2016  C++  OJ平台    52 000      http://programming.grids.cn  代码分类
                    dataset [74]
                                      Go
                                     Java            1 569 889
                            [46]   JavaScript        1 857 835                              代码搜索、
                 CodeSearchNet  2019        开源项目             https://github.com/github/CodeSearchNet
                                     PHP              977 821                                代码摘要
                                    Python           1 156 085
                                     Ruby             164 048
                          [50]                                     https://github.com/tech-  代码摘要、代码文档
                   Code2Seq   2019   Java   开源项目     1 600 000
                                                                    srl/code2seq#datasets  生成、代码搜索
                         [48]
                    Devign    2019   Java   开源项目      26 400    https://github.com/rjust/defects4j  代码缺陷检测
                  Google code jam    C++              1 632  https://codingcompetitions.withgoogle.com/
                              2020           OJ平台                                         代码作者归属识别
                     (GCJ)           Java             2 396             codejam
   67   68   69   70   71   72   73   74   75   76   77