следующий код:
- Работает нормально при компиляции с gcc версии 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5 / 32bits)
- Работает нормально при компиляции с MSVC10 (Win7 / 32bit)
- Сбои при работе с gcc версии 4.5.2 (MinGW на Win7 / 32bit)
main.cpp :
# include <iostream>
# include <csetjmp>
# include <stdexcept>
using namespace std ;
void do_work(jmp_buf context)
{
try
{
throw runtime_error("Ouch !") ;
}
catch(exception & e)
{
}
longjmp(context, -1) ; //BP1
}
int main(int, char *[])
{
jmp_buf context ;
try
{
if( setjmp(context) != 0 )
{
throw runtime_error("Oops !") ; //BP2
}
do_work(context) ;
}
catch(exception & e)
{
cout << "Caught an exception saying : " << e.what() << endl ;
}
}
Я попытался отладить его, но программа ведет себя странно. Иногда я мог преодолеть первую точку останова (BP1), затем потерпеть крах в BP2, а иногда управление никогда не достигнет BP1, как если бы программа застряла в бесконечном цикле. Я не могу сказать больше с моими навыками отладки.
Этот код - минимальный, который я мог получить, который демонстрирует странное поведение с MinGW 4.5. Я также заметил, что:
- Если я заменю вызов функции
do_work
ее содержимым, программа будет работать нормально.
- Если я удаляю блок
try{ ... } catch(...){ }
внутри do_work
, программа работает нормально.
- Флаги оптимизации не действуют (всегда сбой).
Мне известны проблемы setjmp/longjmp
в коде C ++, но я вынужден использовать его для взаимодействия с некоторым устаревшим кодом C.
Мой вопрос:
- Это неисправный / ошибочный / ошибочный код? Или MinGW 4.5 неправильно обрабатывает код? (Винить инструмент довольно грубо и самонадеянно, но я подозреваю, что в нем есть некоторые настройки).
Спасибо за любой совет.
Пожалуйста, при необходимости измените метку.