我知道我可以通过引用复制函数,但我想了解以下代码中导致段错误的原因。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int return0()
{
return 0;
}
int main()
{
int (*r0c)(void) = malloc(100);
memcpy(r0c, return0, 100);
printf("Address of r0c is: %x\n", r0c);
printf("copied is: %d\n", (*r0c)());
return 0;
}
这是我认为应该奏效的心理模型。
进程拥有r0c分配的内存。我们从相应于return0的数据段中复制数据,复制成功。
我认为解引用函数指针与调用函数指针所指向的数据段相同。如果是这样的话,那么指令指针应该移动到相应于r0c的数据段,其中将包含函数return0的指令。对应于return0的二进制代码不包含任何跳转或函数调用,这些都取决于return0的地址,因此它应该只返回0并恢复ip... 100字节当然足够存储函数指针,而0xc3也在r0c的范围内(它位于第11个字节)。
那么为什么会出现分段错误呢?这是C函数指针语义的误解,还是有一些我不知道的防止自修改代码的安全功能?
printf("Address of r0c is: %x\n", r0c);
的定义不明确。 - chux - Reinstate Monica