-3

我需要一个 Java 代码来将 C 程序转换为控制流图。

有人可以帮我解决吗?

4

1 回答 1

2

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

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

  1. 预处理输入 C 文件(也称为翻译单元)。这会生成预处理的翻译单元
  2. 将预处理的翻译单元解析为抽象语法树 (AST)。
  3. n遍历 AST,为每个函数声明创建一个图节点。将 (函数名, 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 格式输出图形。

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

#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. ANTLRANTLR C 语法一起解析
  3. Grappa用于图形数据结构和图形绘制(如果需要)
于 2010-06-21T19:36:57.827 回答