Linux 如何比较两个程序依赖图?

Linux 如何比较两个程序依赖图?,linux,image-processing,graph,ocaml,frama-c,Linux,Image Processing,Graph,Ocaml,Frama C,这是一个示例程序依赖关系图** 这是生成上图的代码。我想比较这两种类型的图形,有没有什么方法可以比较这些图形的相似性百分比。我也在考虑比较图形的图像以获得相似性百分比,请建议我如何做 digraph cfg { subgraph cluster_sum { graph [label="sum"]; s1[label="i = 0;"]; s1 -> s2; s2[label="sum_0 = 0;"]; s2 -> s3; s3[label="i = x;"]; s3 ->

这是一个示例程序依赖关系图**

这是生成上图的代码。我想比较这两种类型的图形,有没有什么方法可以比较这些图形的相似性百分比。我也在考虑比较图形的图像以获得相似性百分比,请建议我如何做

digraph cfg {
subgraph cluster_sum {
graph [label="sum"];
s1[label="i = 0;"];
s1 -> s2;
s2[label="sum_0 = 0;"];
s2 -> s3;
s3[label="i = x;"];
s3 -> s4;
s4[label="<loop>"];
s4 -> s6;
s6[label="if i <= y"];
s6 -> s8;
s6 -> s7;
s7[label="<break>"];
s7 -> s11;
s8[label="<enter block>"];
s8 -> s9;
s9[label="sum_0 -= i;"];
s9 -> s10;
s10[label="i ++;"];
s10 -> s4;
s11[label="<return>"];
}
subgraph cluster_main {
  graph [label="main"];
  s13[label="res = 0;"];
  s13 -> s14;
  s14[label="a = 2;"];
  s14 -> s15;
  s15[label="b = 5;"];
  s15 -> s16;
  s16[label="res = sum(a,b);"];
  s16 -> s17;
  s17[label="printf(\"%d\",res);"];
  s17 -> s18;
  s18[label="__retres = 0;"];
  s18 -> s21;
  s21[label="<return>"];
  }
  }
有向图{ 子图簇和{ 图[label=“sum”]; s1[label=“i=0;”; s1->s2; s2[label=“sum_0=0;”; s2->s3; s3[label=“i=x;”; s3->s4; s4[标签=”]; s4->s6;
s6[label=“如果我那么,一般来说,这是一个开放且无法解决的问题。你可以使用抽象解释来评估两个程序并比较结果。但我认为你并不期待这个答案

最简单的方法是将图形(可以使用
ocamlgraph
library在OCaml中读取)转换为规范化形式,其中删除所有语法差异(例如,使用通用命名方案重命名所有变量或用正则表达式替换所有变量),然后可以根据比较函数比较结果图

当然,这只是一个技巧。对于更复杂的问题,你应该修几门程序分析课程,写一篇论文,然后回答自己,一般来说这是无法解决的……但最终,你会写出类似的东西


关于比较两幅图像,我认为这是一种更粗糙的方法。但通常的方法是进行2D卷积,这将返回相等的度量。OCaml
fftw
库提供了您所需的一切。

通过查看渲染图像来比较图形的方法是不好的:Graphviz取代了节点自由且基本上均匀,只需对图进行轻微修改

您应该以更代数的方式比较图形,但算法将高度依赖于您如何定义“相似性”。如果我是您,我会尝试树的编辑距离。我最近使用它来测量OCaml类型表达式的“相似性”(是的,它们的AST基本上是树,但可以有循环)并得到了一个很好的结果。你应该能够找到大量的信息,通过搜索“编辑树的距离”

程序执行流有循环,因此它们可能应该作为一般有向图而不是循环数很少的树进行比较。我相信应该有一些专门针对它的研究工作,但我一点也不了解

对于实现,我从未尝试过,但OCamlDot()可用于解析点文件格式,以获得图形的代数表示