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