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