Code Embedding系列 - token embedding
NLP中embedding无处不在,embedding将大型稀疏向量转换为保留语义关系的低维空间。在源代码研究领域(源代码分类,源代码克隆检测,变量,方法等重命名等)也会需要用到embedding,即code embedding。
code embedding可以分成很多种:
1.把源代码文本当成纯文本进行embedding (text embedding)
2.把源代码经过词法分析过后生成的token序列进行embedding (token embedding)
3.利用源代码解析成的抽象语法树**(AST), 从AST上提取信息进行embedding
4.利用源代码的控制流图(CFG)**和数据依赖图(PDG)进行embedding (基于graph的embedding)
这里Zimin Chen等人做了一个关于code embedding的统计研究
这里列举一些应用了token embedding的论文:
1.Automated software vulnerability detection with machine learning
这篇文章结局的问题是c/c++代码的bug检测,任务则是二分类,代码分为Good和Buggy,检测的粒度是function (即分析代码中的某个function是Good还是Buggy)
采用的方法结合了build-based(先编译C代码)和source-based(直接分析源代码文本),build-based分析了编译后的代码的CFG(控制流图),source-based则是基于token embedding的分析,这里重点讨论source-based (数据集中有一部分不能编译成功)。
数据集来源
数据集来自2部分:
1.Debian包
2.Github
数据集的统计信息如下:
| 项目 | Debian | Github | Source |
|---|---|---|---|
| Train Good | 429807 | 250436 | 754150 |
| Train Buggy | 14616 | 9556 | 31790 |
| Test Good | 66100 | 38500 | 94268 |
| Test Buggy | 1878 | 1220 | 3724 |
| Val Good | 55102 | 32109 | 94268 |
| val Buggy | 1857 | 1203 | 3724 |
其中Source为Debian和Github的总和
数据集预处理
1.数据下下来后首先要去除重复的function**(长得一模一样)**
2.用Clangstatic analyzer (SA) 分析,将分析的输出去除和漏洞,bug无关的警告。去除过后没有警告信息的被标记为Good,有信息的被标记为Buggy。
分类方法
获取token
将源代码文本用自定义文法分析器解析成token序列,比如:
for (int i = 0; i <= 10; ++i){
arr[i] += i;
}
生成的token序列如下:
for int i = 0 ; i <= 10 ; ++ i {
arr [ i ] += i ; }
生成的token分类为:字符串值, 单字符值, 字符数组, 数值, 操作符, names等, names又细分为key(if for等等),系统调用(malloc),类型(bool, int, char),变量名。变量名又会被都映射为同一个标识符(具体参考论文),string值,float值都会被映射。
向量化表示
上述映射过程后会生成一个token序列,之后便是要对每个token进行向量化,用到的方法有:
1.词袋模型
2.word2vec
这样便可以生成非监督下的embedding表示,一个word2vec的token表示二维化后如下:

分类模型
论文设计的如下:

本文介绍了两篇应用token embedding的论文。一篇是用机器学习进行自动化软件漏洞检测,结合build - based和source - based方法,对C/C++代码做二分类;另一篇是腾讯安全科恩实验室提出的二进制代码/源代码端到端匹配算法,将源代码和二进制代码向量化后计算Triplet Loss。
最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



