首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >setjmp/longjmp失败

setjmp/longjmp失败
EN

Stack Overflow用户
提问于 2012-06-21 13:54:03
回答 3查看 1.8K关注 0票数 0

这里有一段代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jmp_buf mark;
int Sub_Func()  
{  
    int be_modify, jmpret;    
    be_modify = 0;    
    jmpret = setjmp( mark );  
    if( jmpret == 0 )  
    {  
        // sth else here 
    }  
    else  
    {  
        // error handle 
        switch (jmpret)  
        {  
            case 1:  
                printf( "Error 1\n");  
                break;  
            case 2:  
                printf( "Error 2\n");  
                break;  
            case 3:  
                printf( "Error 3\n");  
                break;  
            default :  
                printf( "Unknown Error");  
                break;  
        }  
        printf("after switch\n");        
    }     
    return jmpret;  
}  

void main( void )  
{  
    Sub_Func();   
    // the longjmp after setjmp
    longjmp(mark, 1);  
}  

结果是:

错误1

切换后

分段故障

我知道原因可能是longjmp跳回到以前的堆栈。但我不确定细节,以及'mark‘中存储了什么样的值,有谁能解释一下吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-21 13:57:11

setjmp()longjmp()通过记录堆栈帧位置来工作。如果您在Sub_Func()中记录了堆栈帧,但在调用longjmp()之前从函数返回,则堆栈帧将不再有效。在与setjmp()相同的函数中调用longjmp() (子函数也可以)。

票数 3
EN

Stack Overflow用户

发布于 2012-06-21 13:59:03

您正在尝试返回到更深层次的函数。您只能将longjmp返回到较浅的函数。

因此,如果A调用setjmp,然后调用B,那么B可以longjmp回A。

但是如果A调用b,B调用setjmp,B返回到A,则A不能 longjmp回到B。

票数 2
EN

Stack Overflow用户

发布于 2012-06-21 14:15:43

您通过违反以下规则(7.13.2.1)调用了未定义的行为:

longjmp函数

使用相应的jmp_buf参数恢复在同一程序调用中最近一次调用setjmp宏所保存的环境。如果没有这样的调用,或者如果包含对SetJMP宏的调用的函数在过渡期间终止了execution217),或者如果对SetJMP宏的调用在具有可变修改的类型的标识符的范围内并且在过渡期间执行离开了该范围,则行为是未定义的。

217),例如通过执行返回语句,或者因为另一个longjmp _ or调用已经导致转移到嵌套调用集合中较早的函数中的setjmp调用。

简而言之,在已经返回的函数中,不能使用longjmp跳转到setjmp点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11139744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文