В частности, я хотел бы знать, что GCC предлагает, если таковые имеются, о том, как код, который генерирует исключения, ведет себя при соединении с кодом, скомпилированным с помощью -fno-exceptions.
В руководстве GNU libstdc++ говорится следующее здесь.
Прежде чем подробно описать поддержку библиотеки для
-fno-exceptions, сначала обратите внимание на вещи, потерянные при использовании этого флага: они будут разбивать исключения, пытаясь передать код, скомпилированный с помощью-fno-exceptions, имеет ли этот код какой-либоtryилиcatch. Если у вас есть код, который бросает, вы не должны использовать-fno-exceptions. Если у вас есть код, который используетtryилиcatch, вы не должны использовать-fno-exceptions.
Это звучит как выражение в строках: "Ты не должен..." I.e. undefined.
С другой стороны, мое впечатление от этого SO-вопроса заключается в том, что все кошерно, пока код, скомпилированный с -fno-exceptions, не throw, try или catch (очевидно, ошибка времени компиляции), а исключения не распространяются через функции из этой библиотеки. И это имеет смысл: почему библиотека, скомпилированная с помощью -fno-exceptions, заботится о том, чтобы исключения были выброшены до тех пор, пока они не взаимодействуют со своими функциями?
Я немного потрудился и обнаружил, что если я скомпилирую простую программу с использованием GCC 7.1.1, в которой один исходный файл скомпилирован с помощью -fno-exceptions, а другой выбрасывает исключение, все компилирует, связывает и работает отлично, Но это не означает, что это поведение гарантировано; он все равно может быть undefined.
Моя мотивация во всем этом заключается в том, что у меня есть ситуация, когда я связываю свой собственный код приложения с библиотекой, построенной с помощью -fno-exceptions, и, в зависимости от того, какие вызовы функций сделаны в упомянутой библиотеке, выбрасывает исключение в мой собственный код вызывает немедленное segfault, даже если это исключение не распространяется через библиотечные функции. Мне кажется, что это ошибка в библиотеке, но я подумал, что, возможно, это было разрешено, когда во время компиляции был передан -fno-exceptions.
GCC фактическая ссылка на флагов генерации кода упоминает -fexceptions относительно кратко и не отвечает на мой вопрос. Кто-нибудь знает другую ссылку/имеет соответствующий опыт?
Обновление: Я перестроил библиотеку из источника, на этот раз с включенной поддержкой исключения. Segfault сохраняется! Время для отчета об ошибке.