6

是否有任何论文描述了从编译程序中推断子程序的任何算法/技术?换句话说:是否有一种算法可以找到在程序中出现多次的代码块?这些块可以重新排序指令(当然没有程序行为改变),以便更有可能找到匹配项。

这个过程可以看作与编译器为避免调用而完成的子例程内联相反,但会增加二进制大小。

在我看来,这是一个非常困难的理论问题。

4

3 回答 3

6

嗯,这是一个有趣的问题。人们确实在这方面工作。快速搜索会返回这两个:

但可能还有更多。您可以使用Google Scholar查找更多引用这些旧论文的最新论文。

于 2011-12-06T22:02:59.270 回答
3

您正在寻找的东西称为“克隆检测器”。您可以在源代码或目标代码上执行此操作。关键思想是决定您想要接受哪些可变点。

您可以阅读我们的 CloneDR克隆检测器,该检测器通过比较源文件的语法树、查找精确匹配和未命中匹配来查找重复代码。它跨越许多文件,而不仅仅是在一个源文件中。这有点像“公共子表达式”检测,但它适用于声明以及可执行代码。当匹配不准确时,它可以确定“子程序”(抽象)的参数。

有关算法描述,请参阅我关于使用抽象语法树进行克隆检测的论文。

CloneDR 使用语言精确的前端解析器为多种语言执行此操作。

该站点描述了 CloneDR 的工作原理,并将 CloneDR 与许多其他克隆检测工具进行了比较。

CloneDR 不处理“指令重新排序”。通过比较 PDG 来查找重复项的可扩展性较差的方法可以做到这一点。这些非常接近于比较数据流图,这可能有助于查找机器指令代码匹配。

于 2011-12-07T00:39:42.917 回答
-1

也许这很愚蠢..但考虑“差异”。它基本上是一个受限版本。

于 2011-12-23T13:32:23.887 回答