linux - 我们如何比较两个程序的依赖关系图?

标签 linux image-processing graph ocaml frama-c

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

Dependency graph

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

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>"];
  }
  }

最佳答案

嗯,总的来说它是一个开放无解的?问题。您可以使用抽象解释评估这两个程序并比较结果。但我不认为你期待这个答案。

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

但这当然只是一个 hack。为了更复杂,你应该学习几门程序分析类(class),写一篇论文,然后自己回答,一般来说它是无法解决的......但最终,你会写出类似BinDiff的东西。 .

什么比较两张图,那我觉得是更粗暴的hack。但通常的方法是进行 2D 卷积,这将返回平等的衡量标准。 OCaml fftw 库拥有您需要的一切。

关于linux - 我们如何比较两个程序的依赖关系图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28700531/

相关文章:

python - 从图像中去除虚假文本区域

python - 查找草率手绘矩形的属性

search - 为什么D* Lite需要反向遍历图?

math - 如果添加新边,图的强连通分量的数量如何变化

graph - 旅行推销员和中国旅行有什么区别?

linux - 如何使用fprintf在matlab中多次输出一个字符到一个文件

linux - Unity 游戏服务器未在 Linux 上运行

linux - 在 docker linux 容器上安装 netstat

javascript - Electron TrayIcon 在 Linux 上无法正常工作

python - 栅格写入 GeoTiff 时缺少空间引用