12

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

我发现llvm-mutate执行点突变非常有用。据我了解,指令被计数/编号,然后可以例如删除编号指令。

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

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

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

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

谢谢亚历克斯

4

1 回答 1

3

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

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

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

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

一些可能的问题:

  • 考虑到可能的可变性,获得可接受的执行时间的唯一方法是拥有大量的计算能力。可能在云中或通过 GPU 实现。

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

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

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

于 2016-07-20T16:01:07.523 回答