使用这个答案(和这个后续)作为灵感,我正在寻找在C语言中实现一些函数式编程的方法(对此网站上已经有了很多有趣的讨论)。我想知道的是如何以及何时可以使用链接代码中的方法,将字符串转换为函数指针并执行它。例如,在我的机器(OSX 10.10、Darwin 14.0.0、GCC 4.8.3)上,我可以编译并运行。
int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();
(一直返回0,如果程序不做其他事情,这是我所期望的)但是
#include <stdio.h>
int main() {
const char* lol = "\x8b\x5c\x24\x4\x3d\xe8\x3\x0\x0\x7e\x2\x31\xc0\x83\xf8\x64\x7d\x6\x40\x53\xff\xd3\x5b\xc3\xc3 <- Recursively calls the function at address lol.";
int i = ((int(*)())(lol))(lol);
printf("i: %d\n",i);
return 0;
}
程序崩溃。另一方面,Codepad成功运行了第二个例子,给出了正确的答案i: 100
。
什么情况下可以从字符串中执行代码?是否有方法使其(相对)一致?
(我可以合理猜测这是未定义的行为,我知道我将通过使用它增加全球失业率。)