在调用者的返回序列中跳过函数

2023-12-20

在一系列函数调用中,例如

                main() --> A() --> B()-->C();

当被调用函数完成时,它通常返回到调用函数,例如C()返回到B(),这将返回到A(), etc.

我想知道是否也可以直接返回到调用序列中较早的函数 所以C()还给main()并跳过B() and A()

如果可能的话我该怎么做?您能解释一下它是如何工作的以及何时在现实中使用吗?

这是我的代码

#include <stdio.h>
int A(void);
int B(void);
void main(void )
{
    A();
}

int A()
{ 
    printf("enter A()\n");
    B();
    printf("exit A()\n");
}

int B()
{
    printf("enter B()\n");
    printf("exit B()\n");
}

我想跳过返回功能A() from B()所以这样printf("exit A()\n");不会执行并给我这个结果:

enter A()                                                                                                                  
enter B()                                                                                                                  
exit B() 

在一切之前检查@PeterCordes 不仅仅以一种方式回答了这个问题

好吧,让我们开始吧:

这种类型的事情可以使用称为long jump所以编辑后你的代码将如下所示:

#include <stdio.h>
#include <setjmp.h>//c standard library header
jmp_buf env; // for saving longjmp environment
main()
{
    int r, a=100;
    printf("call setjmp to save environment\n");
    if ((r=setjmp(env)) == 0){
        A();
        printf("normal return\n");
    }
    else
        printf("back to main() via long jump, r=%d a=%d\n", r, a);
}
int A()
{ 
    printf("enter A()\n");
    B();
    printf("exit A()\n");
}
int B()
{
    printf("enter B()\n");
    printf("long jump? (y|n) ");
    if (getchar()=='y')
    longjmp(env, 1234);
    printf("exit B()\n");
}

让我们了解一下刚刚发生了什么

在上面的程序中,setjmp()将当前执行环境保存在jmp_buf结构和returns 0.

程序继续调用A(),这称为B().

尽管 在函数中B(),如果用户选择不返回long jump,函数将 显示正常的返回顺序。

如果用户选择返回longjmp(env,1234), 执行将返回到最后保存的环境nonzero value.

在 这种情况,会导致B()返回到main()直接绕过A().

原理long jump很简单。当一个函数完成时,它返回

(caller_EIP, caller_EBP)在当前堆栈帧中, 如果我们更换(caller_EIP, caller_EBP) with

(saved_EIP, saved_EBP)较早函数的 在调用序列中,执行将直接返回到该函数。

此外 到(saved_EIP, saved_EBP), setjmp()还可以保存CPU的通用寄存器和 原来的ESP, 以便longjmp()可以恢复返回的完整环境 功能。

长跳转可用于中止调用序列中的函数,从而导致 从先前保存的已知环境恢复执行。

虽然很少使用 在用户模式程序中,这是系统编程中的常用技术。

例如, 它可以用在信号捕捉器中来绕过导致的用户模式功能 异常或陷阱错误。

你可以检查this http://www.cplusplus.com/reference/csetjmp/longjmp/也不错

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在调用者的返回序列中跳过函数 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重

