C プログラムを制御フロー グラフに変換するための Java コードが必要です。
誰でも私を助けてくれませんか?
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;
}
また、次のオープン ソース ライブラリも使用します。