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

Clang 基于llvm的遗传程序代码变异?,clang,llvm,genetic-programming,mutation-testing,Clang,Llvm,Genetic Programming,Mutation Testing,对于遗传编程的研究,我想在llvm的基础上实现一个进化系统,并应用代码突变(可能在IR级别) 我发现执行点突变非常有用。 据我所知,指令得到计数/编号,然后可以删除一条编号的指令 然而,作为代码中可用的语句之一,引入新指令似乎是可能的。 然而,真正的变异将允许插入任何被允许的IR指令,而不管它是否被用于待变异的代码中。 此外,应该可以插入链接库的库函数调用(当前代码中未使用,但可能可用,因为库已在clang中链接) 我是否在llvm突变中忽略了这一点,或者到目前为止这真的不可能 是否有任何项目试

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

我发现执行点突变非常有用。 据我所知,指令得到计数/编号,然后可以删除一条编号的指令

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

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

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

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

谢谢
亚历克斯问了一个很有趣的问题。一段时间以来,我一直对做二进制遗传编程的可能性很感兴趣。关于你的问题:

从他们的文档中可以明显看出,LLVM mutate无法满足您的要求。然而,我认为不这样做是明智的。我的推理是,任何机器语言遗传程序都不可避免地会面临这样的问题,例如,不可能知道随机生成的指令是否会使整个计算机完全崩溃(例如,通过给OS保留指针赋值),或者它可能永远运行并占用所有CPU周期。图灵定理告诉我们,不可能事先知道给定的程序是否会这样做。请注意,LLVM mutate可能会导致一个完全无害的程序仍然崩溃或永远运行,但我认为他们的方法通过只接受现有指令来降低这种可能性

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

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

但可能存在一些问题:

  • 考虑到可能的变化量,只有 可接受的执行时间是有大量的 计算能力。可能在云中或使用GPU实现

  • 你还得面对图灵先生的犹豫问题。 但是,我认为这可以通过在 “沙箱”在解决方案爆炸时不会让您倒下: 类似于一次性虚拟机或Docker之类的东西 容器,具有时间限制(以摆脱无限循环)。A. 崩溃或超时的解决方案将得到最坏的结果 健身,这样的计划将倾向于偏离这些 路径

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


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

你最后尝试过这个吗?据我所知,没有人这样做过。我确实找到了slash/A,这是对非基于AST的遗传编程的不同理解。