setjmp / longjmp в x86_64-w64-mingw32

Некоторое время назад было известно, что setjmp / longjmp в mingw-w64 не работает (http://www.agardner.me/golang/windows/cgo/64-bit/setjmp/longjmp/2016/02/29/go-windows-setjmp-x86.html).

У нас есть унаследованный код, который мы использовали для запуска в 32-битной Linux и 32-битной Windows, который (по-прежнему) отлично работает. 64-разрядная версия Linux также работает нормально, но 64-разрядная версия Windows перестает работать после первого возврата longjmp в папку setjmp.

Я получаю segfault где-то в msvcrt! _Setjmpex, msvcrt! RtlUnwindEx.

Я изучил код и сначала не заметил нарушений правил, определенных для setjmp / longjmp стандартами C (99/11) в нашем коде. Обходной путь, описанный выше («используйте встроенные команды gcc»), также не работает для меня.

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

Итак, вопрос здесь в основном, известно ли, что setjmp / longjmp в mingw-w64 (все еще) сломан?


person dbrank0    schedule 10.12.2018    source источник
comment
Вы можете получить лучшую помощь от каналов проекта MinGWin. Я не уверен, насколько хорошо используется или отслеживается их средство отслеживания проблем, но есть is открытая проблема, предполагающая, что их setjmp / longjmp реализации могут по-прежнему давать сбой при определенных обстоятельствах.   -  person John Bollinger    schedule 10.12.2018
comment
Решил проблему. setjmp / longjmp не работает, но обходной путь со встроенными версиями gcc работает, при условии, что кто-то использует его повсюду. (Я их по ошибке перепутал).   -  person dbrank0    schedule 12.12.2018
comment
Итак, что мне делать с этим вопросом? Удалите это? Проголосовать за закрытие? Ответить сам и принять ответ?   -  person dbrank0    schedule 12.12.2018
comment
Нет смысла голосовать за закрытие собственного вопроса, кроме как, возможно, в качестве обмана (но, конечно, только в том случае, если это один из них). Если вы готовы написать самостоятельный ответ, это вполне приемлемо и потенциально ценно. В противном случае я рекомендую удалить вопрос.   -  person John Bollinger    schedule 12.12.2018


Ответы (1)


Да, похоже, setjmp / longjmp все еще не работает для некоторого кода, скомпилированного с помощью компилятора x86_64-w64-mingw32. Это работает для более простого тестового случая, я попытался воспроизвести проблему с. Поэтому, если вы столкнетесь с этой проблемой longjmp / setjmp, попробуйте вместо этого использовать __builtin_setjmp и __builtin_longjmp (как объяснено здесь).

Моя ошибка заключалась в переопределении макросов longjmp / setjmp, поэтому я мог выбрать, какую версию использовать, простым определением, но не смог сделать это везде. Это заставило скомпилированную программу использовать как встроенную, так и библиотечную версии, которые несовместимы.

person dbrank0    schedule 12.12.2018