setjmp и опустить указатель кадра

Я пытался отследить периодически возникающую ошибку сбоя в моем коде (которая использует setjmp) и сузил ее до: появляется при компиляции с / O2, исчезает с / O2 / Oy-, т.е. отображается только при отсутствии указателя кадра.

http://msdn.microsoft.com/en-us/library/2kxx5t2c (v = vs.80) .aspx предполагает, что для setjmp требуется кадр указатель. Таким образом:

  1. Кажется, что когда программа, использующая setjmp, компилируется с / O2, Visual C ++ автоматически генерирует код, который вызывает периодическое повреждение стека. Это правда, или я что-то упустил?

  2. Мне кажется, что только функция, которая вызывает setjmp, должна быть скомпилирована с указателем кадра, остальная часть программы - даже функции, которые вызывают longjmp - должны быть в порядке для опустить указатель кадра. Это правда?

Изменить: I ' ve немного сузил его.

Включение указателя кадра для функции, которая вызывала setjmp, не имело никакого значения, но это потому, что компилятор уже делал это, как и должен, очевидно замечая, что это необходимо сделать, и выполнял это автоматически.

Что действительно имело значение, так это включение указателя фрейма на main. Это не так странно, как может показаться, поскольку сбой произошел в ответ из main. Теперь, когда я думаю об этом, все примеры, которые я могу найти в быстром поиске в Google использования setjmp, сделайте это в основном. Возможно, так случилось, что команда компиляторов Microsoft проверила его только таким образом.

Это идиоматический способ его использования, и, возможно, лучшим обходным решением для меня было бы просто встроить функцию setjmp-using в main.

5
задан rwallace 4 May 2011 в 18:39
поделиться