gpt4 book ai didi

c - 在 C : sending func pointers, 中调用 func,使用 EIP、jmp_buf 和 longjmp

转载 作者:行者123 更新时间:2023-12-04 11:50:05 24 4
gpt4 key购买 nike

我需要确保我首先了解一些基本知识:

  1. 如何将函数 A 作为参数传递给函数 B?
  2. 如何从 B 内部调用函数 A?

现在是重头戏:

我正在尝试按照以下方式做一些事情:

jmp_buf buf;
buf.__jmpbuf[JB_PC] = functionA;
longjmp(buf,10);

意思是我想使用longjmp 来执行一个函数。我应该怎么做?

最佳答案

您需要使用指向函数的指针。声明函数指针的语法是:

rettype (*)(paramtype1,paramtype2,...,paramtypeN)

因此,例如,我们可能有以下代码:

char functionA(int x)
{
printf("%d\n",x):
return 'a';
}

char functionB(char (*f)(int), int val)
{
return f(val); // invokes the function pointer
}

int main(int argc, char* argv[])
{
char result = functionB(&functionA,3); // prints "3"
printf("%c\n",result); // prints 'a'
return 0;
}

另外,附带说明,虽然 &functionA 获取函数 A 的地址,但实际上没有必要在那里使用 & 符号……我个人这样做,因为我认为它更清楚地表明它是一个函数指针.您可以使用与调用函数时相同的语法来调用函数指针。

至于使用跳转缓冲区,我相信你所做的是不可靠的。如果您想在调用某个函数之前创建一个跳转缓冲区并调用 setjmp,然后稍后调用 longjmp 以便您立即返回到调用之前,那么这是明确定义的。不过,jmp_buf 的实际定义和结构是特定于实现的。它必须满足某些要求(例如,它必须是数组类型,因为 setjmp 必须能够按值获取并修改它),但除此之外,specification for setjmp.h没有定义jmp_buf的结构。因此,任何试图直接操纵 jmp_buf 的东西都将特定于特定平台。

关于c - 在 C : sending func pointers, 中调用 func,使用 EIP、jmp_buf 和 longjmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2855746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com