c - 如何从 Frama-C 中的依赖图中提取特征/指标
问题描述
我是一名 PG 学生,正在研究代码克隆检测。为此,我使用名为Frama-C的工具制作了 C 代码的程序依赖图。现在我必须从这些程序依赖图中提取特征/指标以进行进一步处理。Frama-C 可以从程序依赖图中提取指标吗?如果没有,还有其他工具可以吗?
void sumProd1A(int n) {
double sum = 0.0; //C1
double prod = 1.0;
int i;
for (i = 1; i <= n; i++)
{
sum = sum + i;
prod = prod * i;
foo2(sum, prod);
}
}
void main()
{
printf("\nsumProd1A_Cordy: %lf ");
sumProd1A(4);
}
这是实际的代码,它转换成这个程序依赖图
[pdg] ====== PDG GRAPH COMPUTED ======
[pdg] PDG for foo2
{n38}: InCtrl
{n39}: VarDecl : x_0
<-[a--]- 40
{n40}: In1
<-[a--]- 39
<-[--d]- 43
{n41}: VarDecl : x_1
<-[a--]- 42
{n42}: In2
<-[a--]- 41
<-[--d]- 43
{n43}: OutRet
[pdg] PDG for printf
{n44}: InCtrl
{n45}: VarDecl : x_0
<-[a--]- 46
{n46}: In1
<-[a--]- 45
{n47}: OutRet
{n48}: In("\nsumProd1A_Cordy: %lf "[bits 0 to 183])
<-[--d]- 47
[pdg] PDG for sumProd1A
{n49}: InCtrl
<-[-c-]- 55
<-[-c-]- 56
<-[-c-]- 57
<-[-c-]- 58
<-[-c-]- 59
<-[-c-]- 60
<-[-c-]- 61
<-[-c-]- 62
<-[-c-]- 63
<-[-c-]- 64
<-[-c-]- 65
<-[-c-]- 66
<-[-c-]- 67
<-[-c-]- 68
{n50}: VarDecl : n
<-[a--]- 51
<-[--d]- 59
{n51}: In1
<-[a--]- 50
<-[--d]- 59
{n52}: VarDecl : sum
<-[a--]- 55
<-[a-d]- 61
<-[--d]- 64
{n53}: VarDecl : prod
<-[a--]- 56
<-[a-d]- 62
<-[--d]- 65
{n54}: VarDecl : i
<-[a--]- 57
<-[--d]- 59
<-[--d]- 61
<-[--d]- 62
<-[a-d]- 66
{n55}: double sum = 0.0;
<-[--d]- 61
{n56}: double prod = 1.0;
<-[--d]- 62
{n57}: i = 1;
<-[--d]- 59
<-[--d]- 61
<-[--d]- 62
<-[--d]- 66
{n58}: while(1)
<-[-c-]- 58
<-[-c-]- 59
<-[-c-]- 60
<-[-c-]- 61
<-[-c-]- 62
<-[-c-]- 63
<-[-c-]- 64
<-[-c-]- 65
<-[-c-]- 66
<-[-c-]- 67
{n59}: i <= n
<-[-c-]- 58
<-[-c-]- 59
<-[-c-]- 60
<-[-c-]- 61
<-[-c-]- 62
<-[-c-]- 63
<-[-c-]- 64
<-[-c-]- 65
<-[-c-]- 66
<-[-c-]- 67
{n60}: block
<-[-c-]- 61
<-[-c-]- 62
<-[-c-]- 63
<-[-c-]- 64
<-[-c-]- 65
{n61}: sum += (double)i;
<-[--d]- 61
<-[--d]- 64
{n62}: prod *= (double)i;
<-[--d]- 62
<-[--d]- 65
{n63}: Call35-InCtrl : foo2(sum,prod);
<-[-c-]- 64
<-[-c-]- 65
{n64}: Call35-In1 : foo2(sum,prod);
{n65}: Call35-In2 : foo2(sum,prod);
{n66}: i ++;
<-[--d]- 59
<-[--d]- 61
<-[--d]- 62
<-[--d]- 66
{n67}: break;
<-[-c-]- 58
<-[-c-]- 59
<-[-c-]- 60
<-[-c-]- 61
<-[-c-]- 62
<-[-c-]- 63
<-[-c-]- 64
<-[-c-]- 65
<-[-c-]- 66
<-[-c-]- 67
{n68}: return;
[pdg] PDG for main
{n69}: InCtrl
<-[-c-]- 70
<-[-c-]- 71
<-[-c-]- 72
<-[-c-]- 73
<-[-c-]- 74
{n70}: Call39-InCtrl : printf("\nsumProd1A_Cordy: %lf ");
<-[-c-]- 71
{n71}: Call39-In1 : printf("\nsumProd1A_Cordy: %lf ");
{n72}: Call40-InCtrl : sumProd1A(4);
<-[-c-]- 73
{n73}: Call40-In1 : sumProd1A(4);
{n74}: return;
这是我必须从中提取特征的程序依赖图。
我要提取的指标是:
声明之后的分配数量,
Control 之后的声明(例如 i < count、for、while、if、switch 等)
嵌套迭代发生的次数
嵌套选择发生的次数等。
解决方案
推荐阅读
- reactjs - 代码拆分 - 主包具有相同的大小,有和没有拆分成块
- r - 单击地图上的标记以在 R 闪亮上显示 2 个 ggplot 图表
- c# - 替换鼠标操作后,每个其他窗口都会冻结 - c#
- c# - Android 应用程序:在 Unity 中使用 WCF
- maven - 与 maven-rpm-plugin 共享常用脚本函数
- opencv - opencv透视变换然后一步顺时针旋转90度
- java - 是否应该使用 HTTP 代码来表示业务失败?
- c - 关于生成可能的有序对并找到对的二进制操作的最大值的代码
- xquery - XQuery - 用文本值替换空元素(输出到 HTML)
- android - 为 Amazon Fire HD 7 设置 Cordova