小编A.S*_*A.S的帖子

带有函数指针的Memcpy会导致段错误

我知道我可以通过引用复制该函数,但我想了解以下代码中发生的段错误.

#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;
}
Run Code Online (Sandbox Code Playgroud)

这是我认为应该起作用的心理模型.

该进程拥有分配给r0c的内存.我们正在复制与return0对应的数据段中的数据,并且复制成功.

我认为解除引用函数指针与调用函数指针指向的数据段相同.如果是这种情况,那么指令指针应该移动到对应于r0c的数据段,其中包含函数return0的指令.对应于return0的二进制代码不包含任何依赖于return0的地址的跳转或函数调用,所以它应该只返回0并且恢复ip ... 100个字节对于函数指针肯定已经足够了,并且0xc3很好在r0c的范围内(它在字节11处).

那么为什么分段错误呢?这是对C函数指针的语义的误解,还是有一些安全功能阻止了我不知道的自修改代码?

c pointers self-modifying

3
推荐指数
1
解决办法
423
查看次数

标签 统计

c ×1

pointers ×1

self-modifying ×1