基于llvm的遗传编程代码变异?

ale*_*lex 11 genetic-programming llvm clang mutation-testing

对于遗传编程的研究,我想在llvm的基础上实现一个进化系统并应用代码突变(可能在IR级别).

我发现了llvm-mutate,这是非常有用的执行点突变.据我所知,指令得到计数/编号,然后可以删除编号的指令.

但是,作为代码中的可用语句之一,似乎可以引入新指令.然而,真正的突变将允许插入任何允许的IR指令,而不管它是否在要变异的代码中使用.此外,应该可以插入链接库的库函数调用(不在当前代码中使用,但可能可用,因为lib已在clang中链接).

我是否在llvm-mutate中忽略了这一点,或者到目前为止真的不可能?

是否有任何项目试图/已经为llvm实施(ed)此类突变?

llvm有许多代码分析工具,应该允许实现上述方法.llvm很大,所以我有点迷失方向.任何提示哪些工具可能有用(例如获取可用库函数列表等)?

谢谢Alex

Mil*_*dez 3

非常有趣的问题。一段时间以来,我对进行二进制级遗传编程的可能性很感兴趣。关于你所问的问题:

从他们的文档中可以明显看出 LLVM-change 无法完成您所要求的操作。不过,我认为不这样做是明智的。我的推理是,任何机器语言遗传程序都将不可避免地面临“停机问题”,例如,不可能知道随机生成的指令是否会完全崩溃整个计算机(例如,通过为操作系统保留的值赋值)指针),否则它可能会永远运行并占用您的所有 CPU 周期。图灵的理论告诉我们,不可能提前知道给定的程序是否会这样做。请注意,LLVM 更改可能会导致完全无害的程序仍然崩溃或永远运行,但我认为他们的方法通过仅采用现有指令来降低这种可能性。

然而,“不可能”这样的事情只会阻止科学家,而不是工程师:-)...

我一直在想的是:本质上,真正的突变的工作方式更像是 LLVM 突变,就像我们在正常的遗传编程中所做的那样。换句话说,它们只是从非常有限的集合(A、T、C、G)中交换字母,并且每种可能的变化都由此产生。我们可以拥有一个程序或一组程序,其中包含一组初始指令,以及一组在程序中链接或定义的“可能的功能”。大多数这些功能不会被实际使用,但它们会为突变提供“原始 DNA”,就像我们的 DNA一样。这组函数将具有问题空间的完整(或半完整)可能函数集。然后,我们只需使用 LLVM-change 中的基本操作即可。

但可能存在一些问题:

  • 考虑到可能的变化量,获得可接受的执行时间的唯一方法是拥有大量的计算能力。可能可以在云端或使用 GPU 来实现。

  • 你还是得跟先生较劲。图灵的停机问题。不过,我认为这可以通过在“沙盒”中运行解决方案来解决,如果解决方案崩溃,也不会导致您崩溃:像一次性虚拟机或类似 Docker 的容器之类的东西,有时间限制(到摆脱无限循环)。崩溃或超时的解决方案将获得最差的适应性,因此程序往往会偏离这些路径。

至于为什么要这样做,我可以看到许多有趣的应用程序:自我修复程序、针对特定环境进行自我优化的程序、针对漏洞、变异病毒、质量保证的程序“疫苗接种”等。

我认为这里有一个潜在的开源项目。这将是疯狂、危险和耗时的漩涡:这只是我的项目。如果有人这样做,算我一个。