Должен ли я вызывать longjmp после setjmp
В справочной странице на longjmp
а также setjmp
есть эта строка:
Если функция, которая называется
setjmp()
возвращается доlongjmp()
называется, поведение не определено.
Означает ли это, что я на самом деле должен позвонить longjmp
где-то в функции, которая называется setjmp
или во вложенной функции? Или это нормально, чтобы вообще не звонить?
1 ответ
Вы неправильно читаете.
Если функция, вызвавшая setjmp(), возвращается до вызова longjmp(), поведение не определено.
Поведение longjmp
не определено, если вы вызываете его после того, как вы вернулись из функции, которая установила setjmp
, Но совершенно нормально не звонить longjmp
совсем.
Википедия понятнее:
Если функция, в которой был вызван setjmp, вернулась, то больше невозможно безопасно использовать longjmp с соответствующим объектом jmp_buf.
Это связано с тем, что кадр стека становится недействительным при возврате функции. Вызов longjmp восстанавливает указатель стека, который - поскольку возвращенная функция - будет указывать на несуществующий и потенциально перезаписанный или поврежденный кадр стека.
Эти функции часто используются для обработки механизмов исключений. Если исключение не происходит, вы не хотите звонить longjmp
потому что нет причин "перематывать" вашу программу.