我是一名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
嵌套迭代发生的次数
发生嵌套选择的次数等。