[longjmp / setjmp] c ++ тот же код windows получил исключение linux без ошибок и хорошо работает - PullRequest
0 голосов
/ 19 января 2020

代码 (код)

#include <csetjmp>
#include <iostream>
using namespace std;

jmp_buf jb1;
jmp_buf jb2;

auto bar() {
  if (setjmp(jb2) == 0) {
    longjmp(jb1, 1);
  } else {
    longjmp(jb1, 2);
  }
}

void foo() {
  bar();
}

void testjmp() {
  auto i = setjmp(jb1);
  if (i == 0) {
    foo();
  } else {
    cout << "i = " << i << endl;
  }

  i = setjmp(jb1);
  if (i == 0) {
    longjmp(jb2, -1);
  } else {
    cout << "i = " << i << endl;
  }
}

int main() {
  testjmp();
  return 0;
} 

windows 结果 (результат окна)

окна 结果 (windows результат) 在 Windows 平台 下 结果 表现 。 异常。 Я получил исключение на windows платформе

linux 结果 (linux результат)

linux 结果 (linux результат) 在 Linux Runs 下 没有 任何 问题 Хорошо работает на linux платформа

1 Ответ

1 голос
/ 19 января 2020

ваш второй longjmp(jb2, -1); недопустим по смыслу, потому что вы пытаетесь использовать jmp для суммирования ниже , а затем current - обратно в bar (), стек которого уже перезаписан после того, как мы вернемся к testjmp(). это конечно ошибка. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}

и linux здесь делают неправильный или невыровненный стек при выполнении операции раскрутки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...