繁体   English   中英

NetBeans cygwin Windows XP下的setjmp longjmp崩溃

[英]setjmp longjmp crash under Netbeans cygwin Windows XP

以下是普渡大学CS课上给出的示例代码。 为了调试,我对原始文件所做的更改很少。 您可以在https://www.cs.purdue.edu/homes/cs240/lectures/Lecture-19.pdf上查看原始代码。 我所面临的问题在代码段下面进行了描述。

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

int a(char* str, jmp_buf aenv) {
    int i;
    i = setjmp(aenv);
    // i ++; i--;
    printf("In func a: str = %s, i=%d\n", str, i);      #crash causing printf
    return i;
}
int b(int j, jmp_buf benv) {
    printf("In func b: j= %d\n",j);
    longjmp(benv, j);      # segfault crash happens here, only if printf is present
}
int main(int argc, char** argv) {
    jmp_buf main_env;
    char *arr;
    arr = (char*) malloc(100);
    strcpy(arr, "As if called From main");
    if  ( a(arr, main_env)) {
        printf("In main: a() returned non-zero\n"); 
        exit(EXIT_SUCCESS);
    }
    b(3, main_env);
    int i=1;
    i++;
    printf("In main: end \n");
    return (EXIT_SUCCESS);
}

该平台是Windows XP中的Netbeans IDE 7.3和cygwin 1.7(最新)。 当我运行此程序时,输出为

      In func a: str = As if called From main, i=0
      In func b: j= 3

当我逐步通过调试器时,我在调用longjmp()时看到崩溃。 该程序运行,但是如果我在函数a()中删除了printf,则会在调试器中产生意外行为。 如果我删除printf并运行程序,则没有崩溃,输出为

      In func b: j= 
      In main: end

我已经在网上阅读了一些有关setjmp / longjmp的文档,并且我是专业人士。 我的期望是对longjmp()的调用将把程序状态和执行带到setjmp中,后者在另一个函数中。 此函数a(),应将3返回到main。 因此,main()中的if条件为TRUE,我应该看到打印输出说“在main中:a()返回非零”。 根据我对setjmp / longjmp的理解,我没想到会输出“ In main:end”,因为控制永远不会到达那里。

我怀疑这可能是调试器问题,因为当我单步执行程序时(在函数a()中没有printf),调试器以预期的方式达到了longjmp。 当执行longjmp时,调试器不会在任何地方停止-它仅显示“ In main:end”,程序终止。 我在main()中引入了i ++,以查看调试器是否会在打印之前在该点停止。 但是,当进入longjmp()时,Netbeans不会在那里停下来,整个程序很快就会完成。

这种行为的原因是什么? 在第一种情况下(当函数a()中存在printf时)发生段错误是什么原因? 堆栈是否以指针'str'混乱的方式展开? 为什么呢 如果任何人都可以访问UNIX计算机,我希望查看该系统和程序行为的输出。 感谢您的意见。

©ISO / IEC ISO / IEC 9899:201x编程语言-C

7.13.2.1 longjmp函数

2如果包含setjmp宏的调用的函数在此期间终止了执行,则longjmp函数将在与相应的jmp_buf参数相同的程序调用中恢复由setjmp宏的最新调用保存的环境。行为是不确定的。

由于a()已终止执行,因此在b()使用longjmp()是错误的,因此C标准没有任何行为上的要求,并且程序可以崩溃。

暂无
暂无

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

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