用于将C程序转换为控制流图的Java代码

时间:2010-06-20 15:48:22

标签: java c static-analysis control-flow

我需要一个用于将C程序转换为控制流图的java代码。

任何人都可以帮我解决一下吗?

1 个答案:

答案 0 :(得分:1)

7月12日 th 将是一个艰难的最后期限,但你可以做到。

如果我自己完成这个项目,我会使用以下的一般策略:

  1. 预处理输入C文件(也称为翻译单元)。这将生成预处理翻译单元
  2. 将预处理的翻译单元解析为抽象语法树(AST)。
  3. 遍历AST,为每个函数声明创建一个图形节点n。将(函数名称n)添加到地图中。
  4. 遍历AST,构建控制流程图。考虑如何在控制流图中表示以下特殊情况:
    • 标记语句
    • if / else
    • if后面没有else
    • goto
    • switch
    • break内的堕落案例和switch
    • do ... whilewhilefor等循环。
    • 循环中
    • break
    • 循环中
    • continue
    • return
    • 常规函数调用
    • 调用函数指针的目标
    • void函数定义的结尾(无return
    • int main()int main(int, char**)的结尾,不需要return
    • exit
    • 中级值
  5. DOT format
  6. 中输出图表

    您可能想要使用此测试程序,我认为该程序具有所有“特殊”情况:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void usage(const char *arg0)
    {
        fprintf(stderr, "Usage: %s [INTEGER]\n", arg0);
        fprintf(stderr, "Dummy program\n");
        exit(EXIT_FAILURE);
    }
    
    int g_a;
    
    void init()
    {
        g_a = 3;
    }
    
    int return_4()
    {
        return 4;
    }
    
    void uninit()
    {
    }
    
    int main(int argc, char **argv)
    {
        if (argc <= 1) {
            usage(argv[0]);
        }
    
        if (argc > 2) {
            printf("You only need to pass one argument.\n");
        }
        else {
            init();
        }
    
        const int i = atoi(argv[1]);
        int j;
    before_switch: j = 0;
    switch_i: switch (i) {
            case 3:
                for(; j < 3; ++j)
                    printf(".");
            case 17:
                for(; j < 17; ++j)
                    printf(".");
                if (i == 3 || i == 17)
                    printf("\n");
            case -4:
                printf("You picked one of my favorite numbers (17, 3, and -4)!\n");
                break;
    
            case -1:
                printf("Cleaning up\n");
                goto cleanup;
    
            default:
                printf("I don't like that number.\n");
        }
    
        j = 0;
    do_loop_1: do {
            if (j++ % 2 == 0)
                continue;
            if (j == 10)
                break;
    
            printf("j is %d.\n", j);
        } while(j < 30);
    
        j = 10;
        while (j > 0) {
            if (4 == return_4())
                break;
            --j;
        }
    
        void (*voidFn)() = &uninit;
        voidFn();
        init();
    
    cleanup:
        uninit();
        return EXIT_SUCCESS;
    }
    

    我还会使用以下开源库:

    1. JCPP,C预处理器的纯Java实现,用于预处理翻译单元
    2. ANTLR用于解析ANTLR C grammar
    3. Grappa用于图形数据结构和图形绘制(如果需要)