如何从Frama-C的依赖图中提取特征/度量

时间:2019-07-13 10:21:43

标签: c metrics 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      

嵌套迭代发生的次数

     

发生嵌套选择的次数等。

0 个答案:

没有答案