RET之后的指令总是CALL之后的指令吗?
发布时间:2020-12-16 06:59:12 所属栏目:百科 来源:网络整理
导读:在一个表现良好的C程序中,return语句(RET)是否总是返回CALL语句后面的指令?我知道这是默认设置,但我想检查是否有人知道或记住这个标准不适用的情况的真实例子(常见的编译器优化或其他东西……).有人告诉我,它可能发生在一个函数指针(函数指针将值放在堆栈上
在一个表现良好的C程序中,return语句(RET)是否总是返回CALL语句后面的指令?我知道这是默认设置,但我想检查是否有人知道或记住这个标准不适用的情况的真实例子(常见的编译器优化或其他东西……).有人告诉我,它可能发生在一个函数指针(函数指针将值放在堆栈上,而不是CALL …我搜索它但我没有看到任何解释).
让我试着更好地解释我的问题.我知道我们可以使用其他结构来改变执行流程(包括操作堆栈)……我知道如果我们更改写在堆栈上的返回地址,执行流程将更改为堆栈上写入的地址.我需要知道的是:是否存在任何不寻常的执行情况,其中下一条指令不是跟随CALL的指令?我的意思是,我希望确保它不会发生,除非出现意外情况(如内存访问冲突导致结构化异常处理程序). 我担心的是,商业应用程序总体上是否总是遵循上述模式.请注意,在这种情况下,我有一个例外的固定(重要的是要知道它们是否存在于这种情况下,对于我正在发展为M. Sc.程序的学科的研究项目).我知道,例如,编译器有时可以将RET更改为JMP(尾调用优化).我想知道这样的事情是否会改变RET之后执行的指令的顺序,主要是,如果CALL总是在RET之后执行的指令之前. 解决方法
一个“表现良好”的C程序可以由编译器转换为不遵循这种模式的程序.例如,出于混淆的原因,代码可以使用push / ret组合而不是jmp.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |