- Methods
- Build-based feature extraction(基于编译的特征提取)
- Source-based feature extraction(基于源的特征提取)
- Labels(生成标签)
- Models
- Source-based models(基于源代码的模型)
- Build-based models (基于编译的模型)
- Experimental results
- Source-based detection
- Build-based detection
- Comparison and combined model performance
为了检测C和c++代码中的漏洞,我们考虑了两种互补的方法。
第一种使用从编译和构建过程中生成的程序的中间表示(IR)中提取的特性。
第二种方法直接对源代码进行 *** 作
在函数层,我们提取了函数的控制流图(CFG)。
在控制流图中,我们提取特征关于每个基本块中发生的 *** 作( *** 作码向量,或 op-vec)以及定义和使用变量(使用定义矩阵)。
CFG是程序在执行过程中可以采用的不同路径的图形表示。每个节点都是一个基本块——一个没有分支行为的代码单元。
- 定义一个词法分析程序:解析代码并将元素分类到不同的容器中
comments (which are currently removed) 注释
string literals 字符串
single character literals 单个字符
multiple character literals 多字符文字
numbers 数字
operators 运算符
pre-compiler directives 预编译指令
names 名称 - 名称进一步细分为关键字(如for、if等)、系统函数调用(如malloc)、类型(如bool、int等)或变量名。
3.标记序列转换为向量表示 - bag-of-words vector
- word2vec
在函数级别进行标记
在特征提取过程中为每个函数生成标签
使用Clang static analyzer (SA)
去除掉那些和安全漏洞无关的警告
将这些结果与函数相匹配
对标签进行二值化,根据有没有静态分析结果 分别标记为good(negative)和buggy(positive)。
如果我们的检测模型将一个函数标记为buggy,并且还有一个静态分析结果,这将被视为真正的阳性。类似地,当函数没有静态分析结果时,将其标记为buggy会被视为假阳性。
构建机器学习模型来检测BUGGY函数时,我们考虑两个目标。
首先,我们的目标是评估整体可能的性能——每个模型能够预测代码中存在的不安全行为的程度。
其次,我们的目标是比较基于构建和基于源代码的功能的性能,以发现哪一组更能预测代码质量。
因此,我们构建独立的基于源和基于构建的模型,并考虑组合的方法。
我们基于源代码的模型直接从单个函数的源代码中获取一个特征向量,并输出一个对应于给定函数包含bug的可能性的分数。
根据前面提到的bag-of-word vector和word2vec 两种向量表示方法,构建了多个模型
random forest
Experimental results Source-based detection
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)