小编Iva*_*anB的帖子

GCC - 修改函数返回后继续执行的位置

是否可以在GCC中做这样的事情?

void foo() {
    if (something()) returnSomewhereElse;
    else return;
}

void bar() {
    foo();
    return; // something failed, no point of continuing
    somewhereElse:
    // execution resumes here if something succeeds
    // ...
}
Run Code Online (Sandbox Code Playgroud)
  • 这可以通过C和GCC扩展以便携方式实现,而无需使用平台特定组件吗?
  • 堆栈状态在正常返回点和更改的返回点之间不会改变,那么是否可以重用恢复堆栈的代码并从常规返回中注册状态?
  • 考虑到函数可能会或可能不会内联,如果调用它必须改变返回地址,如果内联它只能改变代码路径而不是当前函数返回地址,因为这会破坏代码
  • 备用返回点不需要是标签,但我希望GCC的标签扩展地址在这种情况下可以派上用场

只是为了澄清意图 - 它是关于错误处理.这个例子是一个最小的例子,只是为了说明事情.我打算在更深层次的上下文中使用它,以便在发生错误时停止执行.我还假设状态没有改变,我可能错了,因为在两个返回点之间没有添加额外的局部变量,所以我希望编译器生成的代码在foo的返回时可以重用为此节省了使用longjmp,设置和传递跳转缓冲区的开销.

这个例子"确实有意义",因为它的目的是展示我想要实现的目标,而不是为什么以及如何在实际代码中有意义.

为什么你的想法更简单,只需从foo()返回一个值并让bar()返回或执行somewhereElse:conditionally?

它并不简单,你所建议的不适用于实践,只是在一个简单的例子的背景下,但它更好,因为:

1 - 它不涉及额外返回值

2 - 它不涉及额外检查值

3 - 它不涉及额外的跳跃

我可能错误地认为目标应该在这一点上清楚,并且在所有澄清和解释之后.我们的想法是从深度调用链中提供"转义代码路径",而无需任何额外开销.通过重用编译器生成的代码来恢复前一个调用帧的状态,并简单地修改函数返回后执行恢复的指令.成功跳过"转义代码路径",发生的第一个错误进入它.

if (failure) return; // right into the escape code path
else {
    doMagickHere(); // to skip the escape code path
    return; // skip over the …
Run Code Online (Sandbox Code Playgroud)

c gcc return memory-address gcc-extensions

-25
推荐指数
1
解决办法
1134
查看次数

标签 统计

c ×1

gcc ×1

gcc-extensions ×1

memory-address ×1

return ×1