随机推荐

  • 特征可以用于枚举类型吗?

    我通读了特质文档 https doc rust lang org rust by example trait html并找到了在结构上使用特征的简洁定义 是否可以使用特征enum类型 我看到过一些答案说 不 但它们已经 3 岁了 并没有完全
  • 强制 QMediaPlayer 为视频擦除应用程序准确更新位置?

    我正在编写一个应用程序 允许用户浏览打开的视频 使用 Qt 5 3 在 Windows 7 8 上进行开发 我一直在使用QMediaPlayer and QVideoWidget遵循qvideowidget示例项目 结果已经很不错了 除了Q
  • SQL在同一个表中多次自动递增

    我在为我的一个朋友设计的网站上有一个内置管理面板的基本 HTML 输入表单 他的想法是 将用 PHP 编写的数据发布到数据库中 然后将其返回到索引页上 问题 每个条目显然在数据库中都有自己的列 id name ep num 等 id 自动递
  • nginx 模块中是否有向多个服务器发送(广播)单个请求的功能

    nginx 模块中是否有向多个服务器广播单个请求的功能 我的要求是我需要一个 nginx 模块 它可以向多个服务器发送单个请求 一般来说广播该请求 在等待响应一段时间 例如 5 毫秒 后 它从不同的服务器获得响应要么组合在一起并发送给客户端
  • PHP PEAR 容器错误

    好吧 这是我第一次在这里提问 我的问题很尴尬 也很难弄清楚 故事是这样的 我有一个小系统 它发送大量电子邮件邀请 不是垃圾邮件 所以 明智的做法是 我不使用 PHP 函数 mail 我使用 PEAR 类 如 Mail Mail Queue
  • 调整 Vaadin 图像大小

    我正在将文件中的图像插入到用户界面中 我通过以下方式在 Vaadin 7 6 8 中创建它these https vaadin com docs part framework application application resource
  • C 中的二进制补码加法溢出

    我在 C 中看到一个有缺陷的代码 用于检查加法是否会导致溢出 它可以很好地与char 但当参数是时给出错误的答案int我不明白为什么 这是代码short论据 short add ok short x short y short sum x
  • 多行 UILabel 上的自动收缩

    是否可以在多行上联合使用 autoshrink 属性UILabel 例如 2 行可用的大文本大小 我找到了这个链接http beckyhansmeyer com 2015 04 09 autoshrinking text in a mult
  • 以编程方式为 iPhone 创建 x509 证书,而不使用 OpenSSL

    有没有一种方法可以仅使用 Apple 安全框架以编程方式在 iPhone 应用程序中创建自签名证书 即不必搞乱 OpenSSL 吗 如果没有 openSSL 或 RSA 库 这似乎是不可能的 我搜索了一些答案 这似乎是最好的 甚至包括与此问
  • Visual Studio C++ 2010 中的自动创建实现[重复]

    这个问题在这里已经有答案了 我想知道是否有一种方法可以编写完整的头文件并让 Visual Studio 创建适当的实现文件来节省所有额外的工作 我觉得他们一定想到了 因为这是一个如此简单的事情 但我在任何地方都找不到它 CodeWiz ht
  • 在Visual Studio中查看xml文件时如何获取某个节点的xpath?

    当我在 Visual Studio 中打开 xml 文件并浏览它时 我想获取光标处某个节点的 xpath 例如右键单击并选择 从该节点获取 xpath 或类似的内容 我们如何在 Visual Studio 2010 中做到这一点 或者使用哪
  • bootstrap,带下拉菜单的工具提示,在按钮组中似乎有效果

    在引导程序中 带有下拉菜单的工具提示 当我将鼠标悬停在负责工具提示的按钮上时 附加到按钮组中一个按钮的悬停数据切换似乎会产生效果 然后它还会调整其看起来不太好的位置 请帮我 这是我的代码
  • 创建数据透视表时VBA运行时错误5

    我搜索了互联网代码 并能够组合一个宏来通过 VBA 创建数据透视表 当创建数据透视表缓存时 我不断收到运行时错误 5 无效的过程调用或参数 Set myPivotTable ThisWorkbook PivotCaches Create S
  • 如何将值推入 jsonb 列中的 key[] 中?

    我有这样的jsonbPostgres 表中的结构 res 123 223 我想将价值观推向res 大批 我不知道数组中有多少个值jsonb insert在位置上操作 所以我尝试了 1位置 select jsonb insert res 12
  • 如何使用 Spring ROO 访问第三方 API(例如:Facebook、Linkedin、Twitter)

    我正在尝试使用 Spring ROO 访问第三方 API 例如 Facebook Linkedin Twitter 可以使用 Spring ROO 来做吗 如果可能的话 请帮助我 我该怎么做 谢谢 穆尼 如果您专门针对社交网络集成 您可以轻
  • ASP.NET MVC - 根据 Active Directory 对用户进行身份验证,但需要输入用户名和密码

    我正在开发一个 MVC3 应用程序 该应用程序需要根据 AD 对用户进行身份验证 我知道 MVC3 中有一个选项可以创建一个 Intranet 应用程序 该应用程序自动根据 AD 对用户进行身份验证 但它使用 Windows 身份验证并自动
  • 如何在 VB6 中重新初始化 UDT?

    我有一个循环 它读取一堆 XML 文件 对于每个文件 它验证 XML 中的数据并将其加载到一些 UDT 中 然后对数据进行一些处理 然后它返回到循环的开头 并且 UDT 中仍然包含先前 XML 中的数据 如果在新标签中定义了该标签 则会覆盖
  • docker-compose 重启间隔

    我有一个docker compose yml文件包含以下内容 services kafka listener build command bundle exec kafka foreground restart always other s
  • 更新与更新地点

    我有一个包含很多行的表 我定期想将其中的一列设置为0使用 cron 什么更快 更少的内存消耗 做UPDATE在所有行上 即没有WHERE条款 或做一个UPDATE only WHERE mycolumn 0 正如在原始帖子的评论中注意到的那
  • 在调用者的返回序列中跳过函数

    在一系列函数调用中 例如 main gt A gt B gt C 当被调用函数完成时 它通常返回到调用函数 例如C 返回到B 这将返回到A etc 我想知道是否也可以直接返回到调用序列中较早的函数 所以C 还给main 并跳过B and A