Должен ли я вызывать longjmp после setjmp

В справочной странице на longjmp а также setjmpесть эта строка:

Если функция, которая называется setjmp() возвращается до longjmp() называется, поведение не определено.

Означает ли это, что я на самом деле должен позвонить longjmp где-то в функции, которая называется setjmp или во вложенной функции? Или это нормально, чтобы вообще не звонить?

1 ответ

Решение

Вы неправильно читаете.

Если функция, вызвавшая setjmp(), возвращается до вызова longjmp(), поведение не определено.

Поведение longjmp не определено, если вы вызываете его после того, как вы вернулись из функции, которая установила setjmp, Но совершенно нормально не звонить longjmp совсем.

Википедия понятнее:

Если функция, в которой был вызван setjmp, вернулась, то больше невозможно безопасно использовать longjmp с соответствующим объектом jmp_buf.

Это связано с тем, что кадр стека становится недействительным при возврате функции. Вызов longjmp восстанавливает указатель стека, который - поскольку возвращенная функция - будет указывать на несуществующий и потенциально перезаписанный или поврежденный кадр стека.

Эти функции часто используются для обработки механизмов исключений. Если исключение не происходит, вы не хотите звонить longjmp потому что нет причин "перематывать" вашу программу.

Другие вопросы по тегам