深堆栈展开

时间:2015-01-02 08:46:16

标签: c stack-unwinding longjmp

首先,这绝对是关于C的,不需要C ++解决方案。

目标: 返回多个堆栈帧之外的调用函数(A)。

我有一些解决方案,但没有一种感觉是最好的选择。

实现意义上最简单的是longjmp / setjmp,但我不确定 如果它破坏了自动变量,因为正如维基所指,没有正常的堆栈展开 如果执行longjmp则参加。

以下是程序流程的简短说明: A函数调用file processing函数,这导致许多内部函数 和递归调用。在某些时候,文件阅读器符合EOF,所以工作 file processing已完成,应对A函数进行控制。

将每个阅读角色与EOF或'\ 0'进行比较?不用了,谢谢。 UPD:我可以避免在setjmp和longjmp之间的调用链中进行动态分配。

不确定自动变量,我不知道顺序调用会发生什么 到file processing(有超过1个文件)。

所以:

1)关于longjmp的'没有堆栈展开'是什么意思?如果我得到所有的话,那会有多大的危险 数据持有者可用(指针)。

2)回到A框架的其他简洁有效的方法?

1 个答案:

答案 0 :(得分:3)

我不知道你在某处读到了什么,但setjmp/longjmp正是预见到的任务工具。

longjmp重新建立"堆栈"正如调用setjmp所做的那样,完全(很好),对#34;堆栈的所有修改"在两者之间完成的工作将丢失,包括已定义的所有auto变量。这种堆栈的重建是蛮横的,在C中没有析构函数的概念,这可能意味着"没有堆栈展开"。

我把" stack"在引号中,因为这不是C标准适用的术语,它只涉及状态,并允许这样组织它对实现的满意程度。

现在,您可以在setjmplongjmp之间保留的唯一信息是:

  • 您传递给longjmp
  • 的值
  • 您在volatile
  • 之前定义的已修改setjmp个对象的值

因此,在你从longjmp回来的分支中,你必须使用这个(并且只有这个)信息来清理你的混乱:关闭文件,你free等的malloced个对象

相关问题