【发布时间】:2015-08-27 21:13:58
【问题描述】:
在本问答中,您应始终致电va_end():
What exactly is va_end for? Is it always necessary to call it?
但是如果一段代码 longjmp 在你到达 va_end 之前呢? va_end 是否有任何保证会好起来的承诺?或者从概念上讲,它 (例如) 是否会在 va_start() 中分配内存,这会泄露,而不是仅使用堆栈技巧?
【问题讨论】:
-
我想你需要在调用
longjmp之前调用va_end,就像你应该free()跳过任何错误分配一样 -
这不是问题的重点吗?
-
@WeatherVane 是的。问题是如果您处理每个参数项的操作可以 longjmp 怎么办。如果是这样,那么您必须先获取变量 args 并将它们放在另一个地方,然后再进行调用……但是在什么地方?可能是具有大小限制的有界堆栈数组。如果 va_args 已经可以用作那个地方会很好......并且在实际实现中,它通常是。但标准不太可能承诺这一点。
-
@supercat 我在嵌入式系统中也使用了一种残酷的方法作为最后的手段,当所有其他方法都失败但节目必须继续时,它使你提到的部分重启,没有任何悬空。跨度>
-
@supercat 在有或没有多任务的嵌入式系统中我发现最好的方法是一个由计时器驱动的中间“心跳”层,它将服务来自中断的信息并将其呈现给“主循环”确实如此,尽管这是一个简化的陈述。处理错误的最佳方法是将它们从中断作为状态值传递,或者从子程序作为返回值传递。我将跳远视为软件等效于短路。如果一切都失败了,就相当于重置按钮。如果你设计长跳转到基于堆栈的系统,因为你可以,你可耻。
标签: c language-lawyer c89 setjmp variadic-functions