【发布时间】:2022-08-19 16:25:28
【问题描述】:
我想测试一下我对函数指针的想法。我写了一个测试,但它不起作用(导致Segmentation fault)。这是我的简化测试:
#include<stdlib.h>
void a(){}
void b(){}
int main(){
size_t s=0;
char* p1=(char*)&a;
char* p2=(char*)&b;
while(*p1++==*p2++) s++;
void (*o)();
char* c=malloc(s);
while(s--) *(c+s)=*((char*)&a+s);
o=(void(*)())c;
o();
return 0;
}
代码应该复制一个空函数的机器代码(这里如果在两个空函数的地址处找到数据的交集并复制它)并运行复制。
感谢您伸出援手。
-
\"测试我的想法\"。什么想法?该代码应该做什么?
-
对不起。我首先将其包含在问题中,然后将其删除。它应该复制机器代码(在这种情况下可能只是 RET)并运行它。
-
请edit 使用任何对理解问题至关重要的信息更新该帖子。
-
你至少应该做一些合理性检查。例如,是
s > 0?为什么你认为你可以运行分配在数据内存中的任意机器代码?您听说过现代保护计划吗? -
您想将代码从函数复制到您在堆上分配的内存中。您不应该期望该内存范围是可执行的。我会假设任何最近的操作系统都不允许从这样的内存区域执行代码。
标签: c casting function-pointers