Page 74 - 《软件学报》2025年第4期
P. 74
1480 软件学报 2025 年第 36 卷第 4 期
首先从 Linux Kernel、QEMU、Wireshark 和 FFmpeg 这 4 个大型 C 语言开源项目中收集函数, 进行提交过滤
(commits filtering), 排除了与安全无关的提交. 然后请 4 位专业安全研究人员组成的团队进行了两轮数据标注和交
叉验证. 为了确保数据标记的质量, 团队收集了与安全相关的提交, 将其标记为漏洞修复提交 (vulnerability-fix commit,
VFC) 或非漏洞修复提交 (non-vulnerability-fix commit, non-VFC), 然后直接从标记的提交中提取易受攻击或非易
受攻击的函数 (function). 其中, 漏洞修复提交是指修复潜在漏洞的提交, 可以从提交中所做的修订之前的版本的
源代码中提取易受攻击的函数. 非漏洞修复提交是不修复任何漏洞的提交, 可以从修改前的源代码中提取非漏洞
函数. 最终数据集包含 21 000 个训练样本、2 700 个验证样本和 2 700 个测试样本.
Google code jam (GCJ) 是一年一度的多轮国际编程竞赛, 每一轮都要求参与者解决一些编程挑战. 该数据主
要可用于训练源代码作者归属模型. GCJ 数据集来自 Google Code Jam 编程竞赛网站. 具体而言, 该数据集分为
GCJ-C++和 GCJ-Java 两类. 其中 GCJ-C++由 204 位选手编写的 1 632 个 C++程序文件组成, 每位选手有 8 个程序
文件, 对应 8 个编程挑战, 平均每个程序文件有 74 行代码. GCJ-Java 数据集包含 74 位选手的 2 396 个 Java 文件,
每个文件平均有 139 行代码.
CodeXGLUE 是由 Lu 等人 [83] 在 2021 年提出的用于程序理解的基准数据集. 该基准数据集适用于 3 类模型,
(JSONL) 格式发布, 其中每一行都包含一个
包括 BERT 类模型、GPT 类模型和 encoder-decoder 类模型. 该基准数据集收集自 BigCloneBench、POJ-104 和
Devign 等 14 个常见数据集, 并将数据集划分为 Code-Code、Text-Code、Code-Text 和 Text-Text 这 4 种类别, 覆
盖了代码克隆检测、代码漏洞检测和代码补全等 10 项代码下游任务.
CodeQA 是由 Liu 等人 [84] 在 2021 年提出的用于代码问答任务的数据集. 代码问答指给定代码片段和问题, 生
成文本答案. 该数据集可用于训练代码生成模型. 在数据集的构建过程中, 作者为了确保 QA 问答对自然且干净,
从 GitHub 上挑选了 Java 和 Python 两个经过充分研究的大规模数据集. 然后从这些数据集选择合适的生成 QA 对
的评论. 针对生成各种类型的问答对作者使用句法规则和语义分析, 将评论转换为问答对. 最终数据集 CodeQA 中
的 Java 数据集包含 119 778 个问答对, Python 数据集包含 70 085 个问答对.
APPS 是由 Hendrycks 等人 [85] 在 2021 年提出的用于评估代码生成任务性能的数据集. 该数据集可用于训练代
码生成模型. APPS 数据集由不同 OJ 网站收集的问题组成, 该数据集不仅评估模型编写语法正确的程序的能力,
还评估其理解任务描述和设计算法来解决这些任务的能力, 它涵盖了简单的入门问题、面试级别问题和编码竞赛
挑战. 该数据集总共包含 10 000 个平均长度为 293.2 个单词编码问题, 131 777 个用于检查解决方案的测试用例
和 232 421 个由人类编写的真实解决方案. 数据被平均分为训练集和测试集, 每个集合有 5 000 个问题. 测试集中,
每个问题都有多个测试用例, 平均测试用例数为 21.2.
Shellcode_IA32 是由 Liguori 等人 [86] 在 2021 年提出的, 该数据集由带有详细的英文注释的 IA-32 (x86 英特尔架
构的 32 位版本) 汇编语言指令组成. 该数据集可用于汇编代码生成和汇编代码摘要模型. 该数据集总共包含 3 200
对汇编代码片段和注释. 考虑到自然语言描述的可变性, 作者用英语描述了数据集的不同样本, 并使用所收集程序
的开发者撰写的评论作为自然语言描述. 该数据集是迄今为止可用于代码生成的最大的面向安全的代码集合.
SecurityEval 是 2022 年 Siddiq 等人 [87] 提出的用于评估代码生成模型的安全性的数据集. 该数据集可用于训
练代码生成模型. 该数据集包含 130 个 Python 代码片段, 涵盖了 75 种漏洞类型 (CWE). 数据集按照 JavaScript 对
象表示法 JSON 对象. 其中, JSON 对象具有 3 个键值对, 分别是 ID、
prompt、和 insecure code. ID 唯一地标识样本, prompt 内容是部分源代码框架, 可以用作代码生成模型的输入, 而
insecure code 是模型生成的可能存在漏洞的代码示例. 该数据集可用于向大模型 (LLM) 输入源代码框架提示
(prompt) 然后检查生成的代码来评估模型的代码生成技术的安全性.
LLMSecEval 是 2023 年 Tony 等人 [88] 提出的用于评估代码生成模型的安全性的数据集. 该数据集可用于训练
代码生成模型. 该数据集包含 150 个自然语言的提示 (NL Prompt), 涵盖了 MITRE 中前 25 种常见缺陷类型
(CWE). LLMSecEval 数据集来自 Chen 等人 [7] 的 HumanEval 数据. 作者首先对数据进行预处理, 包括过滤掉无效
的描述、删除空白内容、删除包含大量代码片段内容和, 删除不解释输入代码功能的内容, 最终得到 150 个有效
的 NL Prompt. 具体而言, LLMSecEval 总共包含 150 个编译为 CSV 和 JSON 文件的自然语言提示 (NL-Prompt),