Control Flow Basedなdiffをとりたかった。[終]
もう随分前に作ったのに何も書いていなかった……
github.com
とりあえず作ったのはいいものの、(色々な意味で)これ業務で使うわけにはいかないよなぁ……となったのでお蔵入りです。
できること
こんな感じで比較できます。
/* bef.c */ #include <stdio.h> #include <stdlib.h> int main() { int type; type = rand() % 4; if (type == 1) { printf("hoge()"); printf("fuga()"); } else { printf("piyo()"); printf("poyo()"); } printf("foo()"); printf("bar()"); return 0; }
/* aft.c */ #include <stdio.h> #include <stdlib.h> int main() { int type; type = rand() % 4; switch (type) { case 1: printf("hoge()"); // oops break; case 2: printf("newHoge()"); break; default: printf("piyo()"); printf("poyo()"); break; } printf("foo()"); printf("bar()"); return 0; }
$ ./cfbdiff bef.c aft.c Function: "main" block deleted: printf ("hoge()"); printf ("fuga()"); Function: "main" block added: printf ("newHoge()"); Function: "main" block added: printf ("hoge()");
やっていること
GCCの-fdump-tree-cfgオプションで吐き出されるファイルをアドホックにゴリゴリの解析しているだけです。比較はBasic Block(参考: 基本ブロック - Wikipedia)の内容をハッシュ化することで行い、前後のBasic Block集合で片方にしか存在しないものを出力しています。
一応グラフとしての構造も持たせてはいるのですが、現状使っていません。図として出力したいとなったら使いますが、今のところそれはない見込み。