RET之后的指令总是CALL之后的指令吗?

RET之后的指令总是CALL之后的指令吗?,第1张

概述在一个表现良好的C程序中,return语句(RET)是否总是返回CALL语句后面的指令?我知道这是默认设置,但我想检查是否有人知道或记住这个标准不适用的情况的真实例子(常见的编译器优化或其他东西……).有人告诉我,它可能发生在一个函数指针(函数指针将值放在堆栈上,而不是CALL …我搜索它但我没有看到任何解释). 让我试着更好地解释我的问题.我知道我们可以使用其他结构来改变执行流程(包括 *** 作堆栈) 在一个表现良好的C程序中,return语句(RET)是否总是返回CALL语句后面的指令?我知道这是默认设置,但我想检查是否有人知道或记住这个标准不适用的情况的真实例子(常见的编译器优化或其他东西……).有人告诉我,它可能发生在一个函数指针(函数指针将值放在堆栈上,而不是CALL …我搜索它但我没有看到任何解释).

让我试着更好地解释我的问题.我知道我们可以使用其他结构来改变执行流程(包括 *** 作堆栈)……我知道如果我们更改写在堆栈上的返回地址,执行流程将更改为堆栈上写入的地址.我需要知道的是:是否存在任何不寻常的执行情况,其中下一条指令不是跟随CALL的指令?我的意思是,我希望确保它不会发生,除非出现意外情况(如内存访问冲突导致结构化异常处理程序).

我担心的是,商业应用程序总体上是否总是遵循上述模式.请注意,在这种情况下,我有一个例外的固定(重要的是要知道它们是否存在于这种情况下,对于我正在发展为M. Sc.程序的学科的研究项目).我知道,例如,编译器有时可以将RET更改为JMP(尾调用优化).我想知道这样的事情是否会改变RET之后执行的指令的顺序,主要是,如果CALL总是在RET之后执行的指令之前.

解决方法 一个“表现良好”的C程序可以由编译器转换为不遵循这种模式的程序.例如,出于混淆的原因,代码可以使用push / ret组合而不是jmp. 总结

以上是内存溢出为你收集整理的RET之后的指令总是CALL之后的指令吗?全部内容,希望文章能够帮你解决RET之后的指令总是CALL之后的指令吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存