Почему эта программа setjmp печатает 5?

Следующий код просто заканчивает тем, что печатал «5»

#include <iostream>
#include <setjmp.h>

static jmp_buf buf;

float funcB()
{
setjmp(buf);
return 1.6f;
}

int funcA()
{
longjmp(buf,5);
std::cout<<"b";
return 2;
}

int main()
{
funcB();
std::cout<<funcA();
}

Но это не имеет никакого смысла, так как setjmp возвращает 5, а не функцию …
Не волнуйтесь, я нигде не использую этот код, мне просто любопытно!

3

Решение

То, что вы пытаетесь сделать, определено как неопределенное поведение в документация:

longjmp() функция восстанавливает среду, сохраненную последним вызовом setjmp() в той же теме, с соответствующим jmp_buf аргумент. Если такого вызова нет, или если функция, содержащая вызов setjmp() прекратил исполнение в промежуточный период, поведение не определено.

Так как функция, которая называется setjmp (Т.е. funcB) вышел, прежде чем позвонить longjmp в funcAповедение не определено (он падает на ideone).

3

Другие решения

Вы не можете использовать longjmp для возврата к функции, которую вы вышли. Другими словами, longjmp не восстановит для вас стек. Увидеть Вот.

То, что вам нужно, это схема, похожая на язык, где такие вещи были бы совершенно нормальными.

1

Похоже, какой бы компилятор вы не использовали, он использует строгую интерпретацию того, что setjmp а также longjmp делать:

Этот макрос может возвращаться более одного раза: первый раз по прямой
призывание; В этом случае он всегда возвращает ноль. Когда longjmp
вызывается с информацией, установленной в env, макрос возвращается снова; этот
время он возвращает значение, переданное longjmp в качестве второго аргумента, если это
отличается от нуля или 1, если это ноль.

От Вот

Поскольку это UB, он может сделать это, заказать пиццу, покончить с миром … все будет в силе.

0
По вопросам рекламы [email protected]