繁体   English   中英

有没有办法在C中为函数设置返回地址

[英]Is there a way to set a return address for a function in C

所以我知道__builtin_return_address(0)将显示返回地址是什么,但我想知道是否有办法手动设置它。 C 或任何其他编程语言是否支持这种功能? 我试过在网上搜索它,但我找不到太多。

谢谢!

有一种方法,但它很复杂。 您需要使用setjmplongjmp并且需要注意返回点发生的情况,否则会创建无限循环。

PS 注意,如果你longjmp到另一个函数而不是main() ,你不能使用它的返回类型,但必须使用stdlib.hexit()函数或longjmp到另一个有效位置

PPS 另一个有趣的功能,您可能也会喜欢所谓的“标签作为值”: https : //gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>

jmp_buf env_a, env_b;

typedef enum _returntype{
    RETURN_A,
    RETURN_B
} RETURNTYPE;

void function(RETURNTYPE r){
    switch(r){
        case RETURN_A :
            longjmp(env_a, 1);
        case RETURN_B :
            longjmp(env_b, 1);
    }
    exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]){
    char character = 'A';
       
    if(setjmp(env_a) != 0){
        printf("returned from env_a, character=%c\n", character);
        goto END;
    }
    
    character = 'B';
    
    if(setjmp(env_b) != 0){
        printf("returned from env_b, character=%c\n", character);
        goto END;
    }
    
    function(RETURN_A); /* or you might use function(RETURN_B); */
    
    END:
    return EXIT_SUCCESS;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM