В частности, я хотел бы знать, что 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 сохраняется! Время для отчета об ошибке.