【发布时间】:2019-06-05 07:56:01
【问题描述】:
我想修改以下函数,以便可以跳过主函数中的行:x='b'。
#include <stdio.h>
void function (int a, int b, int c) {
int i, j;
char buf[5];
char buffer1[12];
int *ret;
}
int main() {
char x;
x = 'a';
printf ("Hello\n");
printf ("I am going to skip a statement\n");
function(1,2,3);
x = 'b';
printf ("By");
printf("The following value must be the a letter: %c\n",x);
}
我尝试获取返回地址并使用 `ret' 变量添加必要的字节,但似乎不正确。
ret=buffer1+12+4+1;
(*ret)+=4;
无论如何 x='b' 仍然被执行。
【问题讨论】:
-
这些都没有任何意义。我什至不明白您要做什么...您是否以某种方式假设 C 指令等同于汇编程序指令?
-
你的目的是什么?编译器将始终正确处理它,因为始终生成代码以正确从函数返回是它的作用。
-
顺便说一句,用C手动设置PC是不可能的,所以你不能通过计算相对地址来跳过指令。您必须为此使用汇编程序。
-
这是相当不正当的,因为语言并不真正支持它。您可以尝试
setjmp、longjmp、内联汇编等。 &C。但那是“狡猾的”C。 -
给大家的信息:当一个 C 函数被调用时,返回地址被压入堆栈(除了可能不是的六个原因)。 OP 的代码尝试修改堆栈上的返回地址,以便返回地址指向
printf("By");而不是x = 'b';。这行不通的原因至少有十几个,但如果一个人了解它可能行不通的所有原因,就可以做到。