首页 > 解决方案 > 如何从 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 等)

嵌套迭代发生的次数

嵌套选择发生的次数等。

标签: cmetricsframa-c

解决方案


推荐阅读