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

时间:2014-12-11 10:38:18

标签: clang llvm genetic-programming mutation-testing

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

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

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

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

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

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

由于 亚历

1 个答案:

答案 0 :(得分:2)

非常有趣的问题。我一直对二进制级遗传编程的可能性感到好奇。关于你的要求:

从他们的文档中可以明显看出,LLVM-mutate无法满足您的要求。但是,我认为不这样做是明智的。我的理由是,任何机器语言遗传程序都不可避免地会遇到"Halting Problem",例如不可能知道随机生成的指令是否会完全崩溃整个计算机(例如,通过为OS保留的指针赋值),或者它可能永远运行并占用所有CPU周期。图灵定理告诉我们,如果给定的程序能够做到这一点,就不可能事先知道。请注意,LLVM-mutate可以导致一个完全无害的程序仍然崩溃或永远运行,但我认为他们的方法仅通过采用现有指令使其不太可能。

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

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

但有些可能存在的问题:

  • 考虑到可能的可变性,唯一的方法就是 可接受的执行时间将是大量的 计算能力。可能在云端或使用GPU实现。

  • 你仍然要与图灵先生的停机问题抗争。 但是我认为这可以通过运行解决方案来解决 "沙盒"如果解决方案爆炸,这并没有让你失望: 类似于一次性虚拟机或类似Docker的东西 容器,有时间限制(摆脱无限循环)。一个 崩溃或超时的解决方案会变得最糟糕 健身,这样程序就会偏离那些程序 路径。

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

我认为这里有一个潜在的开源项目。这将是疯狂的,危险的和时间吸引的漩涡:只是我的那种项目。如果有人这样做,请指望我。

相关问题