Компиляторы обнаруживают случаи неопределённого поведения при использовании нелокальных переходов, в частности setjmp и longjmp, следующим образом: cyberleninka.ru www.mathnet.ru
- Выявляют возможную перезапись переменных. cyberleninka.ru Компилятор может оптимизировать доступ к переменным, размещая их в регистрах. cyberleninka.ru А longjmp восстанавливает значения регистров вместе с указателем на стек и счётчиком команд. cyberleninka.ru При выполнении некоторых условий значение переменной с автоматическим классом памяти после longjmp будет иметь неопределённое значение. cyberleninka.ru Это значение зависит от размещения компилятором переменной в ходе оптимизаций. cyberleninka.ru
- Выявляют условия возникновения неопределённого значения после вызова longjmp: cyberleninka.ru
- Выдают предупреждение, если соблюдены эти условия и неопределённое значение переменной читается после вызова longjmp. cyberleninka.ru
Чтобы устранить неопределённое поведение без изменения общей логики программы, рекомендуется объявить такую переменную как volatile. cyberleninka.ru Компилятор гарантирует не оптимизировать доступ к volatile переменной, то есть каждое чтение и запись такой переменной будут выполняться непосредственно из памяти, а не из регистра процессора. cyberleninka.ru