Я пытался отследить случайную ошибку в моем коде (которая использует setjmp) и сузил ее до: появляется при компиляции с / O2, уходит с / O2 / Oy-, т.е. только показываетup с отсутствующим указателем кадра.
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspx предполагает, что setjmp требует указателя кадра.Таким образом:
Кажется, что когда программа, использующая setjmp, скомпилирована с / O2, Visual C ++ автоматически генерирует код, который вызывает прерывистое повреждение стека.Это правда, или я что-то упустил?
Мне кажется, что только функция, которая вызывает setjmp, должна быть скомпилирована с указателем кадра, остальная часть программы - дажефункции, которые вызывают longjmp - должны быть в порядке, чтобы пропустить указатель кадра.Это правда?
Редактировать: Я сузил это немного дальше.
Включение указателя кадра на функцию, которая вызывала setjmpничего не изменило, но это потому, что компилятор уже делал это, как и положено, явно замечая, что это нужно сделать, и делая это автоматически.
Разница была в том, что включил указатель кадра на main.Это не так странно, как кажется, так как сбой проявлялся взамен основного.Теперь, когда я думаю об этом, все примеры, которые я могу найти в быстром поиске Google использования setjmp, делают это в основном.Возможно, так получилось, что команда компиляторов Microsoft проверила его только таким образом.
Поскольку это идиоматический способ его использования, возможно, лучшим обходным решением для меня было бы просто встроить функцию setjmp-using в main.