我需要一个 Java 代码来将 C 程序转换为控制流图。
有人可以帮我解决吗?
7 月 12日将是一个艰难的最后期限,但你可以做到。
如果我自己完成这个项目,我会使用以下一般策略:
n
遍历 AST,为每个函数声明创建一个图节点。将 (函数名, n
) 添加到地图中。if
/else
if
后面没有else
。goto
switch
break
范围内switch
。do
... while
、while
和for
.break
在一个循环内continue
在一个循环内return
void
函数定义结束(否return
)int main()
和的结尾,int main(int, char**)
不需要return
exit
您可能想要使用这个测试程序,我认为它具有所有“特殊”情况:
#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;
}
我还将使用以下开源库: